FC2ブログ
2018-08-31 13:36 | カテゴリ:PIC応用回路

PIC 16F1716から16F188757へのプログラムの移植をすることになりました。
理由は、機能追加に際して、プログラムメモリー(8KB)が不足したからです。


(PID6-01)
PID6-01.jpg



どちらのPICも、MCC(マイクロチップ・コード・コンフィギュレータ)が利用できましたので、移植そのもの難しくありませんでした。

1、MCCで必要な機能(モジュール)を組み込み、PICをアサインし、モジュールの設定(AD変換やi2cなど)をする。
2、16F1716のユーザプログラムをmainとtmr0関数に。コピーした上で、調整する。

の手順で行けると踏みました。


続きは、、、、


メモリーだけは潤沢に使用できそうです(笑)


(PID6-02)
PID6-02.jpg





ちょっと戸惑ったのは、AD変換モジュールの設定の所で、16F1716では、シンプルなAD変換だったのですが、16F18857では、ハードで、AD変換の複数サンプリングや、平均値を求めたり、の計算まで設定でできるようになっていたことです。


これが今まで使用してきたAD変換の設定の画面(MCC)です。

(PID6-03)
PID6-03.jpg



そしてこちらが新しいAD変換の画面です。

(PID6-04)
PID6-04.jpg


新しい設定項目がありました。

新機能に関しては、おいおい調べて使用することとし、まずは通常の設定で使用する事にしました。
多少、間違いもあり、しっぱいしつつも、これまでの機能を実現できるようになりました。

所が、どうも変です。

VRからAD変換で電圧を読んで、車両走行のSpeedを設定する際の、肝心のAD変換の値が変です。
VRを触らないのに、AD変換の値が勝手に大きく変動します。


(VR変換値が変動する動画)



動画でもわかる通り、VRを触ってもいないのに、AD変換値(Txxxの値)が大きく変動しています。
このAD変換は、main関数の中で実行しています。
ちなみに、速度制御のBEMFを計測する部分のAD変換は、tmr0のタイマー関数の中でAD変換しています。

これは困りました。
考えられる原因を上げてみました。

1)AD変換モジュールの設定ミス。
2)main関数の中での割り込みの原因で。

所が、tmr0のパルス制御関連のプログラムを切り離し、main関数の最初で、AD変換だけをテストすると、ちゃんと安定したAD変換が出来ていました。

1)のAD変換設定の問題ではなさそうです。


続いて、タイマー割り込みが悪さしているかもしれないので、AD変換の前後で、タイマー割り込みを使用しない設定にプログラムを書き換えましたが、ダメでした。
しかし、tmr0のルーチンの中で行っているAD変換は、問題ない状態です。
ひょっとしたら、列車を駆動させるパルスのノイズかもしれないと思い、リード線をシールド線に変えてみました。

(PID6-05)
PID6-05.jpg


これを変えて、


(PID6-06)
PID6-06.jpg


こうなりましたが、、、、   ダメでした。


ここで一つ思い当たりました。
tmr0でのAD変換は、駆動パルスを打ち終わって、BEMFを計測している状態で行われています。
つまり、高電圧の駆動パルスは、OFFの状態です。

問題のmain関数のAD変換は、駆動パルスのON/OFFが起動されている間、ずっとAD変換されています。
原因は、この駆動パルスかもしれません。

そこで、速度指定のAD変換を駆動パルスがOFFになってから行うようにプログラムを変えました。

大正解です。
AD変換は安定して行われました。


(安定したAD変換の動画)



PICの機種によって、AD変換の安定性がこれほど変わるとは思いませんでした。
またまた、勉強になりました。


やっと、これから係数の自動計測の部分のプログラム作成に入れます。
関連記事

管理者のみに表示する