Stap 13: Arduino Demo: PWM-uitgang
De timer vergelijk output functie van de timer wordt gebruikt voor het genereren van de PWM-signalen. Als de teller op 0, het draait op een PIN-code, wanneer het een bepaald aantal (die wij opgeven) is bereikt, blijkt uit de pin. Dit genereert een blokgolf met een variabele taakcyclus.
Maar normale servo signalen hebben meestal een periode van ongeveer 20 ms (wat betekent dat een frequentie van ongeveer 50 Hz), de uitvoer van onze microcontroller hebben een kortere periode (dus een hogere frequentie, ongeveer 250 tot 300 Hz). De Turnigy pluche SER's (en de HobbyKing merk klonen) zijn gemeld om te kunnen omgaan met de hogere frequentie, en dus meer aanpassingen in de motorsnelheid kunnen worden gemaakt per seconde, daarvoor de quadrocopter zal stabieler.
Ik heb ook toegevoegd screenshots van mijn logic analyzer om u te tonen hoe de 4 signalen eruit.
Hier is de code:
#define PWM_FREQUENCY 300 / / in Hz#define PWM_PRESCALER 8
#define PWM_COUNTER_PERIOD (F_CPU/PWM_PRESCALER/PWM_FREQUENCY)
VOID Setup
{
pinnen als uitgang
DDRD | = (1 << 4) | (1 << 5) | (1 << 6) | (1 << 7);
standaard 1000 microseconde pulsbreedte
OCR1A = 1000 * 2;
OCR1B = 1000 * 2;
OCR2A = 1000 / 16;
OCR2B = 1000 / 16;
de installatie is:
OCnA/OCnB op vergelijk wedstrijd helder, set OCnA/OCnB onderaan (niet-inverterende modus)
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);
de periode voor timer 2 is vastgesteld, is het ongeveer 244 Hz
Merk op dat timer1 een 16-bits timer is en timer2 een 8-bits timer is
}
void loop
{
int pw;
voor (pw = 1000; pw < = 2000; pw += 20)
{
OCR1A = pw * 2;
OCR1B = pw * 2;
OCR2A = pw / 16;
OCR2B = pw / 16;
delay(10);
}
voor (pw = 2000; pw > = 1000; pw-= 20)
{
OCR1A = pw * 2;
OCR1B = pw * 2;
OCR2A = pw / 16;
OCR2B = pw / 16;
delay(10);
}
}
Andere leuke pagina's om te lezen: