左右クランクとSeatTube上死点センサの位相を合わせるプログラム作りで一苦労しました。
データ処理を位相精度よくできるようにしないと、パワー計算精度が低下してしまって
パワー精度の検証ができませんので、基板作りより時間と手間をかけてます。
来年までSeatTube型パワーメーターの実試用試験するので、使い勝手も含めたVBAプログラムに
手間をかけて作ってます。
●苦労した点
①データ数が多く、グラフ描画が非常に遅い
対策1=>DIPLAYの解像できるドット数までグラフデータを間引いて表示することで速度向上した
せいぜい時間軸1000ドット程度なので、1万行以上のデータを1000行に間引いて
グラフ描画することで使えるレベルまで描画を早くしました。
➁各種対策してもまだ、1万行で数か所データ欠落が発生して位相がずれる
対策2=>エラー処理関数を作って、順番とサンプリング周期が飛んでしまったデータを削除して
タイムスタンプとデータが一致しているとして散布グラフを描く方向でエラー対策
③3CHの位相合わせのやり方のプログラムで苦労した
対策3=>エラー修正してから、データを間引いて、プロットして、さらに拡大、時間シフト操作しながら目視で3CHのクランク角度位相を合わせるプログラム手間どりました。
④VBAの散布グラフに慣れない
対策4=>EXCELのグラフは、オブジェクト部分とチャート部分に分かれていて、オブジェクトで指定してもエラーになってしまいます。このことが分からないでずいぶん試行錯誤しました。
更に、VBAのグラフの書き方の事例検索しても散布図の多CHをいろいろいじるプログラム例があまりないので苦労しました。本記事で備忘録しておきます。
●本プログラムの機能
機能 | 備忘録 |
①CSVファイル読み込み | CSVのフォーマットを管理すること OpenFileName = Application.GetOpenFilename(“*,*.csv?”) Workbooks.Open OpenFileName |
➁マイコンmbed側3CHデータファイル管理 ・SeatTube:NucleoF446REからUSBシリアルで115200bpsFlow無転送 2PM2019_Xbee_446re_AD7193_LSM9DS_rev04
・左右クランク:STM32F103T8C6からXbee115200bps HardwareFlow制御で無線送信
|
●SeatTubeデータ: 1ch=ひずみmV 2ch=上死点センサ値 3ch=タイムスタンプ秒 ●Left,Rightクランクデータ 1ch=トルクひずみmV 2ch=IMU角度センサ値deg 3ch=データNo 4ch=タイムスタンプ秒※サンプリングは、mbedのTicker APIで 6msec周期で統一してタイムスタンプつけて転送 |
③データ欠落エラー処理 | 周期6msecで飛んでいる行を削除 |
④散布グラフ描画高速化 | 時間軸を1000ドットで1ドットー>1データとする間引きを選択して描画 |
⑤位相合わせ操作性 | 各CHのシフト時間を入力して、グラフをみながら位相を合わせて、全データ範囲でピークがあっているか検査作業する |
⑥位相合わせ済みのデータファイルの使い方 | 後で位相操作を再度繰り返しできるデータ構造 |
⑦位相合わせ後のデータのピーク位置検出 | ピークを自動検索して、ペダリング波形の左右の切り分けと周期位置を管理 |
⑧左右SeatTUbeひずみ波形を仕事量計算 | 左右クランクとSeatTubeの波形が一対一で比較できるように表にする |
⑨左右クランクとSeatTube仕事量の相関係数 | 相関がどこまで高くなるか計算 |
●プログラム
PM2019_3CH_PowerCal_rev000
使うデータ3ファイルRight_COM4_20191011_102207CSV
エラー処理しても、大きく欠落していると、位相ずれが数十msec発生してしまってます。
積分計算は、位相ずれのない部分を選択的に採用して精度を管理していかないといけないようです。
まず最初に合わせて最後まで位相がずれてないか調整
最後のほうで100msec1未満でクランク間で位相ずれがでてしまってます。