ArduinoでPWMの周波数とDuty比をいじろうとすると、AVRのレジスタをたたく必要がある。
以下はSysclk=8MMHzの時、1kHzで50%の信号を生成するプログラム。
なお、用いたタイマと出力ピンは紐づけがなされているので、対応したピンを指定する必要がある。
void setup() { // put your setup code here, to run once: TCCR1A = 0b10000010; //10:コンペアマッチAでLOW,10:高速PWM動作 //制御レジスタB TCCR1B = 0b00011001; //11:高速PWM動作, 001:分周なし //最大値 ICR1 = 7999; //0から数える. 全体時間 1ms //SysClock=8MHz //period = 1/Sysclk * ICR //HIGHの時間(クロック数) OCR1A = 3999; //0から数える. High時間 //OCR1AはPB1ピン pinMode(9, OUTPUT); } void loop() { // put your main code here, to run repeatedly: }
●タイマ0 (8bit)
設定するレジスタ : TCCR0AとTCCR0B
HIGH時間を指定する/出力ピン : OCR0A/PD6,OCR0B/PD5
●タイマ1 (16bit)のとき
レジスタ : TCCR1AとTCCR1B
HIGH時間を指定する/出力ピン : OCR1A/PB1,OCR1B/PB2
TOP値を指定する : ICR1
●タイマ2 (8bit)のとき
レジスタ : TCCR2AとTCCR2B
HIGH時間を指定する /出力ピン : OCR2A/PB3とOCR2B/PD3
http://usicolog.nomaki.jp/engineering/avr/avrPWM.html
広告