次はSTM32ボードを積極的に使ていきたい(16) - TinyBASICでPWM
現在取り組んでいる Blue Pillボード用のTiny BASIC、PWM出力を追加しようと調査中です。
Arduino STM32には、標準でPWM出力を行う機能があります。
PA6からデューティ比50%のパルスを出力するには次のように行います。
pinMode(PA6, PWM);
pwmWrite(PA6, 0);
pwmWrite(PA6, 65535/2);
出力結果は次のような感じのパルスとなります。
(550Hzくらいの時もあり、利用するピンによって違うのかもしれません。謎)
pwmWrite(PA6, 0)をやったのは、
Arduino STM32では、pinMode(PA6, PWM)ピン設定だけで、デューティ比50%のパルスが
勝手に出力されてしまうので、設定直後に出力を止める必要があるためです。
標準のAPIでも使えないことはないのですが、
もうちょっと周波数の早いパルスを出したいですね。そこで関数を自作してみました。
20kHzのパルスを出してみました。
デューティ比の指定は、アナログ入力の分解能が12ビット(0~4095)なので
スケールをそれに合わせまあした。
pwmWrite(PA6, 0);
pwmWrite(PA6, 65535/2);
出力結果は次のような感じのパルスとなります。

(550Hzくらいの時もあり、利用するピンによって違うのかもしれません。謎)
pwmWrite(PA6, 0)をやったのは、
Arduino STM32では、pinMode(PA6, PWM)ピン設定だけで、デューティ比50%のパルスが
勝手に出力されてしまうので、設定直後に出力を止める必要があるためです。
標準のAPIでも使えないことはないのですが、
もうちょっと周波数の早いパルスを出したいですね。そこで関数を自作してみました。
// // Arduino STM32 // PWM出力サンプル(周波数,デューティ比指定) // 2017/04/27 by たま吉さん // #if F_CPU == 72000000L #define TIMER_DIV 72 #else if F_CPU == 48000000L #define TIMER_DIV 48 #endif #define PWM_PIN PA8 #include <libmaple/timer.h> // // PWM出力 // 引数 // pin PWM出力ピン // freq 出力パルス周波数(0 ~ 65535) // dcycle デューティ比 (0~ 4095:4095で100%) // 戻り値 // 0 正常 // 1 異常(PWMを利用出来ないピンを利用した) // uint8_t pwm_out(uint8_t pin, uint16_t freq, uint16_t duty) { uint32_t dc; timer_dev *dev = PIN_MAP[pin].timer_device; // ピン対応のタイマーデバイスの取得 uint8_t cc_channel = PIN_MAP[pin].timer_channel; // ピン対応のタイマーチャンネルの取得 if (! (dev && cc_channel) ) return 1; uint32_t f =1000000/(uint32_t)freq; // 周波数をカウント値に換算 dc = f*(uint32_t)duty/4095; timer_set_prescaler(dev, TIMER_DIV); // システムクロックを1MHzに分周 timer_set_reload(dev, f); // リセットカウント値を設定 timer_set_mode(dev, cc_channel,TIMER_PWM); timer_set_compare(dev,cc_channel,dc); // 比較レジスタの初期値指定(デューティ比 0) return 0; } void setup() { pinMode(PWM_PIN, PWM); pwmWrite(PWM_PIN,0); pwm_out(PWM_PIN, 20480, 4095/2); } void loop() { }
20kHzのパルスを出してみました。
デューティ比の指定は、アナログ入力の分解能が12ビット(0~4095)なので
スケールをそれに合わせまあした。

しっかりと出力出来ました。
PWM出力はタイマー資源を使います。
TinyBASICではTIMER1とTIMER3がまだ未使用なので、
このタイマーに対応するGPIOピンで利用出来るようにしたいと思います。
追記上手く行ったと思ったら、なぜかTIMER1だけ動かない。調査中..
対応し、スケッチを修正しました。初期化がまずかったようです。
« 次はSTM32ボードを積極的に使ていきたい(15) - Tiny BASIC(3) | トップページ | 次はSTM32ボードを積極的に使ていきたい(17) - SDカード&ビデオ出力 »
「arduino」カテゴリの記事
- Freenove Mecanum ホイール カー キットを購入しました(2025.05.28)
- Arduino IDE+Arduino STM32環境で指定と異なるgccが使われてしまう(2025.01.23)
- Zorin OSでArduino Uno互換機(CH340)が認識しない(2025.01.19)
- Arduino IDE 2.3.4でArduino STM32を利用する(2025.01.12)
- Arduino用 SKK日本語変換ライブラリの開発 その1(2024.12.28)
「ARM」カテゴリの記事
- Arduino IDE+Arduino STM32環境で指定と異なるgccが使われてしまう(2025.01.23)
- Arduino IDE 2.3.4でArduino STM32を利用する(2025.01.12)
- PocketGoで遊んでみる(1)(2020.03.24)
- Arduino用 MML文演奏ライブラリの作成 その1(2019.04.01)
- BluePillボードで4桁7セグLEDの制御(2019.03.21)
「STM32」カテゴリの記事
- Arduino IDE+Arduino STM32環境で指定と異なるgccが使われてしまう(2025.01.23)
- Arduino IDE 2.3.4でArduino STM32を利用する(2025.01.12)
- 「Arduino STM32 リファレンス 日本語版」が2万アクセス突破!(2021.03.26)
- SPI接続フラッシュメモリモジュールを入手しました(2020.05.13)
- Arduino STM32でキャラクタ液晶ディスプレイを使う(2019.06.01)
« 次はSTM32ボードを積極的に使ていきたい(15) - Tiny BASIC(3) | トップページ | 次はSTM32ボードを積極的に使ていきたい(17) - SDカード&ビデオ出力 »

コメント