PWM output, DC motor toerental zweeft.

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 15
Geregistreerd: 14 Feb 2018, 11:52

Re: PWM output, DC motor toerental zweeft.

Berichtdoor estate » 16 Mei 2018, 00:03

Schema komt zsm, is deels zelf bedacht en deels van diverse sites geplukt :) ik heb echter momenteel weinig tijd, volgende week hoop ik wat meer lucht te hebben.

De voeding geeft bij een hoger toerental (dus meer vraag naar spanning) wel een constante stroom dus uw verklaring lijkt me vrij logisch, reden waarom ik van plan was om een voedingsprintje in elkaar te knutselen die via een accu gevoed wordt of een andere 12V voeding.
Ik heb nog wel wat oude voedingen en trafo's liggen dus dat moe lukken.

Voor zover ik nu kan beoordelen lijkt alles wel goed te moeten werken nu, zeker na de tips van Koepel waarvan ik enkele opgevolgt heb, maar ik kom er op terug, eerst een leuk weekend met de kleinzoon :)

Advertisement

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: PWM output, DC motor toerental zweeft.

Berichtdoor Koepel » 16 Mei 2018, 15:47

Voor het gebruik van millis() heb ik een klein voorbeeldje gemaakt: https://gist.github.com/Koepel/8dd3e8ad5d8628be21270fab1f5e9c1c.

Berichten: 15
Geregistreerd: 14 Feb 2018, 11:52

Re: PWM output, DC motor toerental zweeft.

Berichtdoor estate » 09 Jun 2018, 00:23

Beter laat dan nooit :(

Door enkele andere dingen toch wat vertraging opgelopen.

Ik blijf worstelen met het schommelende toerental maar als ik iets verder nadenk zou dat niet kunnen liggen aan de plaats in de code waar de berekening gedaan wordt om het toerental (dif_temp) plaatsvindt ?

Het lijkt er op dat er elke ... seconden een update komt en dus lijkt het mij dat het ergens op wacht tot dat gereed is ??

Inmiddels is de voeding voor het 12V deel vervangen door een andere (geen laptop) voeding die een constante stroom geeft (12V / 100 Watt / plm 8,5A dus)

En de code is nu als volgt:

Code:

/*
* PitRegelaar
* Bordje, Arduino NANO 168
* LiquidCrystal_I2C. Library version:1.1.2
*/

//---------- Declaraties ----------

//---------- MAX31855 Temp sensor ----------
#include <MAX31855.h>

int32_t rawData = 0;

/*
- for soft spi

MAX31855(cs, so, sck)

cs - chip select, if CS low serial interface is enabled
so - serial data output
sck - serial clock input
*/
MAX31855 myMAX31855(3, 4, 7); //for ESP8266 use D3, D4, D7
//-------------------------

//------- LCD 20x4 i2c --------------
//LiquidCrystal_I2C. Library version:1.12
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3f,20,4); // set the LCD address to 0x27 for a 20 chars and 4 line display
//----------------

//------- Fan declaraties ---------
volatile byte half_revolutions;
unsigned int rpm;
unsigned long timeold;
//---------------------------------

//------ Arduino Pin declaraties ---------

int fan = 11; // PWM output voor sturing Fan via Mosfet
int buzzer = 8; // ALARM
int greenLed = 6; // Systeem OK LED
int redLed = 5; // ALARM LED
int pot = A2; // Ingang potmeter temperatuur regeling


// -------- Std. Declaraties --------------
int Potvalue = 0.0; // Potmeter voor temp. instelling // was = 0
int calculatedValue= 0.0; // was = 0
int PotRange = 0.0; // was = 0
boolean manual;
int Temp = 0.0; // was = 0
int dif_temp = 0.0; // was = 0
//-----------------------------------------

