ラベル LPC1110FD20 の投稿を表示しています。 すべての投稿を表示
ラベル LPC1110FD20 の投稿を表示しています。 すべての投稿を表示

2013年9月4日水曜日

Multifunction Module LPC1110FD20 のサンプルコードの説明 (3つのモード)

MCU Gear ® を使ったプログラムの説明などを書いています

Multifunction Module (マルチファンクションモジュール)はLPC1110マイコンを搭載したモジュールです。


PWM 機能も使えるので、動画のようにサーボモーターも動かせます。
動画は12bit 2ch ADモジュールに距離センサー(GP2Y0A21YK)を取り付け、LCDで値を表示しながらサーボを回してみました。もちろんモジュールを重ねても動きます。



サンプルソースではMCUGearを通して、SPI通信 16bitフォーマットでデータのやり取りをし、3つのモード(AD変換、PWM、I2C)のサンプルを用意しました。プログラムの中身を見ながらいろいろ楽しんでみてください。


マイコンとUARTも接続可能ですが、モジュールを切り替えるため単純なSPIを推奨します。SPI使用時は補助としてUARTピンを2つのデジタルIOとしても使えます。簡単な機能を分担させるために使用できますが、サンプルプログラムでは特に言及していません。


サンプルプログラムのI2C.hなどで通信速度設定の変更をしています。このプログラムはあくまでも動作確認用なので、ご自分のシステムで動作させる際はユーザーマニュアルなどを見ながら自作してください。

MCU Gear 側 (ベースボードに接続されている端子)

0pin PIO0_8/MISO/CT16B0_MAT0
1pin PIO0_9/MOSI/CT16B0_MAT1
2pin PIO0_6/SCK0
3pin PIO0_2/SSEL0/CT16B0_CAP0
4pin PIO1_6/RXD/CT32B0_MAT0
5pin PIO1_7/TXD/CT32B0_MAT1

モジュールの外部ピン(実際に出力ピンとして使えるもの)

0pin  R/PIO1_1/AD2/CT32B1_MAT0
1pin  R/PIO1_2/AD3/CT32B1_MAT1
2pin  SWDIO/PIO1_3/AD4/CT32B1_MAT2
3pin  SWCLK/PIO0_10/SCK0/CT16B0_MAT2
4pin  PIO0_5/SDA
5pin  PIO0_4/SCL

ピンの種類を見るとわかりますが、以下のような機能が使用可能である。

5つのデジタル入出力(内二つはオープンドレイン)
3つのAD変換
3つの32bitマッチタイマー出力
1つの16bitマッチタイマー出力
I2Cバス(MCUGearと別系統で使用可能、プルアップ抵抗が必要です)
デバッガ(SWDクロックポート、SWD入出力ポートが取り出せますが、この機能はテストしていません、興味のある方は試してみてください。)

以下にサンプルプログラムの使い方を説明します



・3ch 10bit ADC

main.c で

#define AD_MODE 1

#define PWM_MODE 0
#define I2C_MODE 0

とAD_MODEを選択してください。

3チャンネルの10bit AD変換モジュールとして動作します。


マイコン側では

mbed、KL25Z はMCUGear ライブラリのcommon.hを

//For Sample Mltifunction Mofdule-----------------------------

#define AD_MODE
//#define PWM_MODE
//#define I2C_MODE
//--------------------------------------------------------
としてください。
LPC1114FN28 のLPCXpressoの場合は main.c 内で

#define MultiFunctionModule 1

#define PWM_MODE 0
#define AD_MODE 1
#define I2C_MODE 0

と定義してください。



SPIの操作方法


1、まず、どのAD変換データが欲しいかを指定します。

16bit 1MHzで動作します。16bit なので cs を Low にしたまま 8bit を二回送っても良いです。

チャンネル指定データを送ります。順不同なので注意してください。

0x0001:AD4
0x0002:AD2
0x0003:AD3

