PWM, modulacja szerokością impulsu
Piny w Arduino możemy programować jako wejściowe (input), wyjściowe (output) dziś poznamy jak można generować sygnał prostokątny, do pinu D3 podłączmy oscyloskop i wgrywamy program.
void setup(){
pinMode(3, OUTPUT); // Pin D3 jako wyjściowy
}
void loop(){
analogWrite(3, 127);
}
Funkcja analogWrite generuje sygnał protokątny o częstotliwości 490Hz. Wartość PWM można kontrolować w zakresie 0-255. ( 0 ->0% 255 ->100%) przy 127 wypełnienie jest równe 50%
Co jeśli chcemy syganł o innej częstotliwości ?
PWM i rejestr TCCRnB
Bootloader Arduino domyślnie ustawia Timery i dzielniki jak wyżej jednak wartościte można zmienić i wygenerować następującze częstotliwości :
- 30, 122, 245, 490 Hz
- 1, 4, 8, 31, 62 KHz
void setup(){
TCCR2B = TCCR2B & B11111000 | B00000001; // PWM 31,372 KHz
pinMode(3, OUTPUT);
}
void loop(){
analogWrite(3, 127);
}
Oto szczegółowe dane timerów, wyjść które można konfigurować zmianą wpisu do rejestru
// Arduino Uno, Nano, Micro, Mini, Lilly Pad, ATmega 8, 168, 328.
Wartości domyślne dla Pinów D3, 5, 6, 9, 10, 11.
//------------------------------------------------ Pin PWM Arduino IDE D5 & D6 ------------------------------- //TCCR0B = TCCR0B & B11111000 | B00000001; // set timer 0 divisor to 1 for PWM frequency of 62500.00 Hz //TCCR0B = TCCR0B & B11111000 | B00000010; // set timer 0 divisor to 8 for PWM frequency of 7812.50 Hz TCCR0B = TCCR0B & B11111000 | B00000011; // set timer 0 divisor to 64 for PWM frequency of 976.56 Hz //TCCR0B = TCCR0B & B11111000 | B00000100; // set timer 0 divisor to 256 for PWM frequency of 244.14 Hz //TCCR0B = TCCR0B & B11111000 | B00000101; // set timer 0 divisor to 1024 for PWM frequency of 61.04 Hz //------------------------------------------------ Pin PWM Arduino IDE D9 & D10 ------------------------------ //TCCR1B = TCCR1B & B11111000 | B00000001; // set timer 1 divisor to 1 for PWM frequency of 31372.55 Hz //TCCR1B = TCCR1B & B11111000 | B00000010; // set timer 1 divisor to 8 for PWM frequency of 3921.16 Hz TCCR1B = TCCR1B & B11111000 | B00000011; // set timer 1 divisor to 64 for PWM frequency of 490.20 Hz //TCCR1B = TCCR1B & B11111000 | B00000100; // set timer 1 divisor to 256 for PWM frequency of 122.55 Hz //TCCR1B = TCCR1B & B11111000 | B00000101; // set timer 1 divisor to 1024 for PWM frequency of 30.64 Hz //------------------------------------------------ Pin PWM Arduino IDE D3 & D11 ------------------------------ //TCCR2B = TCCR2B & B11111000 | B00000001; // set timer 2 divisor to 1 for PWM frequency of 31372.55 Hz //TCCR2B = TCCR2B & B11111000 | B00000010; // set timer 2 divisor to 8 for PWM frequency of 3921.16 Hz //TCCR2B = TCCR2B & B11111000 | B00000011; // set timer 2 divisor to 32 for PWM frequency of 980.39 Hz TCCR2B = TCCR2B & B11111000 | B00000100; // set timer 2 divisor to 64 for PWM frequency of 490.20 Hz //TCCR2B = TCCR2B & B11111000 | B00000101; // set timer 2 divisor to 128 for PWM frequency of 245.10 Hz //TCCR2B = TCCR2B & B11111000 | B00000110; // set timer 2 divisor to 256 for PWM frequency of 122.55 Hz //TCCR2B = TCCR2B & B11111000 | B00000111; // set timer 2 divisor to 1024 for PWM frequency of 30.64 Hz
// Arduino Mega1280, Mega2560, MegaADK,ATmega1280, ATmega2560 //------------------------------------------------ Pin PWM Arduino IDE D4 & D13 ------------------------------ //TCCR0B = TCCR0B & B11111000 | B00000001; // set timer 0 divisor to 1 for PWM frequency of 62500.00 Hz //TCCR0B = TCCR0B & B11111000 | B00000010; // set timer 0 divisor to 8 for PWM frequency of 7812.50 Hz
ustawienie 31K i wartość 1 w PWM
ustawienie 31K i wartość 1 PWM "z zoomem"
czas impulsu 125ns, czas propagacji średnio 20ns