STM32マイコンでPWM出力
前回に続きNucleo Board STM32F303K8とArduino IDEの組み合わせでの使い方を覚えていこうと思います。今回はPWM出力です。
使い方
普通のArduinoと同じようにanalogWriteが使えます。
ひとまず、LEDが接続されているD13ピンにデューティ0x40で出力してみました。
void setup() {
pinMode(D13, OUTPUT);
analogWrite(D13, 0x40);
}
void loop() {
}
周波数1kHz、デューティ比25%で出力されました。
0x40でデューティ25%になったので分解能は8bit(0~255/0x00~0xff)のようです。
使えるピン
Nucleoボードのユーザマニュアルにコネクタ/ピンの機能が記載されています。
https://www.st.com/ja/evaluation-tools/nucleo-f303k8.html#documentation
UM1956 User manual STM32 Nucleo-32 boards (MB1180) (Rev.5)のP.25 Table 12. Arduino Nano connectors on NUCLEO-F303K8です。
これによると、他の機能と重なっていないタイマ関係のピンはD3、D5、D6、D9のようです。先ほど試したD13も加えて、こんなプログラムで試してみました。
void setup() {
pinMode(D3, OUTPUT);
pinMode(D5, OUTPUT);
pinMode(D6, OUTPUT);
pinMode(D9, OUTPUT);
pinMode(D13, OUTPUT);
analogWrite(D3, 0x10);
analogWrite(D5, 0x20);
analogWrite(D6, 0x30);
analogWrite(D9, 0x40);
analogWrite(D13, 0x50);
}
void loop() {
}
とりあえずこの5ピンはPWMが使えそうです。いろいろ試すとほかのピンでも使えたり/使えなかったりがあったので、調べればもう少し増やせそうです。
周波数を変えたい
標準のPWM周波数は1kHzのようですが、周波数を変更したい場合があります。マイコンSTM32F303K8の設定レジスタを触れば変更できるはずですが、データシートで仕様や設定方法を読み解くのは大変そうで困ったなと思っていたのですが、Arduinoフォルダを見ていたら見つかりました。
C:\Users\USER_NAME\AppData\Local\Arduino15\packages\STMicroelectronics\hardware\stm32\2.9.0\cores\arduino
にあるファイルwiring_analog.cに、analogWriteFrequencyという関数がありこれを使うと周波数を変更できます。
void setup() {
analogWriteFrequency(10000);
pinMode(D13, OUTPUT);
analogWrite(D13, 0x40);
}
void loop() {
}
他、同じファイルにanalogWriteResolutionという関数もあります。
まとめ
PWM出力ができるようになりました。これでモータドライバICを繋げばDCモータを回せそうです。