Closed YazawaKenichi closed 1 year ago
最新の UART 出力は以下の通り
motor_start()
main_d_print
tim10.c > tim10_d_print() > encoder_length_left() = 0.00000, encoder_length_right() = 12885.43862, encoder_length() = 6442.71931
tim10_d_print() > velocity_left = 0.000, velocity_right = 12.885, velocity = 6.443
tim10_d_print() > length_left = 0.000, length_right = 89437829.449, length = 44718914.725
main_d_print
tim10.c > tim10_d_print() > encoder_length_left() = 0.00000, encoder_length_right() = 12885.43862, encoder_length() = 6442.71931
tim10_d_print() > velocity_left = 0.000, velocity_right = 12.885, velocity = 6.443
tim10_d_print() > length_left = 0.000, length_right = 97516999.463, length = 48758499.731
main_d_print
tim10.c > tim10_d_print() > encoder_length_left() = 0.00000, encoder_length_right() = 12885.43862, encoder_length() = 6442.71931
tim10_d_print() > velocity_left = 0.000, velocity_right = 12.885, velocity = 6.443
tim10_d_print() > length_left = 0.000, length_right = 105583284.038, length = 52791642.019
main_d_print
tim10.c > tim10_d_print() > encoder_length_left() = 0.00000, encoder_length_right() = 12885.43862, encoder_length() = 6442.71931
tim10_d_print() > velocity_left = 0.000, velocity_right = 12.885, velocity = 6.443
tim10_d_print() > length_left = 0.000, length_right = 113675339.490, length = 56837669.745
main_d_print
tim10.c > tim10_d_print() > encoder_length_left() = 0.00000, encoder_length_right() = 12885.43862, encoder_length() = 6442.71931
tim10_d_print() > velocity_left = 0.000, velocity_right = 12.885, velocity = 6.443
tim10_d_print() > length_left = 0.000, length_right = 121754509.504, length = 60877254.752
問題点
コードを読んでいる時に見つけた間違い
具体的には、以下において encoder_set()
と e = encoder_length()
の順番が逆だったた。
そのせいで、第一周目に e
の値が初期化されておらず、その状態で length += e
していたために、length
の値が異常な値を示していたと予想される。
左エンコーダの速度がゼロ扱いにされているのも、e
がゼロであれば、何を掛け算してもゼロのままになるのは当然。
これで値の更新量が小さすぎるのも説明がつく。
/* encoder.c */
void encoder_set()
{
/* 中央値からの偏差を計算 */
encoder_left = TIM1 -> CNT - ENCODER_MIDDLE;
encoder_right = -(TIM3 -> CNT - ENCODER_MIDDLE);
encoder = (encoder_left + encoder_right) / (double) 2;
/* TIMx -> CNT を中央値に戻す */
encoder_set_middle();
}
/* エンコーダの、中央値からの偏差を長さに変換する関数 */
void encoder_length()
{
return (double) encoder * (double) LENGTHPERPULSE;
}
/* tim10.c */
void tim10_main()
{
double e;
/* 中央値からの偏差を更新してもらう */
/* 中央値に戻す */
encoder_set();
/* 更新された中央値からの偏差をもってくる */
e = encoder_length();
velocity = e * (double) * TIM10_Hz;
length += velocity;
}
ただ値が更新されない理由が全くわからん
とりまこれで書き込みして動作させてどうなるか見たいところ...
以下の問題については、上記コードの問題で解決した。
残りの、値が更新されない問題については 左エンコーダのコネクタが、1, 2 番ピンがショートしていたことが問題だった。 コネクタを作り直したらできた。
残る問題は右エンコーダの値が中央値にリセットされないこと
はいはーい!
TIM3->CNT = ENCODER_MIDDLE;
が
TIM2->CNT = ENCODER_MIDDLE;
になっててほかのタイマのカウント値を中央値に戻してまーした!
この
issue
は murakumo から引き継がれました