// ----------- SETUP --------------
void setup() {


// *** Arduino PINOUT setup ***
pinMode(redLed, OUTPUT); // ALARM STATUS
pinMode(greenLed, OUTPUT); // Systeem OK
pinMode(buzzer, OUTPUT); // Alarmbuzzer
pinMode(pot, INPUT); // Ingang voor potmeter temperatuur instelling
pinMode(fan, OUTPUT); // Aansturing Fan (PWM output)

Serial.begin(115200);
// -----------------------------------

//--------- Setup MAX31855 -------------
{

/* start MAX31855 */
myMAX31855.begin();

while (myMAX31855.getChipID() != MAX31855_ID)
{
Serial.println("MAX6675 error");
delay(5000);
}
Serial.println("MAX6675 OK");
}
//---------------------------------------

//------------- LCD 20x4 i2c ------------
{
lcd.init(); // initialize the lcd
// Print startscherm naar LCD.
lcd.backlight();
lcd.setCursor(1,0);
lcd.print("SMOKER CONTROLLER");
lcd.setCursor(4,1);
lcd.print("Opstarten ...");
lcd.setCursor(1,2);
lcd.print("even geduld a.u.b.");
lcd.setCursor(5,3);
lcd.print("(c) 2018");
delay(5000);
lcd.clear();
}
//--------------------------------------
digitalWrite(greenLed, HIGH); // Systeem OK led
//------------- Hallsensor --------------
{
digitalWrite(2, HIGH);

//Serial.begin(9600);
attachInterrupt(0, rpm_fun, RISING);

half_revolutions = 0;
rpm = 0;
timeold = 0;
}
//-------------------------------------

//------------ MAX31855 ----------------------
{
while (myMAX31855.detectThermocouple() != MAX31855_THERMOCOUPLE_OK)
{
switch (myMAX31855.detectThermocouple())
{
case MAX31855_THERMOCOUPLE_SHORT_TO_VCC:
Serial.println("Thermocouple short to VCC");
break;
case MAX31855_THERMOCOUPLE_SHORT_TO_GND:
Serial.println("Thermocouple short to GND");
break;
case MAX31855_THERMOCOUPLE_NOT_CONNECTED:
Serial.println("Thermocouple not connected");
break;
case MAX31855_THERMOCOUPLE_UNKNOWN:
Serial.println("Thermocouple unknown error, check spi cable");
break;
}
delay(50);
}

}
//--------------------------------------------


} // void setup end


void loop() {

//---------------- MAX31855 --------------------
rawData = myMAX31855.readRawData();
Temp = int(myMAX31855.getTemperature(rawData));

//----------------------------------------------

//---------- Potmeterwaarde omzetten -----------
Potvalue = analogRead(pot);
//----------------------------------------------

/*
* Hieronder moet de routine komen voor het regelen van de fan en de snelheid van de fan
* De ingestelde potmeterwaarde is voor de gevraagde temperatuur
* De MAX31855 sensor moet de temperatuur lezen en weergeven
* De gelezen temperatuur moet vergeleken worden met de gevraagde temperatuur
* Als de temperatuur te laag is moet de fan gaan draaien
* De snelheid van de fan moet viam PWM worden geregeld op toerental (MOSFET) door de arduino
* Als het toerental en de temperatuur constant zijn is het evenwicht bereikt
* Rode LED en BUZZER moeten HIGH zijn als de Temperatuur te laag is
* Groene LED brand als alles goed werkt, aan/uit indicatie ?
* en op LCD moet een waarschuwing komen "HOUT BIJVULLEN" of zoiets
* Op de LCD moet de volgende info te zien zijn
* Ingestelde Temperatuur, Bereikte Temperatuur, Fan Speed, en het toerental van de Fan
* LED's, waarschuwingen enz. moeten tevens op Serial Monitor te lezen zijn.
*/


Serial.print("");
Serial.println("");
Serial.println("--- Pit Controller ---");


// Temperatuur instelling POTMETER
/*
//----------DEBUG----------
Serial.print("Potmeter instelling: ");
Serial.println(Potvalue);
Serial.print("Berekende POT waarde: ");
Serial.println(calculatedValue);
//-------------------------
*/

//----------CODE-----------
lcd.setCursor(0,1);
lcd.print("Doel : ");
lcd.print(calculatedValue); // moet berekende waarde van doe temperatuur zijn.
lcd.print(" C");
//-------------------------


// MAX31855 uitlezing
//---------DEBUG-----------
Serial.print("Temperatuur = ");
Serial.println(myMAX31855.getTemperature(rawData));
//-------------------------
//---------CODE------------
lcd.setCursor(0,0);
lcd.print("Temp. : ");
lcd.print(Temp);
//lcd.print(myMAX31855.getTemperature(rawData));
lcd.print(" C");
//-------------------------


//--------ALARM ROUTINE ---------------
//-----------CODE----------------------

if ((Temp) < 20) // Voor testen op testwaarde 20 graden instellen, standaard waarde = 80 of dif_Temp
{
Serial.println("Temp < 80 C, Smoker controleren");

//lcd.setCursor(6,2);
//lcd.print("ALARM !!!");
digitalWrite(redLed, HIGH);
digitalWrite(buzzer, HIGH); //Alarm, vuur is uit
tone(buzzer, 1000, 2000); // BUZZER tijdelijk uitgeschakeld in programma
digitalWrite(greenLed, LOW);
lcd.setCursor(0,3);
lcd.print("SMOKER CONTROLEREN !");
delay(500);
digitalWrite(redLed, LOW);
lcd.setCursor(0,3);
lcd.print(" ");

/*
//------------- DEBUG -------------------
Serial.print("ALARM !! , "); //DEBUG
Serial.print("Rode LED AAN , "); // DEBUG
Serial.print("Groene LED UIT , "); // DEBUG
// analogWrite(fan, 255); // functie fan max (MOSFET)
// --------------------------------------
*/

}

else
{
digitalWrite(greenLed, HIGH); // Systeem OK led
lcd.setCursor(4,3);
lcd.print("Systeem OK !");
}

//---------------------------------


// ------------- FanSpeed ---------
//-------------DEBUG-------------
//Serial.println("Fan speed uit HAL waarde Fan");
Serial.print("Fan snelheid : ");
Serial.print(rpm);
Serial.println(" rpm");
Serial.print("Dif_Temp");
Serial.print(dif_temp);
//-------------------------------
//-------------CODE--------------
lcd.setCursor(0,2);
lcd.print("Fan : ");
lcd.print(rpm); //Hier moet de waarde uit de HAL van de fan komen
lcd.print(" rpm ");
//-------------------------------


//-------- Fan Speed Calculatie -------------
calculatedValue = ((1020 - Potvalue) / 4);
//analogWrite(fan, calculatedValue);
PotRange = (calculatedValue);

dif_temp = ((calculatedValue - Temp)*1.6);

if (dif_temp < 0) dif_temp = 0; // was = 0
if (dif_temp > 255) dif_temp = 255; // was = 0

analogWrite(fan, dif_temp);
//analogWrite(fan, 100);

// ----------------------------------

rpm_speed(); // Ga naar void rpm-speed (subroutine)
}

