PWM output, DC motor toerental zweeft.

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

PWM output, DC motor toerental zweeft.

Berichtdoor estate » 13 Mei 2018, 23:41

Goedenavond allemaal.

Ik ben totaal nieuw met arduino maar heb intussen wel met vallen en opstaan een en ander voor elkaar weten te frutselen echter....

Ik ben nu bezig met een PIT controller voor de vuurhaard van mijn smoker/BBQ/houtstoker :)

Ik stel een temperatuurwaarde in met een potmeter, vergelijk die waarde met een thermosensor (MAX31588) en indien er verschil is en de temperatuur te laag moet de blower, een borstelloze DC motor, 12V, 2,7A, 5300rpm de vuurhaard gaan aanblazen om de temperatuur omhoog te brengen.

Ik voed de motor met 12V, 4,6A voeding (oude laptopvoeding die ik had liggen) en de arduino NANO 168 met een 9V batterij (omdat de USB poort te weinig amps levert)

Om het toerental van de motor variabel te kunnen regelen wil ik gebruik maken van de PWM mogelijkheid van e arduino nano, dit lukt aardig maar.....
De motor blijft niet in een gelijkmatig toerental draaien en spint op en neer in plaats van een redelijk constante rpm.
Eerst dacht ik dat het lag aan het amperage van de usb poort maar zelfs als ik een 12V 3 A voeding gebruik om de nano te voeden blijft het "zweven" aanwezig.

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.

Schema kan ik niet bijvoegen helaas maar het zal u duidelijk zijn hoop ik.

de motor is deze: https://www.ebay.nl/itm/1pc-DELTA-BFB10 ... SwAuNW76Am
de mosfet deze: IRFI530N Transistor N-MOSFET 100V 12A 41W 0,11R TO220FP

de code voor het project staat onderaan deze post.

Wie kan me hier verder mee helpen óf in ieder geval uitleggen wat ik fout doe en hoe verder te gaan ?

CODE:
cpp 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 = 3; // ALARM
int greenLed = 6; // Systeem OK LED
int redLed = 7; // ALARM LED
int pot = A2; // Ingang potmeter temperatuur regeling


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

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


// *** Arduino PINOUT setup ***
pinMode(redLed, OUTPUT); // ALRMSTATUS
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
lcd.init();
// 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(7,3);
lcd.print("2018");
delay(5000);
lcd.clear();
}
//--------------------------------------

//------------- Hallsensor --------------
{
digitalWrite(2, HIGH);

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

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

} // void setup end


void loop() {

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

//------------ 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);
}

rawData = myMAX31855.readRawData();

// STAAN LATEN VOOR DEBUG DOELEINDEN
// Serial.println("****************");
// Serial.println("DEBUG");
// Serial.print("Chip ID: ");
// Serial.println(myMAX31855.getChipID(rawData));

// Serial.print("Cold Junction: ");
// Serial.println(myMAX31855.getColdJunctionTemperature(rawData));

// Serial.print("Thermocouple: ");
// Serial.println(myMAX31855.getTemperature(rawData));
// Serial.println("****************");


Temp = int(myMAX31855.getTemperature(rawData));
delay(50);

}
//--------------------------------------------
/*
* 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----------------------
// Toepasssen als overlay tekst op LCD !!

// ***** DOET NIETS MET DEZE IF !!! *******

if ((Temp) < 80)
Serial.println("Temp < 80 C, Smoker controleren");

//lcd.setCursor(6,2);
//lcd.print("ALARM !!!");
digitalWrite(redLed, HIGH);
// digitalWrite(buzzer, HIGH); //Alarm, vuur is uit
digitalWrite(greenLed, LOW);
lcd.setCursor(0,3);
lcd.print("SMOKER CONTROLEREN !");
delay(500);
digitalWrite(redLed, LOW);
lcd.setCursor(0,3);
lcd.print(" ");


Serial.print("ALARM !! , "); //DEBUG
Serial.print("Rode LED AAN , "); // DEBUG
Serial.print("Groene LED UIT , "); // DEBUG
// tone(buzzer, 1000, 200); // BUZZER tijdelijk uitgeschakeld in programma
// analogWrite(fan, 255); // functie fan max (MOSFET)
//---------------------------------
*/

// ------------- FanSpeed ---------
//-------------DEBUG-------------
//Serial.println("Fan speed uit HAL waarde Fan");
Serial.print("Fan snelheid : ");
Serial.print(rpm, DEC);
Serial.print(" rpm");
//-------------------------------
//-------------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 - 100);

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

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


