FrontPage
2013/03/09からのアクセス回数
今回も大野さんの本のお復習いをしています。
温度センサー http://www.tij.co.jp/jp/lit/ds/jajsb56/jajsb56.pdf を見るとLM35Dは、
と記載されています。 リニアーに10.0mV/℃なら50℃では、0.5Vが観測されるはずです。
例題13では、LM35DZの測定範囲の半分(50℃)でPSoCのBandGap1.3VになるようにPGAの倍率を 計算しています。
0.5V x 2.667 = 1.3335V }}
ADCINC(12bit)が以下のようにセットすると50℃では、1.3335 x 2047/1.3 = 2100となります。
図8-66を参考にブレッドボードを組み立てます。
LM35には、P0[5]からREFHI(2.6V)を供給し、REFHIを測定するために、RefMuxを使ってP0[2]に出力しています。
ポート番号とピンの対応は、以下の図を参考にしてください。
以下のユーザモジュールを配置します。
ADCINC_1の設定は以下の様になっています。DataFormat: unsigned, Resolution: 12bitです。
PGA_1の設定は、Gainを2.667, InputをAnalogColumn_InputMux_0にセットし、P0[5]と接続しています。
RefMux_1の設定は、REFHIをセットし、出力をP0[2]に接続します。
ピンの設定では、P0[5]をStrongで初期値を1にセットするのがポイントです。
main.cはそのまま大野さんのプログラムを拝借しました。
char strg[] = "ONDO 00.0 ";
int read_adc(void) {
}
char htoc(int ch) {
}
void main(void) {
PRT0DR |= 0x40; // モニタ
PRT0DR &= ~0x40; // モニタ
} }}
早速動かしてみましょう。
リファレンスの実測値は、2.6Vではなく2.570Vでした。
Raspberry Piと接続するためにI2CスレーブをPSocのブレッドボードに追加します。
ユーザモジュールEzI2Csを配置します。
EzI2Csの設定は、I2Cのアドレスには0x20(32)をセットし、以下の様にしました。
EzI2Csを使うことによってI2Cマスターからは、PSoCがEEPROMと同じように扱うことができます。
テストのために、EzI2Cs用のバッファを以下のように定義します。 msgは、LCDの3段目に出力する文字列で、ivalはLM35から読み取った値をリードオンリーとします。
struct I2C_Regs {
} myI2C_regs = {
}; }}
EzI2Csを追加したことによるmain関数の変更は、変数宣言直後の以下の部分と
}}
forループの最初にivalの値をmyI2C_reg.ivalにコピーする以下の部分です。
}}
PSoCとRasperry Piとの接続は、以下の様にします。
さっそくRaspberry PiのI2C Toolを使って動作を確認してみましょう。
最初にPSoCのI2Cスレーブを認識するところから、i2cdetectを使ってデバイスをスキャンします。 無事0x20が検出できています。
$ sudo i2cdetect 0 WARNING! This program can confuse your I2C bus, cause data loss and worse! I will probe file /dev/i2c-0. I will probe address range 0x03-0x77. Continue? [Y/n]
00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: 20 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- -- }}
次に"H"をPSoCに送ってみます。
$ sudo i2cset -y 0 0x20 0x00 0x48 # H $ sudo i2cset -y 0 0x20 0x00 }}
最終目的の温度を読み取ると、
$ sudo i2cget -y 0 0x20 0x08 w 0x1a04 }}
バイトが入れ替わっているので、正しい値は0x041aが正常に受け取れていることが確認できました。
皆様のご意見、ご希望をお待ちしております。