フォト
2017年8月
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
無料ブログはココログ

« 次はSTM32ボードを積極的に使ていきたい(15) - Tiny BASIC(3) | トップページ | 次はSTM32ボードを積極的に使ていきたい(17) - SDカード&ビデオ出力 »

2017年4月27日 (木)

次はSTM32ボードを積極的に使ていきたい(16) - TinyBASICでPWM

現在取り組んでいる Blue Pillボード用のTiny BASIC、PWM出力を追加しようと調査中です。

Arduino STM32には、標準でPWM出力を行う機能があります。

PA6からデューティ比50%のパルスを出力するには次のように行います。
  pinMode(PA6, PWM);
  pwmWrite(PA6, 0);
  pwmWrite(PA6, 65535/2);


出力結果は次のような感じのパルスとなります。

01

周波数366Hzとちょっと低めですが、デューティ比50%のパルスが出力出来ます。
(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)なので
スケールをそれに合わせまあした。

02

しっかりと出力出来ました。

PWM出力はタイマー資源を使います。
TinyBASICではTIMER1とTIMER3がまだ未使用なので、
このタイマーに対応するGPIOピンで利用出来るようにしたいと思います。

追記
上手く行ったと思ったら、なぜかTIMER1だけ動かない。調査中..
対応し、スケッチを修正しました。初期化がまずかったようです。

« 次はSTM32ボードを積極的に使ていきたい(15) - Tiny BASIC(3) | トップページ | 次はSTM32ボードを積極的に使ていきたい(17) - SDカード&ビデオ出力 »

arduino」カテゴリの記事

ARM」カテゴリの記事

STM32」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/571408/65205241

この記事へのトラックバック一覧です: 次はSTM32ボードを積極的に使ていきたい(16) - TinyBASICでPWM:

« 次はSTM32ボードを積極的に使ていきたい(15) - Tiny BASIC(3) | トップページ | 次はSTM32ボードを積極的に使ていきたい(17) - SDカード&ビデオ出力 »