2、次に16bitデータの受信を行います。

16bit 0x000を送ってください。ADCが 10bit なので、実際に使えるのは 10bit 分のみです。

KL25Zは16bit Format に対応していないので8bitで操作します。


FRDM-KL25Zの例

    getData = spi.write(0);
    getData = (getData<<8)+spi.write(0);



・3ch PWM 出力

Multifunction Module 側のmain.c で

#define AD_MODE  0

#define PWM_MODE  1
#define I2C_MODE  0

PWM_MODE  を選択してください。

3チャンネルのPWMモジュールとして動作します。


マイコン側では

mbed、KL25ZはMCUGear ライブラリのcommon.hを

//For Sample Mltifunction Mofdule-----------------------------

//#define AD_MODE
#define PWM_MODE
//#define I2C_MODE
//--------------------------------------------------------
としてください。
LPC1114FN28 のLPCXpressoの場合は main.c 内で

#define MultiFunctionModule 1

#define PWM_MODE 1
#define AD_MODE 0
#define I2C_MODE 0

と定義してください。



PWMは32bitタイマーマッチアウト(CT32B1_MAT0~2)を使用しています。


前方4bitがコマンド、後方12bitがデータという 16bit SPI フォーマットで動作します。




1、まず初期化します。

以下の順番にデータを送信してください。
Divider
Frequency
Duty0
Duty1
Duty2


これらのデータはモジュールのLPC1110内では以下のように扱われます。


LPC_SYSCON->SYSAHBCLKCTRL |= (1<<10);

LPC_IOCON->R_PIO1_1 |= 3;
LPC_IOCON->R_PIO1_2 |= 3;
LPC_IOCON->SWDIO_PIO1_3 |= 3;
LPC_TMR32B1->PR = Divider - 1; //プリスケールレジスタ
LPC_TMR32B1->PWMC |= (1<<0);
LPC_TMR32B1->PWMC |= (1<<1);
LPC_TMR32B1->PWMC |= (1<<2);
LPC_TMR32B1->MCR |= (1<<10);
LPC_TMR32B1->MR3 = Frequency-1;
LPC_TMR32B1->MR0 = Frequency*Duty0/100;
LPC_TMR32B1->MR1 = Frequency*Duty1/100;
LPC_TMR32B1->MR2 = Frequency*Duty2/100;
LPC_TMR32B1->TCR = 1;

簡単に説明しますと、タイマーの中にはプリスケールカウンター(PC)というカウンターが動いています。このカウンターがまずプリスケールレジスタの値(PR)と等しくなったときにタイマーカウンター(TC)が1つカウントされます。

TCの値とMR0~MR2の値が一致するときにvoid TIMER32_1_IRQHandler(void)にタイマー割り込みが発生して、そこに記述された動作をします。

さらに詳しい内容は、LPC111Xのユーザーマニュアルを参照してください。


日本語ユーザーマニュアル (15章)


Englich User Manual (Chapter 20)



2、PWM動作中には以下のような変更が可能です。



//data format

//15-12:setting(Header)
// 1 :stop PWM out
// 2 :Frequency setting
// 3 :Duty0 setting
// 4 :Duty1 setting
// 5 :Duty2 setting
// 6 :start PWM out
// other :Nothing
//11-0:Data


16bitのSPI信号で、15-12bit のコマンド部分は、上記の0~5を選択します。

settingと書いてあるところは12bitでデータを入れて調整することができます。
settingと書いていないところは12bit部分は0x000を入れて送信してください。

例えばDuty0 の値を 0x7FF に変えたいときは、16bit の 0x37FF (0011 0111 1111 1111)を送信すれば良いことになります。


実際にどのように動くかは以下の計算式で求められます。


4、RCサーボ用信号の設定

LPC1114FN28を例として、RCサーボ用の信号を想定して約20msecの周期を考えてみます。
そのうちHigh信号の期間が0~2msecの範囲を12bit分解能で調整できるようにしてみます。