//----------- Fan toerental weergeven -----------
void rpm_speed()
{
if (half_revolutions >= 20) {
//Update RPM elke 20 tellen, verhoog dee waarde voor een betere rpm resolutie,
//verlaag de waarde voor een snellere update
rpm = 30*1000/(millis() - timeold)*half_revolutions;
timeold = millis();
half_revolutions = 0; // Waarom wordt deze 2X gebruikt ?? eenmaal in setup en hier ??
//Serial.println(rpm);
}

}
//-----------------------------------------------

//-------------- Toerental HAL interupts ----------------

void rpm_fun()
{
half_revolutions++;
//Bij elke omwenteling, wordt deze interupt routine 2 keer uitgevoerd

}

//---------------- EINDE PROGRAMMA -------------------------------

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: PWM output, DC motor toerental zweeft.

Berichtdoor Koepel » 09 Jun 2018, 08:55

Kun je voortaan de sketch tussen code tags plaatsen ?
Er is een knop "Code" of anders "Select a Syntax" en dan "C++".
Je mag ook zelf de code tags typen: [ code ] en [ / code ] (maar dan zonder de spaties).

Je doet: int Temp = 0.0 ;
Dat klopt niet. Een 'float' kan 0.0 zijn en een 'int' kan 0 zijn.
Hetzelfde voor dif_temp.
https://www.arduino.cc/reference/en/language/variables/data-types/float/

Dit is nog steeds een merkwaardige constructie: dif_temp = ((calculatedValue - Temp) * 1.6)
Het zijn 'int', maar 1.6 is een floating point getal.
De compiler maakt er wel iets van, maar het is beter als jij de compiler verteld wat hij moet doen.

Je loop() draait op zichzelf zonder timing. Hoe vaak je loop() wordt uitgevoerd hangt van de code af.
Dus de fan snelheid wordt heel vaak opnieuw ingesteld, zonder dat je weet hoe vaak.

Hier ben ik niet zo blij mee: rpm = 30 * 1000 / (millis() - timeold) * half_revolutions
Door de deling raak je veel kwijt.
Je zou dat met 'unsigned long' kunnen doen en eerst vermenigvuldigen of anders met 'float'.

Ik stel voor om de gegevens van de seriële monitor te analyseren. Je kunt daarvoor misschien de MAX31855 even niet gebruiken en zelf een temperatuur ingeven.
Je stuurt eerst "dif_temp" naar de seriele monitor (dat is de vorige waarde), en daarna ga je de nieuwe "dif_temp" berekenen. Kun je dat anders doen ? Ik zou ook de "rpm_speed()" eerder aanroepen, zodat er een logisch verloop is tijdens de loop().

Het zou logischer zijn om de fan snelheid bijvoorbeeld één keer per seconde of één keer per 5 seconden te wijzigen. Of misschien zelfs 10 keer per seconde. Daar heb je dus millis() voor nodig.

Als dat allemaal werkt, dan gaat het er om of die berekening ook echt de fan snelheid gaat regelen. Ik kan zo niet zien of dat überhaupt werkt. Dan zou ik het moeten uitproberen.