// if (Temp < calculatedValue)
// {
analogWrite(fan, dif_temp);
// analogWrite(fan, calculatedValue);

// }

/*
// *** DEBUG CODE ***
Serial.println("***************");
Serial.println("DEBUG");
Serial.print("Calculated Value Fan Speed = ");
Serial.println(calculatedValue);
Serial.println("***************");
*/
// ----------------------------------

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;
Serial.println(rpm,DEC);
}

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

//-------------- Toerental ???? ----------------
// WAT WORDT HIER GEDAAN ?? IS DIT NODIG ??
void rpm_fun()
{
half_revolutions++;
//Bij elke omwenteling, wordt deze interupt routine 2 keer uitgevoerd

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

Advertisement

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

Re: PWM output, DC motor toerental zweeft.

Berichtdoor Koepel » 14 Mei 2018, 09:54

Had je al kennis van programmeren ? Het ziet er best aardig uit.

Ik noem de dingen die mij opvallen. Kijk maar of je er iets mee kunt.

Een schema en foto van de draden en aansluitingen zou handig zijn. Je kunt een schema op een stuk papier tekenen en daar een foto van maken. Je hebt in je project namelijk 2.7A van de motor en ook hele kleine spanningen van de thermokoppel. Als de ground current van de motor ook maar een heel klein beetje de Arduino of thermokoppel kan beïnvloeden dan klopt de temperatuur al niet meer.

Gebruik je een breadboard ? Die dingen maken vaak slecht contact. Loop de stroom van de motor door een breadboard ? Dat kan bijna niet goed gaan.

Een 9V batterij is voor een rookmelder, dat is te weinig voor een Arduino. Je zou een step-down converter kunnen gebruiken.
https://iprototype.nl/products/accessoires/power/dc-dc-boost-converter-step-down.
Die kosten ongeveer 1 euro op AliExpress. De kwaliteit is niet zo goed. Wanneer de uitgang onbelast is kunnen ze rare dingen gaan doen.

Je mag zoveel '{' en '}' gebruiken als je wilt, maar het hoeft niet. Je heb de afzonderlijke blokjes code nog eens extra tussen '{' en '}' gezet.

In de interrupt een volatile byte ophogen is heel goed. De 'timeold' is een "unsigned long", dat is ook heel goed.

Om de "half_revolutions" in de loop() bij te houden, is het nodig dat de loop() op maximale snelheid draait.
Helaas zit in het "MAX31855" gedeelte een while-loop met een delay(). En daarmee zakt je hele sketch als een plumpudding in elkaar.
Je kunt beter eenmalig de temperatuur opvragen. Als dat niet lukt, dan het hele gedeelte voor de temperatuur overslaan, en de volgende keer dat de loop() weer wordt uitgevoerd opnieuw proberen.
De delay() vanzelfsprekend verwijderen. Als je bijvoorbeeld 4 keer per seconde de temperatuur wilt opvragen, dan gebruik je daarvoor millis().

Wanneer je loop() op maximale snelheid draait, dan wijzig je ook de rpm voor de motor heel vaak. Dat hoeft natuurlijk niet duizenden keren per seconde te gebeuren. Als je dat één keer per 5 seconden wilt wijzigen, dan gebruik je ook daar millis() voor.

Het lcd display wordt ook heel vaak in de loop() geschreven. Misschien kun je dat 5 keer seconde doen. Dat doe je alweer met millis().

Een software timer met millis is beschreven in de BlinkWithoutDelay: https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay.

De variatie in het toerental heb ik niet kunnen vinden. Je kunt de waarden naar de seriële monitor sturen en ons dat laten zien.

Gebruikers-avatar
Berichten: 4836
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: PWM output, DC motor toerental zweeft.

Berichtdoor nicoverduin » 14 Mei 2018, 10:43

Er zitten nogal wat afkappingen in door gebruik van integers en getallen die eigenlijk een float zouden moeten zijn.
Docent HBO Software Engineering, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

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

Re: PWM output, DC motor toerental zweeft.

Berichtdoor estate » 14 Mei 2018, 20:20

@Koepel, dank voor je input, ik heb zelf echt weinig kennis van programmeren, behalve wat is biljven hangen uit de oertijd van BASIC en de DOS scripts die ik veelvuldig heb geschreven, en heb zoveel mogelijk zelf uitgezocht maar eerlijk is eerlijk ook wat hulp van mijn zoon gekregen.
C komt me daarom wel redelijk bekend voor maar veel van de commando's zijn nét even iets anders, bijvoorbeeld het IF-THEN_ELSE enz. dat in BASIC toch iets anders geschreven werd, maar het was basis genoeg om het te proberen :)

De komende dagen ben ik druk met voorbereiden van de camper, we gaan een weekendje weg met de kleinzoon :) en dus heb ik dan weinig tijd maar ik zal proberen het schema in Fritzing te zetten en het dan hier plaatsen.

