左右トルク波形データ、別々のTeraTermログでのタイムスタンプ時刻が、mbedのタイマーとタイミングが合っているか基礎実験で確認してみました。
●本記事の方法では精度がでてましたが、
=>その後PC側の負荷によって、バッファ状況がかわってしまうことが判りました最悪数十msecずれてしまう場合が発生しているのでPCのタイムスタンプではダメでした。
★最終的に、同期信号もマイコンで外部クロック(TCXO)を使って正確な時刻をタイムスタンプさせてそれを送信データと一緒にしてPCへ受信させて解決することにしました。
=>msecオーダーで多CHセンサを複数のマイコンで計測する場合、マイコン内部クロックの精度誤差で、累積誤差が何分も測定する間にマイコン間で数10msecズレてします。
インターネット、GPSで同期をとる手もありますが、数100msec毎の同期信号しかえられないので、マイコンの周期と合わせるのが大変なので発生元のクロック精度を限りなく上げることが実験データの信頼性の基本だと考えてます。
●方法
2個のマイコンNucleoL432KCを同期させるために、500msecに一回タイマーをリセットしてそのタイミングで、基準マイコンからDigitalOutしてスレーブマイコンがピン割り込みでエッジ検出した直後にタイマーリセットします。同期と言っても数μSEC程度のズレがでますが本測定が4msec周期なので、同期としては数μsecなら十分です。
①基準マイコンのPgm備忘録
#include “mbed.h” Serial pc(USBTX,USBRX); Ticker tick1; Ticker tick2; DigitalOut rst(PA_8,0); Timer t1; void flip1(){ pc.printf(“%d\n\r”,t1.read_us()); } void flip2(){ rst=1; wait_us(500); rst=0; t1.reset(); }int main() { pc.baud(115200); t1.start();tick1.attach_us(&flip1,1000); tick2.attach_us(&flip2,500000); while(1) {} } |
②スレーブマイコン側のPgm備忘録
#include “mbed.h” Serial pc(USBTX,USBRX); Ticker tick1; InterruptIn rst(PA_8); Timer t1; void flip1(){ pc.printf(“%d\n\r”,t1.read_us()); } void flip2(){ t1.reset(); }int main() { pc.baud(115200); rst.mode(PullDown); t1.start(); tick1.attach_us(&flip1,1000); rst.rise(&flip2); while(1) {} } |
●測定結果
①スタートからmbedタイマーとのズレ
TeraTermタイムスタンプは、0~200msecまでは、mbedタイマーとは全く追随していないが、300msec以降は、次第に追随してくる
②TeraTermタイムスタンプで左右CHの同期ができるか検証
右基準でスタートさせたのち、5秒遅れで左をスタートさせた場合、右基準で500msecに一回タイマーリセットをかけて、右から左へ同期信号をおくって、左もタイマーリセットをおこなう。その時点での両者のTeraTermタイムスタンプが一致すれば、タイムスタンプ値で両CHの同期が管理できるはず。
●結果
上記表をみると、左がスタートしてから500msecだとTeraTermタイムスタンプ間で4msecのズレが発生しているが、1秒後は、1msecのずれとなっているので、スタートしてから1秒以後で、右と左の同期は、TeraTermタイムスタンプを合わせれば、RとLの波形のズレなくタイミングを合わせること可能なことが判った。
●左クランク組立ほぼ完了
お盆前に左右クランクでの波形比較までできそうです。
お盆中に風速計を完成させたいので、パワーメーターを
一段落させたいです。