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が次の出力の値となります。 とりあえずは、回路とプログラムは出来た。 ガワをどうするか決めてないけど・・・ あと実装する時は、 プログラムを書き換えられるように しておいた方がいいかな??? ということで、次回に続く。。。(続くのか?) |