初期化で initPWM(&MFM, 24, 40950, 0, 0, 0); と値を入れた場合、

(マイコンのクロック:48MHz)/(Divider:24) = 2MHz
これを(1/2MHz)*(Frequency 40950) ≒ 0.02sec=20msec
としています。

12bitの最大値は4095となります。Frequency 40950 としたので、最大でも周期の10%となります。そのため、サーボ用の信号は周期20msec その10%の範囲で設定できるようになり、0~2msecを12bit分解能で微調整できます。

(※注意:多少パルス幅に誤差があるので、場合によっては微調整が必要です)

    initPWM(&MFM, 24, 40950, 0, 0, 0);

    PWMDuty(&MFM, 1, 0x7FF);    //duty 1msec
    PWMDuty(&MFM, 2, 0x001);    //duty 500nsec
    PWMDuty(&MFM, 3, 0xFFE);    //duty 2msec

RCサーボモーターによって、最小パルスの大きさが違います。
その為サンプルプログラムの例では最小値を0x7FFとしています。最大値も物によっては差が出るかもしれませんので、微調整が必要になります。
モーターなので、電源はMCUGearからではなく、別系統で持ってきた方が安定します。GNDを共通にするのを忘れないでください。
また、マイコンのプログラム中は動きが不安定になるので、RCサーボモーターの電源を切ってから行って下さい。


5、通常のPWM信号の設定


例えば、12bit分解能で、0~100%を設定する場合は、Frequency を4095として、Dividerで同じ周期に調整します。20msecの周期のPWMを変化させる場合は以下のようになります。


    initPWM(&MFM, 240, 4095, 0, 0, 0);

    PWMDuty(&MFM, 1, 0x199);    //duty 10%
    PWMDuty(&MFM, 2, 0x7FF);    //duty 50%
    PWMDuty(&MFM, 3, 0xE65);    //duty 90%


6、応用として、PWM出力とローパスフィルターを利用したDA出力も可能です。




・I2Cテスト(SPI to I2Cデバイスとして動作します)


I2Cテストはユニバーサルモジュール2のゲート操作を行うことを前提に作られています。

別の通信速度のI2Cを動かしたり、アドレスがかぶってしまうようなデバイスを動作するときに使用します。

大まかな流れは

マイコンからMultifunction Module を通してI2Cでゲートを開き、ゲートの開閉状況をI2Cで読みとり、それをまたSPIでマイコン側に戻してシリアルポートから読み取る。
というものです。
これを一回だけ行われるようにしています。シリアルで取りこぼしたときは、パワーモジュールのリセットボタンを押すか、電源をOFF->ONすれば取れるはずです。

では、配線方法です。ユニバーサルモジュール2はベースボードから取り外した状態で使用します。


main.c で


#define AD_MODE  0

#define PWM_MODE  0
#define I2C_MODE  1

I2C_MODE を選択してください。


マイコン側では

mbed、KL25ZはMCUGear ライブラリのcommon.hを

//For Sample Mltifunction Mofdule-----------------------------

//#define AD_MODE
//#define PWM_MODE
#define I2C_MODE
//--------------------------------------------------------
としてください。
LPC1114FN28 のLPCXpressoの場合は main.c 内で

#define MultiFunctionModule 1

#define PWM_MODE 0
#define AD_MODE 0
#define I2C_MODE 1

と定義してください。


SPI通信は16bitで動作し、前半8bitがアドレス、後半8bitがコマンドです。



ここでは試しにユニバーサルモジュール2のゲートスイッチをモジュール単体で操作してみようと思います。

以下のように配線しました。

I2Cはベースボードに取り付けていない場合、MCOM1にしか信号が通りませんのでご注意ください。またユニバーサルモジュール2のアドレスはmcugear.com内の組み立て方を参考にしてください。




