PWM signaal met ATMEGA 328
Inleiding
Er zijn 6 PWM signalen beschikbaar bij de Atmega 328, dit komt voor uit
volgende redenering. We beschikken over 3 inwendige timers: T0,T1,T2 ; welke
elke 2 uitgangssignalen (A en B) bezitten.
Waarbij timer 0 en 2 8bit timers zijn en timer 1 een 16bit timer. Uiteraard
kunnen we ook PWM signalen generen met behulp van delays of analogwrite().
Wanneer we gebruik maken van PWM signalen met behulp van timers zijn er nog 2 methodes, namelijk fast PWM en Phase correct PWM. Deze laatste methode lijkt mij het meest aangewezen voor de sturing van onze motoren. Meer informatie over de PWM phase correct vind u in de datasheet, verder in dit document vervat, op pg 128. Deze methode is echter redelijk tijdrovend en bevat enkele ingewikkelde instellingen. De methode met delays is heel eenvoudig maar lijkt voor onze toepassing niet zo gebruiksvriendelijk. Vandaar dat wij vermoedelijk zullen gebruik maken van de analogwrite methode, namelijk : efficiënt, nauwkeurig, betrouwbaar en eenvoudig.
Wanneer we gebruik maken van PWM signalen met behulp van timers zijn er nog 2 methodes, namelijk fast PWM en Phase correct PWM. Deze laatste methode lijkt mij het meest aangewezen voor de sturing van onze motoren. Meer informatie over de PWM phase correct vind u in de datasheet, verder in dit document vervat, op pg 128. Deze methode is echter redelijk tijdrovend en bevat enkele ingewikkelde instellingen. De methode met delays is heel eenvoudig maar lijkt voor onze toepassing niet zo gebruiksvriendelijk. Vandaar dat wij vermoedelijk zullen gebruik maken van de analogwrite methode, namelijk : efficiënt, nauwkeurig, betrouwbaar en eenvoudig.
PWM met behulp delays
{
pinMode(13,OUTPUT); // output pin 13 defineren
}
void loop ()
{
digitalWrite(13,HIGH); //13 hoog zetten
delayMicroseconds(900);// vertraging van 70 % dutycycle
digitalWrite(13, LOW);//13 laag zetten
delayMicroseconds(400);// vertraging van 30 % dutycycle
}
Phase correct PWM
Hierbij basseer ik mij op volgende tutorial PWM.
Het gebruik maken van PWM met behulp van timers vergt wel wat werk ivm
instellen van registers. Verdere uitleg ivm de instelling van de registers ben
ik dan ook gaan zoeken in de datasheet
van de Atmel Atmega 328.
Timer output
|
Arduino output
|
Chip pin
|
Pin name
|
OC0A
|
6
|
12
|
PD6
|
OC0B
|
5
|
11
|
PD5
|
OC1A
|
9
|
15
|
PB1
|
OC1B
|
10
|
16
|
PB2
|
OC2A
|
11
|
17
|
PB3
|
OC2B
|
3
|
5
|
PD3
|
Vereiste instellingen :
WGM: waveform
generation mode : 001
COMnA/COMnB :10 voor een niet geïnverteerd PWM signaal op uitgang A en B
OCRnA/OCRnB: output control register (vergelijkingsregister) : bv 180
timer0 en 2 tellen van 0-255 , bij OCR register zeg je met welke waarde hij in zijn timerregister moet vergelijken. Hierbij dus goed kijken welke timer je gebruikt (0 en 2 = 8bit en 1=16bit)
CS : clock select, hiermee selecteer je de prescaler van je timer bijvb voor 64 moet je de waarde 100 hebben
TCCRnA/TCCRnB: timer counter control registers bevatten bovenstaande instellingen.
TCCRnA bevat de COMnA/COMnB en WGM instellingen
TCCRnB bevat de CS instelling
Merk op dat den A en B hier niet verwijzen naar output A en B maar gewoon 2 registers zijn van 1 timer. De waardes die je moet instellen verschillen voor de verschillende timers.
Een voorbeeld, WGM moet 001 zijn , voor T0 is dat WGM00, voor T1 is dat WGM 10, Voor T2 is dat WGM 20
Dit is terug te vinden in de datasheet.
in bovenstaande afkortingen moet de “n” steeds vervangen worden door 0,1,2 afhankelijk van de keuze van de timer.
COMnA/COMnB :10 voor een niet geïnverteerd PWM signaal op uitgang A en B
OCRnA/OCRnB: output control register (vergelijkingsregister) : bv 180
timer0 en 2 tellen van 0-255 , bij OCR register zeg je met welke waarde hij in zijn timerregister moet vergelijken. Hierbij dus goed kijken welke timer je gebruikt (0 en 2 = 8bit en 1=16bit)
CS : clock select, hiermee selecteer je de prescaler van je timer bijvb voor 64 moet je de waarde 100 hebben
TCCRnA/TCCRnB: timer counter control registers bevatten bovenstaande instellingen.
TCCRnA bevat de COMnA/COMnB en WGM instellingen
TCCRnB bevat de CS instelling
Merk op dat den A en B hier niet verwijzen naar output A en B maar gewoon 2 registers zijn van 1 timer. De waardes die je moet instellen verschillen voor de verschillende timers.
Een voorbeeld, WGM moet 001 zijn , voor T0 is dat WGM00, voor T1 is dat WGM 10, Voor T2 is dat WGM 20
Dit is terug te vinden in de datasheet.
in bovenstaande afkortingen moet de “n” steeds vervangen worden door 0,1,2 afhankelijk van de keuze van de timer.
PWM gebruik van analogwrite
Dit is volgens mij een eenvoudige, correcte en
gebruiksvriendelijke manier. Vandaar dat deze methode zal gebruikt worden in
ons prototype. Op een tutorial
arduino pwm vind je hierover een duidelijke uitleg.
Als je weet dat een analogwrite() commando zich situeert
tussen 0-255 dan kan je hierop je dutycycle berekenen. Analogwrite(127) zal een
dutycycle van 50% omvatten. Hieronder een schematische weergave.
Ook vind je een voorbeeld programma voor het dimmen van een
led in de arduinosoftware.
Via volgende weg, file>examples> analog menu, kom je tot bovenvermeld bestand.
Hieronder de code die ervoor zorgt dat we een led met pwm signaal kunnen aansturen.
Via volgende weg, file>examples> analog menu, kom je tot bovenvermeld bestand.
Hieronder de code die ervoor zorgt dat we een led met pwm signaal kunnen aansturen.
int led = 5;
void setup(){
pinMode(led, OUTPUT);
}
void setup(){
pinMode(led, OUTPUT);
}
void loop () {
analogWrite(led, 255);
delay(5000);
analogWrite(led,50);
delay(5000);
analogWrite(led,100);
delay(5000);
analogWrite(led,200);
delay(5000);
analogWrite(led,0);
delay(5000);
}
analogWrite(led, 255);
delay(5000);
analogWrite(led,50);
delay(5000);
analogWrite(led,100);
delay(5000);
analogWrite(led,200);
delay(5000);
analogWrite(led,0);
delay(5000);
}
Geen opmerkingen:
Een reactie posten