|
|
Esimerkki 2.2 - Himmenevä ledi
Opittava asia: PWM:n (Pulse-width modulation, pulssinleveysmodulaatio) peruskäyttö
Seuraavaksi ohjataan ledin kirkkautta PWM:n avulla. Periaatteessa lediä vilkutellaan erittäin nopeasti ja kirkkauden vaihtelu saadaan aikaiseksi säätämällä pulssien päällä ja poissa -tilojen suhdetta (duty cycle). Esimerkiksi jos pulssisuhteeksi asetetaan 50%, niin ledi on päällä puolet ajasta ja pois päältä toisen puolen, joten näyttää, että sitä käytetään puolella kirkkaudella.
Osalista:- ATiny45
- 100 nF kondensaattori
- Punainen ledi
- 270 ohmin vastus, ledin etuvastus (käytä LedCalcia etuvastuksien laskemiseen muunlaisille ledeille)

Esimerkki 2.2

Esimerkki 2.2
/**
* MetkuMods - /
* Kuinka pääset alkuun mikrokontrollereiden kanssa - Osa 2
* Esimerkki 2.2 - Himmenevä ledi
*
* Tekijä: Aki Korhonen
* Pvm: 2009-04-29
*/
// Mikäli kellotaajutta ei ole projektiasetuksissa laitettuna, niin laitetaan tässä
#ifndef F_CPU
#define F_CPU 1000000UL // 1 MHz
#endif
#include <avr/io.h>
#include <inttypes.h>
#include <util/delay.h>
// Ledi pinnissä PB0, OCR0A
#define LED 0
// Min ja max arvot PWM:lle
// Näillä voit säätää kuinka kirkkaaksi ja himmeäksi ledi menee
// Minimi MIN:lle on 0 ja maksimi MAX:lle on 255
#define PWM_MIN 0
#define PWM_MAX 128
int main(void)
{
DDRB = 0xFF;
PORTB = 0x00;
// Arvo PWM-rekisterille
// Muuttujan "value" arvo on verrannollinen ledin kirkkauteen
// 0 = pois päältä | 255 = täysi kirkkaus
uint8_t value = 0;
uint8_t step = 1;
// -------------------------
// Aseta PWM
// 8-bittinen PWM, vaihevakavoitu (Phase correct)
// 8 bitillä saadaan 256 kirkkaustasoa
TCCR0A |= (1<<WGM00);
// Tyhjennä OC0A/OC0B, kun vertailuarvo saavutetaan
// Aseta OC0A/OC0B alhaalla, nollassa (ei-käänteinen tila)
// Clear OC0A/OC0B on Compare Match
// Set OC0A/OC0B at BOTTOM (non-inverting mode)
TCCR0A |= (1<<COM0A1);
// Aseta esijakajaksi (prescaler) 8
// 1 MHz / 8*256 = ~490 Hz PWM-taajuus
TCCR0B |= (1<<CS01);
// -------------------------
// Ohjelma himmentää ja kirkastaa lediä halutulla nopeudella
while(1)
{
// Kirjoita arvo rekisteriin OCR0A (Output Compare Register A)
OCR0A = value;
// Lisää arvoa askeleen verran
value += step;
// Mikäli asetettu maksimiarvo saavutetaan, niin vaihdetaan suuntaa
if(value >= PWM_MAX)
step *= -1;
else if(value <= PWM_MIN)
step = 1;
// Odota 40 ms
_delay_ms(40);
}
return 0;
}
| | Sivut: 1 2 3 4 5 6 | |


Content in english!
Sisältö suomeksi!
