左右クランクトルク波形を計測できたのですが、9回転に一回周期で右左波形がさなってしまうという現象、通常では、代わりばんこに踏んでいるはずなので、あり得ないので、原因を解析してます。
●原因系振り分け:
検査項目 | 結果 | |
マイコン系 | ①リアル転送速度 タイマー精度 |
ATMEGA328P 8MHzでは、4msec周期のシリアル転送は無理で、7~9msec周期で安定するが、累積時間で最大100~50msecズレが発生する |
②左右のクロックズレ | 左右CPUで正弦波を発生させても、位相ズレは一定で累積ズレは発生しない。 | |
クランク系 | ③クランク角度とトルクグラフ | 角度測定準備 |
④トルク波形と分力クロストーク | 分力 キャリブレーション |
●解析でやったこと
①タイマー割り込みの確認
●調査:arduino MStimer2ライブラリーを使っているので、割り込み時間誤差がでているのではないかと検索調査。
Arduinoで時計を作っている人が精度でトラブルが多いのでみてみるとこちらのラジオペンチ様のブログ
http://radiopench.blog96.fc2.com/blog-entry-278.html
解決:割り込み処理中に割り込み禁止になっていたので
割り込み処理中も割り込み許可に設定したら、誤差が
日差5秒程度まで改善。
原因:針を回すモーターの周期23msecがずれる。1秒間隔の割り込み処理時間中にモーターのタイミングがでない
●プログラムチェック
割り込み関数flash内でAD変換とSerial転送をしてます。
AD変換は高速ですが、Serail転送時間が遅いので、
割り込み周期を超えてしまっているかもしれません。
#include <MsTimer2.h>
int analogPin = 0; //Lt1167 output ピン void flash() { void loop() } |
●ATMEGA328P 8MHz 115200bpスループット
割り込み無し、LOOP内でシリアル転送をしてスループットを測定しました。なんと、4~7msecでしか転送できてませんでした。つまり4msecで転送すること自体が無理でした。
#include <MsTimer2.h>
int analogPin = 0; //Lt1167 output ピン void loop() } |
●割り込み無しでタイミングを自分で作ってみた
シリアルの時間がばらつくので、その時間以上の一定値で転送周期を設定するプログラムを作った
int analogPin = 0; //Lt1167 output ピン int torque = 0; int flag; unsigned long time0; unsigned long time_1; void setup() { Serial.begin(115200); //Xbee シリアルの設定 } void loop() { |
これで累積誤差を測定すると9msecが累積精度が良いので
9msec周期に変更して解析を進めてみることにしました
●周期を9msecにして周期の重なりはなくなるか?
母艦マイコンの影響をなくして、右左ともXbeeをPCへUSBシリアル接続してUSB2ポートでサンプリングしたので、
同期的には、ATMEGAの要素しかでないはず。
考えられるズレ要素を排除したが、14波形に一回、左右位相が重なってしまう現象が残っているので、タイミングの累積時間が5分累積で100msec程度なので、数秒程度で位相が1周期ずれるには、1周期600-900msecずれないといけないので、説明がつきません。
●左右のCPUでクロックがずれて位相ずれが発生するのか?
SIN波形を左右で発生させてXbee経由で受信してみましたが、上記ペダリング波形で発生するような位相ズレは発生しませんでした。
●考察
①マイコンタイマー系の誤差は対策しても位相の重なり現象は説明がつきません。
②クランクの角度位置を精度よく検出して、トルク波形と関係を明確にする必要がある
③クランクのトルク波形が、クロストークがなく左右本当に出力されているか確認する必要がある。
●以後
左右クランクの波形の位相精度まで追求すると、ATMEGA328P8MHZ程度では性能が不足することが判りましたが、
他に手ごろなサイズのマイコンがないため、これでしばらくみていきます。精度よく測定することは、結構手間どりますので
10月までこつこつと積み重ねていきます。