プルアップ抵抗は2.2KΩと書いてありますが、今回は3KΩでテストしました。

MCOM1の2番端子をGNDにつなぎ、赤いLEDを適切な抵抗を付けて+3.3Vとユニバーサルモジュール2の2番信号端子に接続してあります。
もしゲートが開くと、LEDの2番信号端子がGNDになるという動きです。

サンプルプログラムを実行してみてください。LEDがONになり、一回だけ送ったデータがLPC1114FN28のuartを通して確認できます。


uartの信号をPCに接続して表示する方法はブログ内の別の記事を見てください。


2013年9月1日日曜日

MCU Gear のプログラム:その1 LPC1114FN28, mbed LPC1768, mbed K25Z 共通

MCU Gear ® を使ったプログラムの説明などを書いています

MCU Gear® を使うと自動的にデバイスを搭載したモジュールを発見し、デバイスとマイコンとのデジタル回路を再構成しながら動かすことができます。




単純なシリアル通信ではなく、通常のデジタル回路を動作中に再配線してデバイスを動かすという方法を採用しているため、従来のライブラリも使用可能です。

また切り分けて開発できるので、別の回路を作るときに以前作った回路を再利用することも容易です。

単純なイメージ図は以下のようになります。マイコンが動作中にIOを色々なデバイスに切り替えながら動きます。
ユーザーはプログラムで「マイコンのIOをどのモジュールの何番ピンを接続するか」を指定するだけで自動的に探して動作中に切り替えながら動きます。

途中経路は気にせず、色々ごちゃっと積層して動かすことができます。アドレスの設定パターン数を考えて、理論上は1つのマイコンに約120個程度取り付けることができます。(もちろん実際には動作速度や信号の劣化など、様々な制限がかかります。)


MCU Gear の構成は以下の3つです。

1、マイコンボード・・・LPC1114FN28のDIPマイコン, mbed LPC1768, FRDM-KL25Zなどの+3.3V系マイコンやボードを一枚の基板で扱うことができます。(+5V系マイコンボードは電圧レベル変換ボード等を使用する必要があります。)

~ディーノ系は技術的に検証していない部分が多いので推奨はしませんが、動作確認はできるようにサンプルプログラムは準備中です。


 


2、ベースボード・・・マイコンボードの信号線をベースボード上のコネクタに再配線するデジタルスイッチを搭載しています。マイコンボードなしてもブレッドボードなどに配線すれば別のマイコンを取り付けることもできます。

3、拡張モジュール・・・ベースボードからの信号をデバイスにつなげるかを選択するデジタルスイッチが搭載されています。



以下、どのマイコンを選択するかの参考です。
フリー版のLPCExpressoではC++での開発ができないのでCだけでよい方はこちらを使いましょう。
今後LPC1114FN28もmbedのweb開発環境が使えるそうなので、その時はそちらも試してみようと思います。



  LPC1114FN28 mbed FRDM-KL25Z
C言語 O O O
C++ X(Free版) O O
IDE アプリケーション Web上 Web上
価格 110円前後 5000円前後
1400円前後
(Digi-Key)
(※注意:海外通販で購入する場合は為替で変動します。 2013/06/1現在の情報)
※mbed でもLPC1114FN28対応できるようになったようです。


MCU Gearのプログラムの簡単な流れです。

1、初期化
   a、ベースボード初期化
   b、拡張モジュールの位置を把握
   c、拡張モジュール毎のマイコンとの配線情報を保存

2、動作中(繰り返し)
   a、目的の拡張モジュールと接続は設定されたアドレスを指定
   b、接続後のデバイスとは従来通りの操作。
   c、目的の拡張モジュールと切断

プログラムに必要な項目を見るとわかると思いますが、プログラマーは拡張モジュール上のデバイスが、マイコンのどの端子を割り振るかさえわかっていれば良いので、MCUGear内の途中経路は気にしないで作れます。これにより、拡張モジュールをごちゃっと積層しても動かすことができます