de{ en {} heb ik onbewust overgenomen, ben nog niet tevreden met de opbouw en de manier van outcommenten van mezelf maar daar zal ik wat duidelijkheid in proberen te leggen.

Welk deel van de MAX31855 veroorzaakt die vertraging ?
Ik gebruik inderdaad een 9V blok maar in de praktijk gaat alles over een en dezelfde 4,6 A voeding lopen of zelfs op een 44A accu, ik vermoed namelijk dat de spanningsdrops de vreemde toerentallen veroorzaken omdat de voeding instort.
De DC motor wordt ook nu apart gevoed maar alle massa's zijn met elkaar verbonden, en dus ook de MAX31855 sensor/thermokoppel versterker.

Ik ga samen met de zoon deze opmerkingen van je eens in diepte bekijken en er iets mee doen.

@nicoverduin.
Ik snap dat u leraar bent maar u kunt me niet wijsmaken dat u op dezelfde manier lesgeeft als in uw comment.
Mijn leraren gaven met dergelijke opmerking in ieder geval dan wat voorbeelden of een betere uitleg, uw studenten zullen het erg zwaar hebben met u, maar desondanks bedankt voor uw inbreng.

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

Re: PWM output, DC motor toerental zweeft.

Berichtdoor Koepel » 14 Mei 2018, 21:35

Hier wil ik graag op reageren.
Toen ik de sketch zag, viel mij meteen op dat bij de integer berekeningen de bits aan stuurboord en bakboord overboord vliegen. Die berekeningen kunnen beter met een 'float' gedaan worden. Tijdens het schrijven van mijn lange reactie vergat ik dat. Dus toen ik het bericht van nicoverduin zag, dacht ik: "O, wauw, dat had ik willen zeggen".

@nicoverduin, ik hoop dat je zulke dingen in het echte leven minder hebt. Dat soort dingen overkomt mij in het echte leven nogal vaak :( maar blijkbaar niet op dit forum. Was het maar andersom.

@estate, nicoverduin gaf gratis advies, en het was correct en juist. Door de vele berekeningen met integers verlies je nogal wat nauwkeurigheid. Als iets niet duidelijk is, vraag het gerust.

Ik bedoel het deel van de MAX31855 in de sketch.
De loop() wordt vaak uitgevoerd, dus deze while kan beter eenmalig gedaan worden:
Code: Alles selecteren
while (myMAX31855.detectThermocouple() != MAX31855_THERMOCOUPLE_OK)

Tijdens de setup() mag je gerust delay() gebruiken. Maar als de loop() wordt uitgevoerd, dan zijn er twee delay(50), die kunnen beter verwijderd worden, en als je een (software) timer nodig hebt, dan is millis() beter.

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

Re: PWM output, DC motor toerental zweeft.

Berichtdoor estate » 14 Mei 2018, 22:02

@Koepel:
Nogmaals bedankt voor je input.
Het gratis advies van Nico wordt er niet minder om gewaardeerd echter ben ik van mening dat je, juist als je kortaf reageert op een forum, beter de wijsheid die je wilt delen wat ruimer uit kan leggen.
Nico zal een en ander immers ooit ook zelf geleerd hebben en dankbaar geweest zijn voor een beetje meer dan alleen een kort antwoord zonder verdere uitleg.

In mijn opening geef ik overigens aan totaal geen kaas gegeten te hebben van het programmeren en derhalve vindt ik het antwoord van Nico des te irritanter, we zijn niet allemaal geboren met een computer in onze achterzak moet je daarbij bedenken, en al zéker niet met een mega kennis over programmeren van die dinegn :)

Geen kwade bedoeling overigens, maar zuiver bedoeld als tip, maar dan wel een met een scherp randje :)

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

Re: PWM output, DC motor toerental zweeft.

Berichtdoor estate » 14 Mei 2018, 23:18

@Nico, ik realiseer me dat ik nu geen vrienden met je gemaakt heb maar de frustratie was me even wat te hoog, hopelijk ben je wat vergevingsgezinder dan ik ben :) ik wil je mijn excuses aanbieden voor de botte reacties.

@Koepel;
Ik heb de hele MX31855 init naar de setup verplaatst en de delays er in laten zitten, die zijn nodig, zo begreep ik, om te zorgen dat de sensor even tijd krijgt om de data door te zetten ?

Wat me direct opvalt:

