mbedはじめました(3)
 うまくいったので、シンプルな常点灯パワーパックを作ってみることにします。ほとんどLPC1114とモータードライバ(BD6231)だけで出来ているような物です。
a0008202_23304161.png
(クリックすると大きくなります)

a0008202_23174220.jpg


 プログラムも実にあっさりしたものです。1/50秒毎に方向スイッチ、常点灯ボリューム、スピードボリュームの値を見てPWM出力でモータードライバを制御します。
---------------
#include "mbed.h"

AnalogIn vThin(dp9);
AnalogIn vIlin(dp10);
AnalogIn vDirin(dp11);

PwmOut rPwm(dp24);
PwmOut lPwm(dp18);

Ticker tick1;
float fDir;

void tick(){
fDir = vDirin;

if (fDir <= 0.1f){
rPwm = 0.0f;
lPwm = 0.0f;
}
else if (fDir > 0.1f && fDir < 0.4f){
rPwm = 1.0f;
lPwm = vIlin * 0.3 + (1 - vIlin * 0.3) * vThin;
}
else{
lPwm = 1.0f;
rPwm = vIlin * 0.3 + (1 - vIlin * 0.3) * vThin;
}
}

int main() {
// PWM周期33usec(30KHz)
rPwm.period_us(33);
lPwm.period_us(33);

// 割り込み周期0.02秒間隔
tick1.attach(&tick, 0.02);


while(1) {
}
}

---------------
 当然一発で動作。しかし、何かおかしい。
 2つのPWM出力でPWM周波数が少し違うし、片方のPWM出力はなんだかガタガタと、2%単位くらいでしか変化しない。そう、プリスケーラーの仕業です。
 mbedライブラリのソースを調べると、pwmout_api.cの中に次のようなところがある。
-pwmout_api.cより-------
(前略)
    if (timer == LPC_TMR16B0 || timer == LPC_TMR16B1) {
/* Set 16-bit timer prescaler to avoid timer expire for default 20ms */
/* This can be also modified by user application, but the prescaler value */
/* might be trade-off to timer accuracy */
timer->PR = 30;
}

(後略)
---------------
 16bitタイマーが割り当たっているPWM出力ピン(dp18)では30のプリスケーラーが設定されています。48MHzで動作するマイコンで、PWM周波数が30KHzの場合、PWMのデューティの分解能を1600段階持つことができますが、プリスケーラー30が設定されていると50くらい(つまり2%刻み)しか分解能を持つことができません。
 本アプリでは16bitタイマーでもプリスケーラーなしでもオーバーフローすることはないので、“timer->PR = 0;”としてしまいました。
 mbedライブラリソース(mbed src)の自プロジェクトへの取り込みはmbedの中を覗くのサイトが参考になりました。そのほかにもmbed関連の情報が載っていて助かります。
[PR]
by r34_gtt | 2015-05-24 23:25 | 活動(電気) | Comments(0)


<< スマホ用ダミーバッテリーを作る mbedはじめました(2) >>