では次回実際にその流れを見てみましょう。

LPC1114 FN28 DIP とLPC1110FD20 の書き込みソフト Flush Magicをインストール

MCU Gear ® を使ったプログラムの説明などを書いています

1、Flush Magic をインストール。
http://www.flashmagictool.com/


FlashMagic.exe をクリックしてダウンロードしましょう。

インストールはデフォルトで大丈夫です。

デバイスの選択、hexファイルの選択(プロジェクトフォルダのDebug直下に~.hexがあると思います)各種設定して、さっきコンパイルしたhexファイルを選択します。

COMポートはWindowsのデバイスドライバでシリアルポート部分を調べると分かります。

2、LPC1114FN28用の設定

最後にLPC1114FN28用のHexファイルが保存されている所を指定してください。通常はプロジェクトフォルダのDebugに入っていると思います。




書き込みツールはTTL-232R-3V3 USB-UART 変換ケーブル やArduino Pro 3.3V用USBシリアルが使用できます。他にもマルツパーツさんの書き込みツールや秋月電子通商さんの書き込みツールも配線すれば使えます。
マイコンには電源電圧は印加されず以下の3つの端子のみ接続されますので、MCUGearのパワーモジュール等を通して電源供給してください。


[FTDI->マイコン]
RX->TX

TX->RX
GND->GND

に接続します。


書き込みモードにするにはスライドスイッチをスイッチの設定しリセットするか電源をOFF->ONするのを忘れないでください。(パワーモジュール上のタクトスイッチを押すとリセットできます。)

実行の際にはRun側に設定して同じくリセットするか、電源をOFF->ONしてください。



3、LPC1110FD20用(Multifunction Module用)の設定
LPC1110FD20はFlashMagic.exe の設定を以下のように変更するだけです。




Multifunction Moduleもやはりプログラムモードにするスライドスイッチの操作が必要です。
書き込みモードにするにはスライドスイッチをスイッチの設定しリセットするか電源をOFF->ONするのを忘れないでください。(パワーモジュール上のタクトスイッチを押すとリセットできます。)
実行の際にはRun側に設定して同じくリセットするか、電源をOFF->ONしてください。






LPC1114 FN28 DIP とLPC1110FD20 のIDE LPCXpresso のインストール

MCU Gear ® を使ったプログラムの説明などを書いています

1、LPCXpresso IDEを入れます。

私はWindowsを使っているので、以下のサイトから「LPCXpresso IDE (for Windows and Linux)」を探してインストールしました。

http://ics.nxp.com/lpcxpresso/

