PIC−USBIO using BASIC
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
USBインターフェースを内蔵したPICを使ってWindowsパソコンで外部回路を制御するための各種I/O基板の製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第124回]
●PICUSBIO−03(73)SPIモード(5)DAコンバータMCP4911(2)プログラムを作成して出力電圧を確認
MCP4911にWRITEコマンドを出力するプログラムを作成しました。
10行でTRISBに$10を設定しています。
SDIはRB4と端子を共用していてSCKはRB6と端子を共用しています(SPIの各端子の共用については[第122回]を参照してください)。
SDIの向きはData Sheetではモジュールによって自動的に設定されると書かれているのですが([第122回]参照)念のためTRISBで入力に設定しておきます。
RB4が入力RB6が出力(そのほかはとりあえず出力)ですからTRISB=$10です。
SDOはRC7と端子を共用しています。
今回はMCP4911のCS制御にRC0の出力を使います。
RC7とRC0が出力(そのほかはとりあえず入力)ですから20行ではTRISCに$7Eを設定しています。
実際にMCP4911にWRITEコマンドを送るまではCSはHにしておくべきですから25行でRC0=1を出力します。
26行でT2CONに$FFを設定しています。
Timer2のところでは説明していませんでしたがTimer2はSPIのクロックとしても使われます([第103回]12.3 Timer2 Output(英文)参照)。
SSPCON1のbit3−0に0011を設定するとSPIのクロックとしてTimer2出力の1/2のクロックが選択されます(SSPCON1は[第120回]参照)。
T2CONは[第103回]で説明しました。
$FFを設定すると、プリスケーラの分周比が1:16になります。
ポストスケーラも1:16になりますがSPIのクロックとしてはポストスケーラは無視されます([第103回]FIGURE12−1参照)。
Timer2(TMR2)はFosc(48MHz)/4のクロックをプリスケーラを経由してカウントしPR2の値と比較し一致するとその信号をMSSP(SPI)モジュールに送りTMR2をクリアしてカウントを続けます。
上のプログラムではPR2の設定はしていませんがT2CONを設定するとPR2には$FFが初期設定されます([第103回]12.1 Timer2 Operation(英文)参照)。
上記の設定でTimer2をSPIのクロックとしたときのSCKの周波数を計算してみます。
12000/16/255/2≒1.47KHz
です(この値についてはのちほど確認してみます)。
ここでSCKとしてTimer2の出力を使ったのには2つの理由があります。
1つはSPIのCLKとしてTimer2の出力を使うことができることの確認です。
もう1つは後でSCKとSDOの波形をオシロスコープかロジアナで確認するつもりなのですがそうするとTimer2以外のクロックでは周波数が高すぎて観測しづらいからです。
プログラムの説明の続きです。
30行でSSPSTATに$40を設定しています。
40行ではSSPCON1に$33を設定しています。
SSPSTATとSSPCON1は[第120回]で説明をしています。
SSPSTATはCKE(bit6)=1にします。
SSPCON1はSSPEN(bit5)=1、CKP(bit4)=0にします。
CKE=1、CKP=0は前回確認したMODE0の設定です。
またSSPCON1<bit3:0>=0011にしてクロックソースをTMR2にします。
そこまででSPIの設定は終わりです。次の45行からはMCP4911へのWRITEコマンドの送信処理です。
45行でRC0=0にしてMCP4511のCSをLにします。
最初は46行をそのまま実行してみたのですがこれは駄目でした。
よくよく考えてみたらここに46行があるとプログラムが先に進みません。
46行、55行、65行はBFビットをチェックしています。
SSPBUFに送信データを書く前にはBFビットをチェックする必要があるのですが最初のデータを送信するときだけは送信前にはBFビットは1になりません。
そのことがわかったので46行はコメント文にしました。
50行と60行はWRITEコマンド(及びデジタル値)の送信です。
第1バイトの上位4ビットはつねに0011です。
その次から10ビットがデジタル値です。
$800ですがMCP4911では2ビット左にシフトしていますからそれを元に戻すとMCP4911に与えるデジタル値は$200(10進数の512)です。
Vcc=5Vですから計算で求めたアナログ出力電圧は5*512/1023=2.502Vです。
実測値は2.473Vでした。
ちょっと低い値です。
実はVccはUSBケーブルから得ていました。
正確な+5Vが得られるとは限りません。
あらためてVccを測ってみましたら4.97Vでした。
意外にいい値が出ています。
4.97*512/1023=2.487Vになりました。
まだ実測値のほうがやや低いですけれどまあこんなものだと思います。
念のためにほかの電圧も出力してみました。
50行を書き換えて$3Cを出力しました。
60行はそのままです。
送信したデジタル値は$300(10進数の768)です。
計算で求めたアナログ出力電圧は4.97*768/1023=3.731Vになりました。
実測値は3.710Vでした。
もうひとつ確認してみました。
今度は50行を書き換えて$34を出力しました。
60行はそのままです。
送信したデジタル値は$100(10進数の256)です。
計算で求めたアナログ出力電圧は4.97*256/1023=1.244Vになりました。
実測値は1.236Vでした。
PIC−USBIO using BASIC[第124回]
2022.12.9upload
前へ
次へ
ホームページトップへ戻る