YazawaKenichi / murakumo_ws

0 stars 0 forks source link

[dev] エンコーダの値がおかしい #1

Closed YazawaKenichi closed 1 year ago

YazawaKenichi commented 1 year ago

この issuemurakumo から引き継がれました

YazawaKenichi commented 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
YazawaKenichi commented 1 year ago

問題点

YazawaKenichi commented 1 year ago

コードを読んでいる時に見つけた間違い

具体的には、以下において 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;
}
YazawaKenichi commented 1 year ago

ただ値が更新されない理由が全くわからん

YazawaKenichi commented 1 year ago

とりまこれで書き込みして動作させてどうなるか見たいところ...

YazawaKenichi commented 1 year ago

以下の問題については、上記コードの問題で解決した。

残りの、値が更新されない問題については 左エンコーダのコネクタが、1, 2 番ピンがショートしていたことが問題だった。 コネクタを作り直したらできた。

YazawaKenichi commented 1 year ago

残る問題は右エンコーダの値が中央値にリセットされないこと

YazawaKenichi commented 1 year ago

はいはーい!

TIM3->CNT = ENCODER_MIDDLE;TIM2->CNT = ENCODER_MIDDLE; になっててほかのタイマのカウント値を中央値に戻してまーした!