首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在覆盆子rp2040上会立即发出警报

在覆盆子rp2040上会立即发出警报
EN

Stack Overflow用户
提问于 2022-08-15 10:38:26
回答 1查看 61关注 0票数 0

我正在编写一个代码来管理一个电机的速度,这是一个遥控的。出于安全考虑,我想在1秒后停止马达,如果它没有收到另一个命令,它就会收到命令。

我有一个“马达”结构:

代码语言:javascript
复制
motor mt = {
    .m_pwm_pin=M_PWM,
    .timeout=1000,
    .freq=50.0,
    .cycle_time=0.000000008,
    .divider=256.0,
    .forward_period=2.0,
    .neutral_period=1.5,
    .backward_period=1.0,
    .motor_kv=2150 
};

我写的代码是这样的:

代码语言:javascript
复制
int64_t cb_stop_motor(long id, void *mot){
    motor *m = mot;
    stop_motor(m);
    return 0;
}

int stop_motor(motor *m)
{
    gpio_put(16, 1);
    pwm_set_chan_level(m->slice, PWM_CHAN_B, getDuty(m->neutral_period));
    return 0;
}

int move_motor(motor *m, int rpm)
{
    double period_per_rpm;
    double m_period;

    if(rpm == 0){
        stop_motor(m);
    }
    else if(rpm < 0){
        period_per_rpm = (m->neutral_period - m->backward_period) / ((double) m->motor_kv);
        m_period = m->neutral_period - (period_per_rpm * (double) rpm * -1.0);
    }
    else if(rpm > 0){
        period_per_rpm = (m->forward_period - m->neutral_period) / ((double) m->motor_kv);
        m_period = m->neutral_period + (period_per_rpm * (double) rpm);
    }

    pwm_set_chan_level(m->slice, PWM_CHAN_B, getDuty(m_period));
    
    cancel_alarm(m->alarm_id);

    m->alarm_id = add_alarm_in_ms(m->timeout, cb_stop_motor, m, true);
}

问题是,在发出"move_motor“命令之后,警报就会自动启动。我知道,因为我用示波器检查了一下,这个周期在瞬间达到了1.72ms,然后又回到了1.5ms。

这里有什么问题吗?任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

发布于 2022-08-15 20:36:46

看起来,以毫秒为单位的时间应该用加零来指定,通过设置timeout=10000,我可以按需要获得1s超时。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73359821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档