|
|
Esimerkki 2.4 - Pieniresoluutioinen servo-ohjain sisäänrakennettua PWM:ää käyttäen
Opittava asia: ulkoinen keskeytys (painikkeen painaminen aktivoi laitteessa keskeytyksen, jota voimme käyttää painikkeen tilan jatkuvan testaamisen sijaan)
Vielä yksi PWM-esimerkki. Tällä kertaa yksinkertainen pienitarkkuuksinen (vain ~30 askelta) servo-ohjain.
Osalista:- ATiny45
- 100 nF kondensaattori
- Painonappi
- 10k ohmin vastus
- Normaali RC-servo

Esimerkki 2.4

Esimerkki 2.4
/**
* MetkuMods - /
* Kuinka pääset alkuun mikrokontrollereiden kanssa - Osa 2
* Esimerkki 2.4 - Pieniresoluutioinen servo-ohjain sisäänrakennettua PWM:ää käyttäen
*
* 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 <avr/interrupt.h>
#include <inttypes.h>
#include <util/delay.h>
// Servo pinnissä PB0, OCR0A
#define SERVO_PIN 0
// Painike pinnissä PB2, INT0
#define BTNPIN 2
// Esiasetetut servon asentoarvot OCR0A-rekisteriä varten
// Joutunet hienosäätämään näitä omaa servoasi varten
#define SERVO_LEFT 7
#define SERVO_CENTER 22
#define SERVO_RIGHT 35
uint8_t position = 1;
int main(void)
{
// PB2 sisään, muut ulos
DDRB = 0b11011;
// Aseta sisäinen ylösvetovastus PB2-pinnille ja aseta muut alas
PORTB = 0b00100;
// -------------------------
// Aseta ulkoinen keskeytys 0 (INT0)
// INT0:n laskeva reuna aiheuttaa keskeytyksen (1 -> 0)
MCUCR |= (1<<ISC01);
// Aktivoi INT0
GIMSK |= (1<<INT0);
// Aktivoi globaalit keskeytykset
sei();
// -------------------------
// Aseta PWM
// Nopea PWM (Fast PWM)
TCCR0A |= (1<<WGM01) | (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) 64
// 1 MHz / 64*256 = 61 Hz PWM-taajuus
TCCR0B |= (1<<CS01) | (1<<CS00);
// -------------------------
// Aloita niin, että servo on keskiasennossa
OCR0A = SERVO_CENTER;
while(1)
{
// Painikkeen tilan tarkkailua ei tarvitse tehdä
// täällä, koska painallus käsitellään keskeytyskäsittelijässä
}
return 0;
}
// INT0:n keskeytyskäsittelijä
// Käy läpi servon esiasetetut asennot
ISR(SIG_INTERRUPT0)
{
cli();
switch(position)
{
case 0:
OCR0A = SERVO_LEFT;
break;
case 1:
OCR0A = SERVO_CENTER;
break;
case 2:
OCR0A = SERVO_RIGHT;
break;
default:
break;
}
position++;
if(position == 3)
position = 0;
_delay_ms(300);
sei();
}
| | Sivut: 1 2 3 4 5 6 | |


Content in english!
Sisältö suomeksi!
