lbed

2013/08/11からのアクセス回数 6626

LPC1343学習基板に戻って

cortex-m3の勉強のために買った「ARMマイコンパーフェクト学習基板の使い方」をlbedを使うとどのくらい簡単に なるかを試してみます。

実験に使用するのは、以下の3つです。

汎用入出力GPIOの使い方編

lbedにはまだ汎用入力クラスがありませんので、この機会に作成しました。 詳しくは、lbed/08a-ARM学習基板用追加クラスを参照してください。

実験開始

ジャンパP4の3と4、31と32にジャンパーをセットし、タッチエリアに触れるとLEDが点灯するテストプログラムを作ります。

タッチセンサーPCF8883の出力オープン・ドレインHigth *1 なので、LPC1343の入力ピンは、プルダウンモードにセットする必要があります。 *2

TouchSensor.png

テストプログラムTestSwitch.cppは、以下の様になります。 タッチセンサーに触れるとLEDが点灯し、離すとLEDが消えれば成功です。

#include <cr_section_macros.h>
#include <NXP/crp.h>

// Variable to store CRP value in. Will be placed automatically
// by the linker when "Enable Code Read Protect" selected.
// See crp.h header for more information
__CRP extern const unsigned int CRP_WORD = CRP_NO_CRP ;

#include "lbed.h"

int main(void) {
    wait_init();
    DigitalOut     myled(LED2);
    DigitalIn     sw(P2_4);
    sw.mode(PullDown);
    while(1) {
         myled = sw;
    }
}

USB仮想シリアルポートを使う

LPC1343では、USBをサポートしており、例題にもCDC(USB仮想シリアルポート) を使っています。

そこで、SerialクラスのサブクラスとしてSerialCDCを作ってUSB CDCを使えるように しました。 *3

USBの実験にはトランジスタが必要

当初、ARM学習基板のトランジスタを付けないでUSB CDCのテストをしたら、 上手く動作しませんでした。本を調べて見るとUSB D+ラインのプルアップ制御に トランジスタ2SA1015が必要だと分かり、急遽取り付けました。

Add_TRG.png

テスト用のソース

テスト用のプログラムとしてTestCDC.cppを以下の様に作成しました。 USB CDCが認識されるまで、少し時間がかかるため、最初にキー入力 を待つことにしました。 *4

#include <cr_section_macros.h>
#include <NXP/crp.h>

// Variable to store CRP value in. Will be placed automatically
// by the linker when "Enable Code Read Protect" selected.
// See crp.h header for more information
__CRP extern const unsigned int CRP_WORD = CRP_NO_CRP ;

#include "lbed.h"


int main(void) {
     wait_init();
     DigitalOut myled( LED2);

     SerialCDC pc(USBTX, USBRX);
     pc.baud(9600);
     // キー入力を待つ
     pc.read();

     pc.println("Hello");
     while (1) {
          char c = pc.read();
          pc.write(c + 1);
          myled = !myled;
     }
     return 0;
}

Arduinoのシリアルモニターに出力した様子を以下に示します。 &ref(): File not found: "CDC_Screen.png" at page "lbed/08-ARM学習基板で実験";

アナログ入力を試す

アナログ入力クラスAnalogInも追加しました。 *5

ジャンパ線の設定

ARM学習基板は、いろんなチップのてんこ盛りなので、実験をするにはジャンパ線で 接続しなくてはなりません。 *6

本の8章、図1からピンの設定の図を引用します。

Fig8_1.png

P3には、U2から取った基準電圧1.25Vと電圧測定用のOPアンプU3を使って、電圧が供給されています。

に接続されています。

次に、P3とLPC1343の接続について、本の8章、図2を引用します。 OPアンプは、非反転増幅回路となっており、ゲインGは、 \( G_{NI} = \frac{R_1 + R_2}{R_1}\) となることから、P3のCh6, Ch7に入力された電圧は、AGNDとの差が 11倍に増幅された値にAGNDを加算された値がADコンバータの入力電圧 となります。 *7

Fig8_2.png

アナログ回路の動作確認

P3の3番ピンCh6に安定電源1.8Vを半固定抵抗で1.308Vに減圧して入力としました。 $$ V = (1.308 - 1.25)*11 + 1.25 = 1.888 $$ が、Ch6の予想結果です。

ADC_Test.png

テストプログラムTestADC.cppは、Printクラスの#if文を有効にして使いました。*8

#include <cr_section_macros.h>
#include <NXP/crp.h>

// Variable to store CRP value in. Will be placed automatically
// by the linker when "Enable Code Read Protect" selected.
// See crp.h header for more information
__CRP extern const unsigned int CRP_WORD = CRP_NO_CRP ;

#include "lbed.h"

int main(void) {
    wait_init();
    DigitalOut myled(LED2);
     SerialCDC pc(USBTX, USBRX);
     pc.baud(9600);
     // キー入力を待つ
     pc.read();

    AnalogIn     agnd(P1_2);
    AnalogIn     dc(P1_10);
    while(1) {
         int     d0 = agnd.read_u16();
         int v0 = 1250*1024/d0;
         int     d1 = dc.read_u16();
         int v1 = v0*d1/1024;
         pc.printf("Ch3:%04d[VDD=%04dmV]  Ch6:%04d[%04dmV]\n", d0, v0, d1, v1);
        myled = ! myled;
        wait_ms(1000);
    }
}

出力結果は、以下の様になっています。1.896mVと予想と近い結果が出ています。

ADC_Screen.png

まだ途中です!

コメント


(Input image string)

*1 ON時にHightレベルが出力され、OFF時にはハイ・インピーダンスになります
*2 あるいは、プルダウン抵抗を付ける方法もあります
*3 詳しくは、lbed/08a-ARM学習基板用追加クラスを参照してください。
*4 コンパイルには、ForSerialCDC_usbhw.cをTestCDC.cppと同じディレクトリ入れて下さい
*5 詳しくは、lbed/08a-ARM学習基板用追加クラスを参照してください。
*6 その分、各チップを別の実験に使うことができるようにCPUと切り離されています
*7 トラ技2013/8号のエレキ数式も便利です
*8 サイズが大きくなりますので、注意してください

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
SmartDoc