Stap 5: Code!
Nu dat we alle analoge elektronica bedacht hebben, kunnen we kijken programmering van het systeem. Om te controleren de boost-circuit, moeten we een puls breedte gemoduleerde (PWM) signaal toepassen van de MOSFET gate pin. Deze eenvoudige betekent een signaal dat hoog (5V) en vervolgens laag (0V) op een ingestelde frequentie gaat. Om te controleren het boost circuit de uitgangsspanning, moeten we veranderen hoe lang de MOSFET is in- of uitschakelen voor. Dit is de taakcyclus die je kunt meer leren over van SparkFungenoemd.
Dus laten we beginnen met het definiëren van onze variabelen. Dit komt aan de bovenkant van de schets:
#include "TimerOne.h" //include the library we need to create the PWM signal double duty = 512; //start the duty cycle halfway between 0 and 1024, aka 50% duty cycle double feedback; //the variable that tells us the actual voltage double setVoltage; //the voltage the user wants double pot; //holds value of potentiometer before it gets translated into user preferred voltage
Nu dat we onze globale variabelen gedefinieerd, kunt schrijven wat er gebeurt wanneer de schets voor het eerst uitvoert:
void setup() { Serial.begin(9600); //initialize the serial monitor for debugging pinMode(13, OUTPUT); //this is the pin that controls the MOSFET, its an output pinMode(A5, INPUT); //the feedback input, lets us know what the voltage is currently at pinMode(A4, INPUT); //the input from the potentiometer that sets the preferred voltage Timer1.initialize(100); // initialize timer1 at our set frequency Timer1.pwm(9, 512); // setup pwm on pin 9, 50% duty cycle Timer1.attachInterrupt(callback); // needed for the pwm signal to work }
Hierdoor kunnen we ons pin 13 voor het beheersen van de MOSFET signaal, en analoge pin 5 en 4 respectievelijk voor de feedback en potentiometer besturingselement gebruiken. Het doet ook de aanvankelijke opstelling voor de timer1-bibliotheek. De timer1-bibliotheek vereist ook een functie genaamd 'terugbellen':
void callback(){ digitalWrite(10, digitalRead(10) ^ 1); }
U hoeft niet om deze functie te begrijpen. Zorg enkel ervoor om deze te kopiëren in uw code (maar buiten een andere functie).
Laat nu krijgen naar het leuke deel. De hoofdlus, beheersing van de MOSFET:
void loop() { pot = analogRead(A4); //get the position of the potentiometer setVoltage = map(pot,0,1024,118,205); //use the map function to get the value between 11.8V and 20.5V, this allows some margin of error setVoltage = setVoltage/10; //since the value is between 118 and 205, but we want it as 11.8 and 20.5, divide by 10 Serial.println(setVoltage); //print voltage to serial monitor, good for debugging feedback = analogRead(A5)*11.11*5/1024; //read in the actual voltage, the math part is to account for the voltage divider and the arduino's conversion to a number between 0 and 1024 if(feedback < setVoltage && duty < 850) duty += 1; //if the actual voltage is less than what we want it to be, then increase the duty cycle to get us up to where we want else if(feedback > setVoltage && duty > 50) duty += -1; //if its greater than we want it to be, lower the duty cycle to get down to the desired voltage Timer1.setPwmDuty(9, duty); //set this new duty cycle preference }
Deze sectie van code leest de potentiometer en de werkelijke uitgangsspanning. Op basis van deze informatie, de Arduino verhoogt of verlagen de plicht cyclus signaal naar de MOSFET. Dit zal verhogen of verlagen van de uitgangsspanning. Dit gedeelte van de code is in de leegte lus zodat het continu de potentiometer waarde kunt controleren. De Arduino schets code is gekoppeld.