PIC−USBIO using BASIC
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
USBインターフェースを内蔵したPICを使ってWindowsパソコンで外部回路を制御するための各種I/O基板の製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第125回]
●PICUSBIO−03(74)SPIモード(6)DAコンバータMCP4911(3)各モードの波形
前回はPICUSBIO−03とMCP4911を接続してMODE0(CKE=1、CKP=0)でWRITEコマンドを送った結果、送出したデジタル値に相当するアナログ電圧出力が得られました。
[第123回]で検討した結果ではMODE0のほかMODE3でもよさそうです。
MODE1とMODE2は多分駄目ではないかと思われます。
それは推測です。
ここはしっかり確認しておくべきでありましょう。
こういうときはやっぱりCPLDロジアナの出番です。
前回のプログラムをもとにして出力波形観測用のプログラムを作りました。
30行でSSPSTATに$00を設定しました。
CKE=0です。
40行でSSPCON1に$23を設定しました。
CKP=0です。
MODE1の設定です。
50行と60行でSSPBUFに$35、$55を書き込みました。
SDOの波形がビットごとにHLになってSCKと対比し易い値にしました。
プログラムを実行して出力波形をCPLDロジアナで確認しました。
CPLDロジアナについては「CPLD入門」[第148回]を参照してください。
PROBE0はRC0(CS)です。
PROBE1はSCKです。
PROBE2はSDOです。
SDOは00110101になっています。
CKP=0はSCKが正論理出力波形になります。
CKE=0はクロックの立ち上がりでSDO出力が変化します。
こちらは下位8ビットの出力波形です。
PROBE2(SDO)はPROBE1(SCK)の変化に合わせて01010101になっています。
出力データは$555(010101010101)ですが2ビット左にシフトしているので左から10ビットを取り出して本来のデータに直すと$155(10進数の341)になります。
この値から計算で求めたMCP4911のアナログ出力電圧は
5*341/1023=1.667V
になります。
しかしロジアナ波形で確認できる通りCKP=0、CKE=0(MODE1)はSCKの立ち上がりに同期してSDOが変化しますがMCP4911もSCKの立ち上がりでSDO(=SDI入力データ)をラッチするのでこれでは値が正しくラッチできない道理です。
実際にMCP4911からの出力電圧は入力に反応しないか計算値から全く外れた値になりました。
ところで。
せっかくロジアナでクロックの波形が見えていますからSCKの周波数を確認しておきます。
前回書きましたようにSCKにはTimer2の出力の1/2のクロックを使っています。
その周波数は前回計算して求めました。
12000/16/255/2≒1.47KHz
この逆数が周期になります。
1/1.47≒0.68(msec)
PROBE1(SCK)の1周期は700μsecほどですから計算通りのクロックと考えてよいと思います。
テストを続けます。
40行のSSPCON1の値を$33に書き換えました。
CKP=1です。
30行のSSPSTATは$00のままです(CKE=0)。
MODE3の設定です。
プログラムを実行しました。
CKP=1はSCKが負論理出力波形になります。
CKE=0は(負論理のときは)クロックの立ち下がりでSDO出力が変化します。
こちらは下位8ビットの出力波形です。
MCP4911はクロックが正論理でも負論理でもSCKの立ち上がりでSDO(=SDI入力データ)をラッチするので今回はデータのちょうど真ん中でラッチしていることになります。
実際にMCP4911からの出力電圧を測ってみたところ1.643Vでした。
上で計算した値は1.667Vでした。
その計算ではVcc=5Vとして計算しました。
今回Vccを測ってみたところ4.95Vでしたので再計算してみました。
4.95*341/1023=1.65V
です。
大体計算通りの出力が得られていると考えてよろしいでしょう。
テストを続けます。
今度は30行のSSPSTATを$40に、40行のSSPCON1を$23に書き換えました。
CKE=1、CKP=0です。
MODE0の設定です。
プログラムを実行しました。
CKP=0はSCKが正論理出力波形になります。
CKE=1は(正論理のときは)クロックの立ち下がりでSDO出力が変化します。
こちらは下位8ビットの出力波形です。
MCP4911はクロックが正論理でも負論理でもSCKの立ち上がりでSDO(=SDI入力データ)をラッチするので今回もデータのちょうど真ん中でラッチしていることになります。
実際にMCP4911からの出力電圧を測ってみたところ先ほどと同じ1.643Vでした。
最後のテストです。
40行のSSPCON1を$33に書き換えました。
30行のSSPSTATは$40のままです。
CKE=1、CKP=1です。
MODE2の設定です。
プログラムを実行しました。
CKP=1はSCKが負論理出力波形になります。
CKE=1は(負論理のときは)クロックの立ち上がりでSDO出力が変化します。
こちらは下位8ビットの出力波形です。
最初のテスト(CKP=0、CKE=0、MODE1)と同様にSCKの立ち上がりに同期してSDOが変化しますがMCP4911もSCKの立ち上がりでSDO(=SDI入力データ)をラッチするので値は正しくラッチできません。
実際にMCP4911からの出力電圧は入力に反応しないか計算値から全く外れた値になりました。
PIC−USBIO using BASIC[第125回]
2022.12.10upload
前へ
次へ
ホームページトップへ戻る