Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature: spirit::Motor::ChangeLevel::Manual で設定可能な最小値を下回ったらエラーを出力する #185

Closed
yutotnh opened this issue Mar 11, 2023 · 2 comments · Fixed by #189
Assignees
Labels
enhancement New feature or request

Comments

@yutotnh
Copy link
Owner

yutotnh commented Mar 11, 2023

なぜ機能が欲しいのか

spirit::Motor::ChangeLevel::Manual の時に設定する値がデューティー比に対して情報落ちするような値だったら、なんど adjust_duty_cycle を行ってもデューティー比が変化しなくなる

そういった値が設定された場合にデューティー比が変化しなくなることを防止するために、返り値などで駄目であることを知らせる(エラー)

提案の説明

以下の処理を変更する

spirit/source/Motor.cpp

Lines 146 to 165 in 9b64df4

void Motor::change_level(const ChangeLevelTarget target, const float duty_cycle)
{
switch (target) {
case ChangeLevelTarget::Rise:
_rise_change_level = ChangeLevel::Manual;
_rise_maximum_change_duty_cycle = duty_cycle;
break;
case ChangeLevelTarget::Fall:
_fall_change_level = ChangeLevel::Manual;
_fall_maximum_change_duty_cycle = duty_cycle;
break;
default:
Error& error = Error::get_instance();
constexpr char message_format[] = "Unknown motor change level target (%d)";
char message[sizeof(message_format) + Error::max_uint32_t_length];
snprintf(message, sizeof(message), message_format, static_cast<uint32_t>(target));
error.error(Error::Type::UnknownValue, 0, message, __FILE__, __func__, __LINE__);
return;
}
}

その他

@yutotnh yutotnh added the enhancement New feature or request label Mar 11, 2023
@yutotnh yutotnh self-assigned this Mar 11, 2023
@yutotnh yutotnh changed the title Feature: spirit::Motor::ChangeLevel::Manual で設定する値の最小値を設定して、最小値を下回ったら最小値を設定するようにする Feature: spirit::Motor::ChangeLevel::Manual で設定可能な最小値を下回ったら最小値を設定するようにする Mar 11, 2023
@yutotnh
Copy link
Owner Author

yutotnh commented Mar 11, 2023

以下の実験結果から、最小値は powf(2.0F, -23) らしい

float型は仮数部が23bit(先頭の1bitは省略しているので、実質24bit)で、1.0Fの仮数部は1bit、なので 1 + 23 = 24で計算通りだと思う

#include <iostream>
#include <cmath>

using namespace std;

int main()
{
    float max_duty_cycle = 1.0F;
    
    for (int i = 0; ; i--) {
        float duty_cycle = max_duty_cycle + powf(2.0F, i);
        printf("2^%3d = %3.10f,  %3.10f\n", i, powf(2.0F, i), duty_cycle);
        if (duty_cycle == max_duty_cycle) {
            break;
        }
    }

    return 0;
}
$ g++ min_duty_cycle.c && ./a.out
2^  0 = 1.0000000000,  2.0000000000
2^ -1 = 0.5000000000,  1.5000000000
2^ -2 = 0.2500000000,  1.2500000000
2^ -3 = 0.1250000000,  1.1250000000
2^ -4 = 0.0625000000,  1.0625000000
2^ -5 = 0.0312500000,  1.0312500000
2^ -6 = 0.0156250000,  1.0156250000
2^ -7 = 0.0078125000,  1.0078125000
2^ -8 = 0.0039062500,  1.0039062500
2^ -9 = 0.0019531250,  1.0019531250
2^-10 = 0.0009765625,  1.0009765625
2^-11 = 0.0004882812,  1.0004882812
2^-12 = 0.0002441406,  1.0002441406
2^-13 = 0.0001220703,  1.0001220703
2^-14 = 0.0000610352,  1.0000610352
2^-15 = 0.0000305176,  1.0000305176
2^-16 = 0.0000152588,  1.0000152588
2^-17 = 0.0000076294,  1.0000076294
2^-18 = 0.0000038147,  1.0000038147
2^-19 = 0.0000019073,  1.0000019073
2^-20 = 0.0000009537,  1.0000009537
2^-21 = 0.0000004768,  1.0000004768
2^-22 = 0.0000002384,  1.0000002384
2^-23 = 0.0000001192,  1.0000001192
2^-24 = 0.0000000596,  1.0000000000

@yutotnh
Copy link
Owner Author

yutotnh commented Mar 13, 2023

良きにはからうのもどうかと思ったので、エラーを出すようにします

@yutotnh yutotnh changed the title Feature: spirit::Motor::ChangeLevel::Manual で設定可能な最小値を下回ったら最小値を設定するようにする Feature: spirit::Motor::ChangeLevel::Manual で設定可能な最小値を下回ったらエラーを出力する Mar 13, 2023
yutotnh added a commit that referenced this issue Mar 17, 2023
* update: エラー状態をリセットする関数を追加した #185

* update: spirit::Motor::ChangeLevel::Manual で設定可能な最小値を下回ったらエラーを出力する #180

* fix: minimum_maximum_change_duty_cycle の式を修正した #180

* fix: powがclangでconstexprとして使えなかったので、直値にした #180

* fix: powを使わなくなったので cmathのincludeを削除した #180
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
1 participant