Berichten: 15
Geregistreerd: 14 Feb 2018, 11:52

Re: PWM output, DC motor toerental zweeft.

Berichtdoor estate » 09 Jun 2018, 23:05

de code tussen tags plaatsen :) wist niet eens hoe dat moest, stom he :) maar ik zal er aan proberen te denken.

Als ik zelf een PWM waarde ingeef in plaats van de dif_temp dan blijft het toerental variëren, ik ga eens proberen de motor op puur en alleen de code voor de pwm aansturing te gebruiken misschien kom ik er dan achter of de nano dit wel juist regelt, ik zie anders niet waar ik het zou moeten zoeken.

Zoals gezegd ik ben een leek en alhoewel ik wel iets aan programmeren heb gedaan vroeger is dit toch een stuk moeilijker dan ik verwachtte :)

Gebruikers-avatar
Berichten: 270
Geregistreerd: 30 Dec 2012, 11:42

Re: PWM output, DC motor toerental zweeft.

Berichtdoor Rudi » 10 Jun 2018, 19:16

estate schreef:Voor de regeling van de motor gebruik ik een mosfet die tussen de nano en de motor hangt, een diode over +en- van de motor en een pullup om te voorkomen dat de nano uit elkaar barst.

Je hebt nog steeds geen schema getoond. Uit jouw zin leid ik af dat je de gate van de mosfet rechtstreeks aan een pwm pin hebt hangen en ook nog eens met een pullup aan de +5V? Beetje raar voor een N-channel MOSFET. Gebruikelijk is een weerstand van 220 ohm tussen pwm pin en de gate van de mosfet te plaatsen en bovendien een 10K weerstand tussen gate en gnd (pulldown).
Ook kunnen mosfets al eens ongewenst oscilleren met bizar gedrag als gevolg. Een oscilloscoop geeft dan uitsluitsel.

Al denk ik eerder dat de IRFI530N is geen geschikte mosfet is. Gebruik een logic level mosfet als je die met 5V wil aansturen.
Arduinows!
Why do computer programmers confuse Halloween with Christmas? Because Oct 31 = Dec 25
I got 01100011 problems but a bit ain't 00000001

Berichten: 15
Geregistreerd: 14 Feb 2018, 11:52

Re: PWM output, DC motor toerental zweeft.

Berichtdoor estate » 11 Jun 2018, 22:25

@ Rudi,

Schema wordt aan gewerkt :)

Berichten: 15
Geregistreerd: 14 Feb 2018, 11:52

Re: PWM output, DC motor toerental zweeft.

Berichtdoor estate » 11 Jun 2018, 22:51

Hopelijk kunnen jullie hier iets meer mee :)
Het is uiteindelijk de bedoeling hier een printje in 5-voud van te laten maken als alles goed werkt om te gebruiken voor de uiteindelijke toepassing :)
Bijlagen
PitController_schema-480hoog.jpg
PitController_schema-480hoog.jpg (58.51 KiB) 7084 keer bekeken

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: PWM output, DC motor toerental zweeft.

Berichtdoor Koepel » 13 Jun 2018, 19:42

Uhm... nee, het is te klein. Probeer om alles gewoon rechtop te zetten en gebruik een GND-symbool. Het is misschien verleidelijk om te proberen om het op een klein stukje te proppen, maar gebruik gerust meer ruimte.
Welke mosfet gebruik je ? Je leds staan verkeerd om.

Jouw sketch heb ik voor mezelf geprobeerd om duidelijker te maken, maar het is me niet gelukt.
Je hebt de afzonderlijke brokjes met commentaar aangegeven, maar in het grote geheel is er te weinig structuur. De afzonderlijke brokjes lijken zomaar willekeurig ergens geplaatst te zijn.
Volgens mij is het nodig om de loop() om te bouwen.
Bijvoorbeeld iets wat een beetje op deze manier lijkt:
Code: Alles selecteren
void loop()
{
  // verzamel alle gegevens.
  // -----------------------------------
  // haal de temperatuur op
  // haal de rpm op

  // verwerk de gegevens
  // -------------------------------

  // doe de uitvoer
  // ---------------------
  // update het display
  // schrijf gegevens naar seriele monitor
}

Berichten: 15
Geregistreerd: 14 Feb 2018, 11:52

Re: PWM output, DC motor toerental zweeft.

Berichtdoor estate » 13 Jun 2018, 23:02

Helaas Koepel, het is niet mogelijk om grotere jpg bestanden aan te hechten in dit forum ? dus een groter schema zit er niet in dus.

VorigeVolgende

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 6 gasten