Darkside(リンクエラー修正しました)

2019年2月4日(月) 21:42

タイミングフラグ

 新方針に対応するプログラムを作り、PICを動作させる。しかしPWMが発振しない。
 ああそうだ、ボタンを押している間だけ発振するより本番に近いプログラムにしたんだった。

 ボタンを押すと、PWMが正常に発振した。ところが今度は、ボタンを離しても発振が停止しない。
 そればかりか、AD変換値の更新も停止したように見える。
 LEDで確認したところ、PWMが発振を開始すると、なぜかメイン処理が止まってしまうようだ。

 しばし悩み、ようやく思い出した。
 割り込み処理ルーチンは、それを抜けるまでメイン処理を止めてしまうということに。
 本番に近づけた今回のプログラムは、PWM割り込み処理中でタイミングフラグを上げ下げしている。それが間違っている。割り込み処理が終わるまでメイン処理は止まっているのだから、フラグを上げ下げしてしまうとメイン処理からは常にフラグが下がった状態しか観測されない。

 タイミングフラグを、反転させるだけに留めておくのが正解。

 メイン処理のポーリングでは、タイミングフラグの状態が変化する瞬間を検出する。そしてその直後からAD変換を開始させる。
 これで、完全に意図通りに動作するようになった。

 充電開始は、PWM発振を開始させる。充電停止は、PWM発振を停止させる。停止させると割り込みも発生しなくなるがサージも発生しなくなる。
 そこでAD変換値取得ルーチンの先頭で、PWMが発振中かどうか確認する。発振中ならタイミングフラグの状態が変化するまで待ち、停止中なら何もしない。そしてAD変換を開始。スッキリした流れで処理を記述できるようになった。

 バッテリー電圧は急変するものではないので、直近256サンプルの平均値を利用するような副次的修正を加える。初期値が0.04Vぐらい低めに出るが、電圧を低く判定するとPWM周期が長くなりピーク電流が過大になる。初期処理に操作を加えるのがベターだろう。
 いずれにしろバッテリー電圧のサンプリングは充電停止中も行うので、電源投入直後の数秒で値は安定するのだが。

 こういう重箱の隅をつつくような改善を容易にできるのは、マイコン使用のメリットだ。

written by higashino [ラジコン用エアガン] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL

Comments

TrackBacks

Darkside(リンクエラー修正しました)

Generated by MySketch GE 1.4.1

Remodelling origin is MySketch 2.7.4