フリー版だとC++が使えません。Cで作るようにしましょう。(このページの下を参照


code-redにログインが必要なのでまずはここで登録してログインしてください。
基本的に英語で書いてありますが頑張ってください。

今回はLPCXpresso5.1.2をいれました。

基本的には全部選択状態でデフォルトです。

次に確認のためのアクティベートという処理をします。

まずインストールしたソフトLPCXpresso5.1.2を開く。
作業場を指定しろって窓が出るのでC:\LPCwork など好きな名前を書いておく。

[Help]->[Product Activation]->[Create Serial Number and Activate]を選択する。

LPC1.png


シリアル番号が表示されチェックボックスが二つ出るので両方チェックしておく。

再びcode-redのページからログイン
http://lpcxpresso.code-red-tech.com/LPCXpresso/

My Registration を押すとさっきのシリアル番号を入れる画面が出てくる。
そこにシリアル番号をコピペしてボタンをクリックすると登録されたメールに送られてくる。

メールにあるアクティベーションコードを今度はLPCXpresso5.1.2
[Help]->[Product Activation]->[Enter Activation code]に入れます。





2、CMSISのインポートと内部オシレータの設定
各種ライブラリをダウンロードするのと、内部オシレータを使いたいので、次のような処理をする。
LPCXpresso5.1.2の画面左下に
Improt project(s)っと書いてあるところをクリック

ここでArchiveという所の右にBrouz...っというボタンがあるので押す。
C:\nxp\LPCXpresso5.1.2\lpcxpresso\Examples\NXP\LPC1000\LPC11xx\
CMSISv2p00_LPC11xx.zip

っと入れるとCMSISという便利な物がインポートできます。

CMSISには基本動作に必要なことがあらかじめ書き込まれています。

ユーザーマニュアルを見ると細かく書いてあります。(日本語版もあります)
http://www.nxp.com/documents/user_manual/UM10398.pdf
Fig 8.を見るとクロックを選択できるような記号があるので、ここを内部クロック設定にする。


SYSPLLCLKSEL (system PLL clock select)というキーワードを探すとSYSPLLCLKSELを設定すれば良い事が分かるので、内部クロックのIRC oscillatorに設定

設定方法は内部クロック設定を見ると3.5.9 System PLL clock source select register の Table 16を見ると分かると思います。

system_LPC11xx.c に色々設定があるので、そこで
SYSPLLCLKSELを検索して以下のように書き換える。


#define SYSPLLCLKSEL_Val 0x00000001

#define SYSPLLCLKSEL_Val 0x00000000
に書き換えると、内部オシレータ―
48MHzが使えるようになる。


LPC2.png






3、新しいプロジェクトを作ります。

左下の[New Project]をクリックする

[NXP]->[NXP LPC1100 projects]->[C Project]を選択

LPC3.png

プロジェクト名は好きな物(ここでは
test01)を入れてください、デバイスは[LPC1114FN/102]を選択


LPC4.png

最終的に画像のようになります。

サンプルプログラムをProject Explorerのmain.cのあるフォルダにコピー&ペーストすれば準備完了です。


次にコンパイルの設定をする。
さっきのtest01を右クリックし、プロパティを開く。
[C/C++Build]->[Settings]->[Build Steps]を選択

post-build steps の [Command]を入れる。

arm-none-eabi-size ${BuildArtifactFileName}; arm-none-eabi-objcopy -O ihex ${BuildArtifactFileName} ${BuildArtifactFileBaseName}.hex ; # checksum -d ${BuildArtifactFileBaseName}.bin;

要するにhexファイルを吐き出せという書き換えです。


左下に[Build 'test01'[Debug]]というハンマーのマークのがあるのでクリックする。


LPC6.png

ビルド前の状態やもう一回1からビルドしたいときには Clean して Buildしてください


確認したら最後にtest01をMCUGearという名前に変更しましょう。



4、マルチファンクションモジュール用プロジェクト


次にマルチファンクションモジュール用に、LPC1110FD20のプロジェクトを開いてみます。
同じく左下の[New Project...]を押してwizardを開きます。
以下の画像のような進め方をします。













最後に[Finish]を押した後にサンプルプログラムをProject Explorerにコピー&ペーストすれば準備完了です。




先ほどと同じようにコンパイルの設定をします。
Multifunctionプロジェクトフォルダを右クリックし、メニューの一番下にあるプロパティを開きます。
[C/C++Build]->[Settings]->[Build Steps]を選択

post-build steps の [Command]を入れる。

arm-none-eabi-size ${BuildArtifactFileName}; arm-none-eabi-objcopy -O ihex ${BuildArtifactFileName} ${BuildArtifactFileBaseName}.hex ; # checksum -d ${BuildArtifactFileBaseName}.bin;

要するにhexファイルを吐き出せという書き換えです。


左下に[Build 'Multifunction'[Debug]]というハンマーのマークのがあるのでクリックする。




LPCXpresso IDE は頻繁にVerUpしています。ワークスペースのバックアップをとっておき、後から入れ替えれば基本的には問題ないですが、CMSISもVerUpしているため上記手順を参考に最新の物を使う方が良いかもしれません。