我正在编写一个代码来管理一个电机的速度,这是一个遥控的。出于安全考虑,我想在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。
这里有什么问题吗?任何帮助都是非常感谢的。
发布于 2022-08-15 20:36:46
看起来,以毫秒为单位的时间应该用加零来指定,通过设置timeout=10000,我可以按需要获得1s超时。
https://stackoverflow.com/questions/73359821
复制相似问题