RC Quadrotor helikopter (18 / 37 steg)
Steg 13: Arduino Demo: PWM-utgång
Funktionen timer Jämför utdata av timern används för att generera PWM signaler. När timern når 0, det visar på ett stift, när den når ett visst antal (som vi anger), den stängs av PIN-koden. Detta genererar en fyrkantsvåg med en rörlig tull cykel.
Även om normal servo signaler har oftast en period av ca 20 ms (vilket innebär en frekvens på ca 50 Hz), utdata från våra mikrokontroller har en kortare period (således en högre frekvens, ca 250 till 300 Hz). Turnigy Plush ekonomiska (och HobbyKing varumärke kloner) har rapporterats för att kunna hantera den högre frekvensen, och således mer justeringar i varvtal kan göras per sekund, därtill quadrocopter blir mer stabil.
Jag har också bifogat skärmdumpar från min logik analyzer att visa dig vad de 4 signalerna ut.
Här är koden:
#define PWM_FREQUENCY 300 / / Hz#define PWM_PRESCALER 8
#define PWM_COUNTER_PERIOD (F_CPU/PWM_PRESCALER/PWM_FREQUENCY)
void setup()
{
stift som utgång
DDRD | = (1 << 4) | (1 << 5) | (1 << 6) | (1 << 7);
standard till 1000 mikrosekund pulse bredd
OCR1A = 1000 * 2.
OCR1B = 1000 * 2.
OCR2A = 1000 / 16;
OCR2B = 1000 / 16;
setup är:
Rensa OCnA/OCnB på compare match, ange OCnA/OCnB längst ned (icke-vända läge)
setup timer 1
TCCR1A = (1 << WGM11) | (1 << COM1A1) | (1 << COM1B1);
TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS11);
ICR1 = PWM_COUNTER_PERIOD;
setup timer 2
TCCR2A = (1 << WGM20) | (1 << WGM21) | (1 << COM2A1) | (1 << COM2B1);
TCCR2B = (1 << CS22) | (1 << CS21);
perioden är fast för timer 2, det är ca 244 Hz
Observera att timer1 är en 16-bitars timer och timer2 är en 8-bitars timer
}
void loop()
{
int pw;
för (pw = 1000; pw < = 2000; pw + = 20)
{
OCR1A = pw * 2;
OCR1B = pw * 2;
OCR2A = pw / 16;
OCR2B = pw / 16;
Delay(10);
}
för (pw = 2000; pw > = 1000; pw-= 20)
{
OCR1A = pw * 2;
OCR1B = pw * 2;
OCR2A = pw / 16;
OCR2B = pw / 16;
Delay(10);
}
}
Andra bra sidor att läsa: