<   2015年 05月 ( 2 )   > この月の画像一覧
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)
 さて、簡単すぎるF401REのLチカで遊んでいても仕方ないので、たった140円で買えるLPC1114FN28にターゲットを変更します。
 140円とはいえ、そのスペックは立派な物です。
・ARM Cortex-M0 32-bitマイコン
・50MHzクロック(Max)、Flash:32KB、RAM:4KB
・UART x1、SSP/SPI x1、I2C x1、ADC x6、タイマ:32bit x2/16bit x2 、systickタイマ、ウオッチドッグタイマ、GPIO x22
・パッケージ:DIP28 ←重要

 F401REのようなボードタイプではなく単体のマイコンなので、LPC-LINK2というJTAG/SWD(プログラム書き込み機兼デバッガ)を使用してプログラム書き込みをする準備をします。
(1) まずLPC-LINK2のドライバ、ファームウェアなどダウンロード、インストールしてuVisionからCMSIS-DAPデバッガとして使用できるようにします。
(2) 次にオフライン開発環境を整備します。無料で使用できるMDK-ARM (uVision) Lightをダウンロード、インストールします。私はオンライン開発環境と相性が良い4.74の方をインストールしました。
(3) LPC-LINK2とLPC1114の接続は当然SWDで、LPC-LINK2の端のLPCxpresso用コネクタを使用して接続します(秋月のLPC1114の説明書の2ページ目に結線が記述されています)。LPC-LINK2のピンアサインはこちら
(4) 最後にオンライン開発環境からLPC1114のサンプルLチカをエクスポートしてuVisionにインポート、ビルドしてターゲット(LPC1114)に書き込みます。とりあえずLEDを1個付けてLチカです。先の記事のようなPWMで明暗のコントロールはLPC1114のLED1端子(dp14)ではできないので、PWM1端子(dp24)にLEDを接続しました。
a0008202_01175.jpg
(クリックすると大きくなります)

 既に基板上には次の実験のための用意をしてあります。
[PR]
by r34_gtt | 2015-05-02 00:13 | 活動(電気) | Comments(0)