In dit project gaan we een van de features van ATmega32A gebruiken om de helderheid van 1 Watt LED aan te passen. De methode die gebruikt wordt om de snelheid van LED aan te passen is PWM (Pulse Width Modulation). Deze AVR Microcontroller PWM-tutorial legt het PWM-concept en de generatie van PWM in detail uit (je kunt ook dit eenvoudige PWM-generatorcircuit bekijken). Beschouw een eenvoudig circuit zoals weergegeven in de afbeelding.
Als nu de schakelaar in de bovenstaande afbeelding gedurende een bepaalde tijd continu wordt gesloten, blijft de lamp gedurende die tijd continu branden. Als de schakelaar gedurende 8 ms gesloten is en gedurende 2 ms gedurende een cyclus van 10 ms geopend is, zal de lamp pas na 8 ms AAN zijn. Nu is de gemiddelde terminal over een periode van 10ms = inschakeltijd / (inschakeltijd + uitschakeltijd), dit wordt de werkcyclus genoemd en is 80% (8 / (8 + 2)), dus het gemiddelde uitgangsspanning is 80% van de accuspanning.
In het tweede geval wordt de schakelaar 5 ms gesloten en gedurende 10 ms gedurende 5 ms geopend, dus de gemiddelde klemspanning aan de uitgang is 50% van de accuspanning. Stel dat de accuspanning 5V is en de inschakelduur 50% en de gemiddelde klemspanning dus 2,5V is.
In het derde geval is de duty-cycle 20% en is de gemiddelde klemspanning 20% van de accuspanning.
In ATMEGA32A hebben we vier PWM-kanalen, namelijk OC0, OC1A, OC1B en OC2. Hier gaan we het OC0 PWM-kanaal gebruiken om de helderheid van de LED te variëren.
Componenten vereist
Hardware:
ATmega32-microcontroller
Stroomvoorziening (5v)
AVR-ISP Programmer
100uF condensator, 1Watt LED
TIP127-transistor
Knopen (2 stuks)
100nF (104) condensator (2 stuks), 100Ω en 1kΩ weerstanden (2 stuks).
Software:
Atmel studio 6.1
Progisp of flitsmagie
Schakelschema en werkuitleg
De bovenstaande afbeelding toont het schakelschema van LED-dimmer met AVR Microcontroller (u kunt ook dit eenvoudige LED-dimmer-circuit bekijken).
In ATmega hebben we voor vier PWM-kanalen vier pinnen aangewezen. We kunnen alleen PWM-uitvoer op deze pinnen opnemen. Omdat we PWM0 gebruiken, moeten we het PWM-signaal nemen op OC0-pin (PORTB 3 e PIN). Zoals weergegeven in de afbeelding, verbinden we de basis van de transistor met de OC0-pin om de power-LED aan te sturen. Hier is nog iets meer dan vier PWM-kanalen, twee zijn 8-bits PWM-kanalen. We gaan hier een 8-bit PWM-kanaal gebruiken.
Op elk van de knoppen is een condensator aangesloten om stuiteren te voorkomen. Elke keer dat een knop wordt ingedrukt, zal er wat ruis zijn bij de pin. Hoewel deze ruis zich in milliseconden stabiliseert. Voor een controller fungeren de scherpe pieken vóór stabilisatie als triggers. Dit effect kan worden geëlimineerd door software of hardware, zodat het programma eenvoudig is. We gebruiken een hardwaremethode door een debouncondensator toe te voegen.
De condensatoren maken het effect van het stuiteren van knoppen teniet.
In ATMEGA zijn er een aantal manieren om PWM te genereren, dit zijn:
1. Fase-correcte PWM
2. Snelle PWM
Hier gaan we alles simpel houden, dus we gaan de FAST PWM-methode gebruiken om het PWM-signaal te genereren.
Kies eerst de frequentie van PWM, dit is meestal afhankelijk van de toepassing, voor een LED zou elke frequentie hoger dan 50Hz voldoende zijn. Daarom kiezen we voor de tellerklok 1MHZ. Dus we kiezen geen prescalar. Een prescalar is een getal dat zo is geselecteerd om een kleinere tellerklok te krijgen. Als de oscillatorklok bijvoorbeeld 8Mhz is, kunnen we een prescalar van '8' kiezen om een 1MHz-klok als teller te krijgen. De prescalar wordt geselecteerd op basis van frequentie. Als we meer tijdsperiode-pulsen willen, moeten we een hogere prescalar kiezen.
Om de SNELLE PWM van 50Hz-klok uit de ATMEGA te halen, moeten we de juiste bits in het " TCCR0 " -register inschakelen. Dit is het enige register dat we nodig hebben om 8bit FAST PWM te krijgen.
Hier, 1. CS00, CS01, CS02 (GEEL) - selecteer de prescalar voor het kiezen van de tellerklok. De tabel voor de juiste prescalar wordt weergegeven in de onderstaande tabel. Dus voor het voorschrijven van één (oscillatorklok = tellerklok).
dus CS00 = 1, andere twee bits zijn nul.
2. WGM01 en WGM00 worden gewijzigd om golfvormgeneratiemodi te kiezen, gebaseerd op de onderstaande tabel, voor snelle PWM. We hebben WGM00 = 1 en WGM01 = 1;
3. Nu weten we dat PWM een signaal is met een verschillende duty ratio of verschillende inschakeltijden. Tot nu toe hebben we gekozen voor frequentie en type PWM. Het hoofdthema van dit project ligt in deze sectie. Om een andere duty-ratio te krijgen, gaan we een waarde kiezen tussen 0 en 255 (2 ^ 8 vanwege 8 bit). Stel dat we een waarde 180 kiezen, aangezien de teller begint te tellen vanaf 0 en de waarde 180 bereikt, kan de uitvoerreactie worden geactiveerd. Deze trigger kan omkeren of niet. Dat wil zeggen dat de output kan worden verteld dat deze moet worden opgetrokken bij het bereiken van de telling, of dat kan worden verteld dat deze moet worden afgebroken bij het bereiken van de telling.
Deze selectie van omhoog of omlaag trekken wordt gekozen door CM00- en CM01-bits.
Zoals getoond in de tabel, om de output hoog te laten worden bij het vergelijken en de output hoog te blijven tot de maximale waarde (zoals weergegeven in de afbeelding onderaan). We moeten de inverterende modus kiezen om dat te doen, dus COM00 = 1; COM01 = 1.
Zoals weergegeven in de onderstaande afbeelding, is OCR0 (Output Compare Register 0) de byte waarin de door de gebruiker gekozen waarde wordt opgeslagen. Dus als we OCR0 = 180 veranderen, triggert de controller de verandering (hoog) wanneer de teller 180 van 0 bereikt.
Om nu de helderheid van de LED te variëren, moeten we de DUTY RATIO van het PWM-signaal wijzigen. Om de duty-ratio te wijzigen, moeten we de OCR0-waarde wijzigen. Als we deze waarde van OCR0 wijzigen, heeft de teller een andere tijd nodig om de OCR0 te bereiken. Dus de controller trekt de output op verschillende momenten hoog.
Dus voor PWM met verschillende werkcycli moeten we de OCR0-waarde wijzigen.
In circuit hebben we twee knoppen. De ene knop is om de OCR0-waarde te verhogen en dus de DUTY RATIO van het PWM-signaal, de andere is voor het verlagen van de OCR0-waarde en dus de DUTY RATIO van het PWM-signaal.