|
|
Esimerkki 2.3 - Säätövastuksen arvon lukeminen
Opittava asia: PWM:n ja ADC (Analog to Digital Converter) käyttö
Lisätään hieman säätömahdollisuutta himmenemiseen ja käytetään sisäistä A/D-muunninta säätövastuksen arvon lukemiseen. Tällä kertaa vuorossa kaksi erilaista koodiesimerkkiä samalle kytkennälle.
Osalista:- ATiny45
- 100 nF kondensaattori
- Punainen ledi
- 270 ohmin vastus, ledin etuvastus (käytä LedCalcia etuvastuksien laskemiseen muunlaisille ledeille)
- 100k ohmin vastus
- 10k ohmin (tai suurempi) säätövastus

Esimerkki 2.3

Esimerkki 2.3
Ensimmäinen esimerkkikoodi on mikrokontrolleriversio Metkun vanhasta ColorFade -kytkennästä. Himmennystekniikassa on myös hieman eroa, koska ColorFade perustuu analogiseen kytkentään, jossa himmentymiseen vaikuttaa muutamien osien arvot ja tässä versiossa kaikki tehdään digitaalisesti ohjelmalla.
/**
* MetkuMods - /
* Kuinka pääset alkuun mikrokontrollereiden kanssa - Osa 2
* Esimerkki 2.3.1 - Säätövastuksen arvon lukeminen
*
* 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
// Säätövastuksen keskikontakti pinnissä PB2, (ADC1)
#define POT 2
// 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)
{
// PB2 sisään, muut ulos
DDRB = 0b11011;
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;
uint16_t delay = 10;
uint16_t i = 0;
// -------------------------
// 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);
// -------------------------
// Aseta ADC
// Aktivoi ADC
ADCSRA = (1<<ADEN);
// Valitse ADC1
ADMUX |= (1<<MUX0);
// Käytä käyttöjännitettä (Vcc) referenssijännitteenä
ADMUX &= ~(1<<REFS1) | ~(1<<REFS0);
// Valitse jakoluvuksi 8, jolloin saadaan 1 MHz/8 = 125 kHz ADC-kello
ADCSRA |= (1<<ADPS1) | (1<<ADPS0);
// -------------------------
// Ohjelma lukee ADC:lla säätövastuksen arvon
// koko ajan ja laskee siten himmennysnopeuden.
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;
// Aloita A/D-muunnos
ADCSRA |= (1<<ADSC);
// Odotellaan, että muunnos valmistuu
loop_until_bit_is_set(ADCSRA, ADSC);
// Laske viive askelten välillä
// Min: 20 ms
// Max: 127 ms
delay = 20 + ((ADCW/8)-20);
// Odota lasketun ajan verran.
// For-looppi tässä, koska _delay_ms
// ei pitänyt muuttujasta parametrina.
for(i=0 ; i<delay ; i++)
_delay_ms(1);
}
return 0;
}
Toisessa esimerkissä kytkentä pysyy täysin samana, mutta säätövastus säätää tällä kertaa suoraan ledin kirkkautta himmentymisnopeuden säätämisen sijaan.
Vinkki: jos korvaat lediosuuden tästä kytkennästä ensimmäisen kytkennän moottoriosuudella, pystyt säätämään moottorin nopeutta säätövastuksella.
/**
* MetkuMods - /
* Kuinka pääset alkuun mikrokontrollereiden kanssa - Osa 2
* Esimerkki 2.3.2 - Säätövastuksen arvon lukeminen
*
* 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
// Säätövastuksen keskikontakti pinnissä PB2, (ADC1)
#define POT 2
int main(void)
{
// PB2 sisään, muut ulos
DDRB = 0b11011;
PORTB = 0x00;
// Arvo PWM-rekisterille
// Muuttujan "value" arvo on verrannollinen ledin kirkkauteen
// 0 = pois päältä | 255 = täysi kirkkaus
uint8_t value = 0;
// -------------------------
// 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);
// -------------------------
// Aseta ADC
// Aktivoi ADC
ADCSRA = (1<<ADEN);
// Valitse ADC1
ADMUX |= (1<<MUX0);
// Käytä käyttöjännitettä (Vcc) referenssijännitteenä
ADMUX &= ~(1<<REFS1) | ~(1<<REFS0);
// Valitse jakoluvuksi 8, jolloin saadaan 1 MHz/8 = 125 kHz ADC-kello
ADCSRA |= (1<<ADPS1) | (1<<ADPS0);
// -------------------------
// Ohjelma lukee ADC:lla säätövastuksen arvon
// koko ajan ja päivittää PWM-rekisteriin saadun arvon,
// jolloin ledin kirkkaus säätyy säätövastuksen mukaan
while(1)
{
// Aloita A/D-muunnos
ADCSRA |= (1<<ADSC);
// Odotellaan, että muunnos valmistuu
loop_until_bit_is_set(ADCSRA, ADSC);
// Lue ADC:n arvo ja skaalaa se 8-bittiseksi arvoksi,
// koska ADC tässä on 10-bittinen (1024 arvoa) ja
// PWM-rekisteri on ainoastaan 8-bittinen (256 arvoa), 1024/256 = 4
value = (uint8_t)(ADCW/4);
// Kirjoita arvo rekisteriin OCR0A (Output Compare Register A)
OCR0A = value;
// Odota 2 ms
_delay_ms(2);
}
return 0;
}
| | Sivut: 1 2 3 4 5 6 | |


Content in english!
Sisältö suomeksi!
