c-警报在树莓rp2040上立即启动



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

我有一个";电动机;结构:

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 
};

我写的代码看起来是这样的:

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

这里可能有什么问题?我们非常感谢您的帮助。

以毫秒为单位的时间似乎应该加一个零来指定,通过设置timeout=10000,我可以根据需要获得1s的超时。

相关内容

  • 没有找到相关文章

最新更新