【Arduino工作〜基礎編】Arduinoから柔軟なPWM波形を生成する方法
※ 当ページには【広告/PR】を含む場合があります。
2022/05/18
ArduinoのデフォルトのPWM機能について
タイマー | PWM波形モード | 周波数 | チャンネル | 出力ポート |
---|---|---|---|---|
0 | 8bit高速PWM | 977Hz | A | D6 |
0 | 8bit高速PWM | 977Hz | B | D5 |
1 | 8bit位相標準PWM | 490Hz | A | D9 |
1 | 8bit位相標準PWM | 490Hz | B | D10 |
2 | 8bit位相標準PWM | 490Hz | A | D11 |
2 | 8bit位相標準PWM | 490Hz | B | D3 |
977Hz
490Hz
Eq. (1)
Eq. (2)
組み込み的手法でハードウェアPWM波形を作る
#include <avr/io.h>
//👇D10(タイマー1のチャンネルB)を指定
#define PWMOUT 10
unsigned int frq = 440; //周波数[Hz]
float duty = 0.5; //デューティ比50%
void setup() {
pinMode(PWMOUT, OUTPUT);
//👇TCCR*A/Bレジスタを直接弄る
TCCR1A = 0b00100001;//👈D10ピンのPWM(ノン・インバートモード)
TCCR1B = 0b00010010;//👈分周比8に書き換え
//👇TOP値を変更
OCR1A = (unsigned int)(1000000/frq);
//👇Duty比の設定
OCR1B = (unsigned int)(1000000/frq*duty);
}
void loop() {}
動作途中でのPWMの止め方
TCCR1B = 0b00000000;
delayMicroseconds関数でソフトウェアPWM波形を作る
delay
delayMicroseconds
#include <Arduino.h>
//👇待ち時間200μs
unsigned int waitingTerm = 200;
void setup() {
pinMode(5, OUTPUT);
}
void loop() {
digitalWrite(5, HIGH);
//PORTD |= _BV(5);※後述
delayMicroseconds(waitingTerm);
digitalWrite(5, LOW);
//PORTD &= ~_BV(5);※後述
delayMicroseconds(waitingTerm);
}
余談〜高い周波数ではdigitalWriteを使わない
PORTB |= _BV(2); //digitalWrite(10, HIGH);と同じ
PORTB |= _BV(5); //digitalWrite(5, HIGH);と同じ
PORTD |= _BV(5); //digitalWrite(13, HIGH);と同じ
_BV関数
PORTB |= (1 << PB2); //digitalWrite(10, HIGH);と同じ
PORTB |= (1 << PB5); //digitalWrite(5, HIGH);と同じ
PORTD |= (1 << PD5); //digitalWrite(13, HIGH);と同じ
PORTB &= ~_BV(2); //digitalWrite(10, LOW);と同じ
PORTB &= ~_BV(5); //digitalWrite(5, LOW);と同じ
PORTD &= ~_BV(5); //digitalWrite(13, LOW);と同じ
//まとめてHIGH
PORTB |= _BV(2) | _BV(5);
PORTB |= (1 << PB2) | (1 << PB5);
//まとめてLOW
PORTB &= ~(_BV(2) | _BV(5));
PORTB &= ~((1 << PB2) | (1 << PB5));
_BV関数
PORTB |= 0b00010100; //まとめてHIGH
PORTB &= ~0b00010100; //まとめてLOW
PORTB = 0b00010100; //まとめてHIGH・LOW切り替え
参考サイト
記事を書いた人
ナンデモ系エンジニア
電子工作を身近に知っていただけるように、材料調達からDIYのハウツーまで気になったところをできるだけ細かく記事にしてブログ配信してます。
カテゴリー