maandag 5 november 2012

Informatief: PWM sturing


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.

PWM met behulp delays


 void setup ()
{
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
}
Een frequentie van 20MHZ geeft ons een periode van 50ns vandaar de verdeling in 0,035µs en 0,015µs.


 

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.


 

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.
int led = 5;
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);
 
}
 

Geen opmerkingen:

Een reactie posten