De potmeter reageert een stuk sneller en is nu echt realtime (zal aan de 2X delay(50) gelegen hebben ?
In serial monitor vliegen me de waarden nu sneller voorbij heb ik het idee dus dat lijkt nu ook soepeler te lopen ?

In een van je antwoorden zei je dat de LCD in de loop geprint wordt ? of zoiets, moet ik daaraan iets wijzigen ?? dat begreep ik niet zo heel goed.

Het gebruik van millis ipv delay is niet zo makkelijk te begrijpen, ik heb net even wat gezocht en gelezen maar daar moet ik nog dieper in duiken dus.

@Nico en Koepel, jullie hebben het beide over float ipv int ??
Daar snap ik écht helemaal niks van, kan iets meer uitleg gebruiken dus.

Wat ik overigens wél kan vinden is dat float een stuk meer RAM kost en met zo'n NANO 168 ben je dan al snel beperkt.

Dus hoe gebruik ik dan ipv de integers de float zónder dat me dat teveel geheugen gaat kosten ?
En wélke integers (variabelen ?) moet ik dan wijzigen ?

Alhoewel ik bijna elke denkbare arduino (kloon) aangeschaft heb om mee te gaan stoeien wil ik met dit simpele sturing project eigenlijk niet hoger gaan dan strikt noodzakelijk, zélfs misschien in de bouwfase overgaan naar een Pro mini 168, omdat, als alles gereed is, eigenlijk niets meer hoef te wijzigen in de programmatuur of de hardware.
Mocht ik willen uitbreiden kan dat altijd nog in een later stadium en dan zwaardere hardware gebruiken (ik heb zat van dat spul liggen inmiddels :), kost in China ook geen jota ;) )

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

Re: PWM output, DC motor toerental zweeft.

Berichtdoor estate » 14 Mei 2018, 23:40

De code zoals hij nu is aangepast:

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 = 3; // ALARM
int greenLed = 6; // Systeem OK LED
int redLed = 7; // ALARM LED
int pot = A2; // Ingang potmeter temperatuur regeling


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

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


// *** Arduino PINOUT setup ***
pinMode(redLed, OUTPUT); // ALRMSTATUS
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
// lcd.init(); // waarom 2 maal initialiseren ??
// 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(7,3);
lcd.print("2018");
delay(5000);
lcd.clear();
}
//--------------------------------------

//------------- 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) < 40)
{
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, 200); // 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)
// --------------------------------------

}

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


// ------------- FanSpeed ---------
//-------------DEBUG-------------
//Serial.println("Fan speed uit HAL waarde Fan");
Serial.print("Fan snelheid : ");
Serial.print(rpm, DEC);
Serial.print(" rpm");
//-------------------------------
//-------------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 - 100);

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

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


// if (Temp < calculatedValue)
// {
analogWrite(fan, dif_temp);
// analogWrite(fan, calculatedValue);

// }

/*
// *** DEBUG CODE ***
Serial.println("***************");
Serial.println("DEBUG");
Serial.print("Calculated Value Fan Speed = ");
Serial.println(calculatedValue);
Serial.println("***************");
*/
// ----------------------------------

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;
Serial.println(rpm,DEC);
}

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

//-------------- Toerental ???? ----------------
// WAT WORDT HIER GEDAAN ?? IS DIT NODIG ??
void rpm_fun()
{
half_revolutions++;
//Bij elke omwenteling, wordt deze interupt routine 2 keer uitgevoerd

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

EIND

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

Re: PWM output, DC motor toerental zweeft.

Berichtdoor estate » 15 Mei 2018, 01:00

Terwijl ik net de spanning van de nano afhaal en vergeet de spanning van de DC motor met voeding ontdek ik dat de motor pulserend blijft draaien in laag toerental.

Dit betekend volgens mij dat ik een lekspanning heb lopen naar de motor die er niet behoort te zijn.

Kan dit liggen aan de mosfet ??

Gebruikers-avatar
Berichten: 150
Geregistreerd: 03 Sep 2013, 10:03
Woonplaats: Katwijk ZH

Re: PWM output, DC motor toerental zweeft.

Berichtdoor baco1978 » 15 Mei 2018, 08:39

Het lijkt me handiger om het schema hier te plaatsen,

is het zelf bedacht of van een andere website afgehaald?

Een andere oorzaak kan de voeding zelf zijn, omdat deze gebouwd is om een laptop op te laden/ van spanning te voorzien.
Je motor + schakeling verbruikt te weinig, waardoor de voeding pulserende spanning kan leveren.
Met vriendelijke groet Arjan

Volgende

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 1 gast