2018/01/04(THU) 【Nチビ】SPD2:ホールIC実装とプログラム
はい、引き続きスピードメータ第2弾やってます。
サーボモーターの制御まで出来たので
次はホールICの入力割り込みの実装ね。
ホールICってのは、簡単にいうと磁力センサーね。
車輪に付けた永久磁石が一定時間で何回通過するかで
時速を求めるわけだ
で、PIC16F627ではPORTBの割り込みで実装したんだっけな?
今回使っているPIC12F1822は・・・
ん?PORTの割り込みってどうやんだ???
さんざん調べたら、RA2ピンがINTってので
入力割り込みが使えるらしい
で、ブレッドボードで回路作って実験。
フォト

確認用のLEDが残ってますが
無事に動作しました。

最終的に回路はこんな感じ。
フォト

シンプルですね。
マイコンの足も電源以外は2本しか使わないし
ホールICとサーボモーター以外部品を使わない

で、プログラム。
TMR0はホールICの入力のチャタリング対策に利用
TMR1は時速を求めるためのタイマー
TMR2はPWMに使用
RA2で入力割り込みって感じ

順にコードを見ていきましょう
フォト

まずは最初のコンフィグ
PIC12F1822は高性能なんで設定項目が多いです

フォト

定数宣言はTMR1の初期値だけ
変数宣言は30行からです
SPD_TBL0〜3でホールICの割り込みをカウントしていきます。

フォト

46行目がプログラムスタート。お約束でGOTOしています
49行目が割り込みルーチン
TMR0の割り込みだったら
チャタリング対策のフラグをクリアします。
32.640 ms毎に繰り返します
なので、この間連続で割り込みがあっても無視します。
32.640 msだと対策になってないかな?
あとで調整するかも?

フォト

TMR1の割り込みだったら
出力するためのフラグを立てます

フォト

入力割り込みだったら
SPD_TBL0〜3をカウントアップします
92〜95行目です

フォト

107行目が初期化ルーチン
OPTION_REGではTMR0のプリスケーラを
256倍と設定しています
112行目はTMR1を使う設定
OSCCONで内部クロックを2MHzに設定しています
TRISAでRA2のみ入力と設定

フォト

WPUAはプルアップ設定らしいんだけど
よくわかんないので全部0
ANSELAはポートのアナログ設定かな?
とりあえず全部0
APFCONで、PWMの出力をRA5に設定
CCPR1LとCCP1CONではPWMの設定
デューティーサイクルの設定とかしています
T2CONはPWMの周期を20msに設定

フォト

142〜147行でTMR1の設定
808.752 msの周期で割り込みを発生するように設定
この周期でSPD_TBL0〜3の4枚の領域を
切り替えていきます。
808.752×4=3235.008ms
この時間1カウントあったら
サーボモーターが1単位分と動くようになってます。
つまり
0カウントなら-90°に
59カウントあったら90°
動くようになっています。
153〜159行目はTMR0とTMR1を設定させてます

フォト

167〜168行目はタイマースタートさせてます
173行目からメインループです
TMR1割り込みで立てるSPDFLAGをみています

フォト

SPDFLAGが立ってたら
サーボモーターへ出力します。
SPD_TBLにカウントしてきた値を
PWMのデューティーサイクルの値に変換しています
(59-x)+16です。

フォト

205〜214行目はC言語で書いたら
 SPD_TBL3 = SPD_TBL2 ;
 SPD_TBL2 = SPD_TBL1 ;
 SPD_TBL1 = SPD_TBL0 ;
 SPD_TBL0 = 0 ;
となります。
1つずつコピーしています。
SPD_TBL3が次の出力の値となります。

とりあえずは、回路とプログラムは出来た。
ガワをどうするか決めてないけど・・・
あと実装する時は、
プログラムを書き換えられるように
しておいた方がいいかな???

ということで、次回に続く。。。(続くのか?)