float Speed;int Encoder_Count = TIM4->CNT;uint32_t Time = HAL_GetTick();int Encoder_Diff = Encoder_Count - Encoder_Count_Last;if (Encoder_Diff > 0x7fff) { Encoder_Diff -= 0xffff;} else if (Encoder_Diff < -0x7fff) { Encoder_Diff += 0xffff;}float Time_Diff = (Time - Time_Last) / 1000000.0f;if (Time_Diff == 0) { Speed = 0;} else { Speed = Encoder_Diff / 192.0f / Time_Diff;}Encoder_Count_Last = Encoder_Count;Time_Last = Time;return Speed;使用这段代码测速后通过串口将速度值打印到屏幕后为什么转速值一直为0,怎么休改这段代码
时间: 2023-06-10 11:07:21 浏览: 77
这段代码中测速的原理是通过读取编码器的计数器和时间戳计算出速度值,因此如果速度一直为0,则可能是以下原因之一:
1. 编码器没有连接或者连接不正确,导致计数器一直为0。
2. 计时器的时钟源或者预分频器设置不正确,导致时间戳计算不准确。
3. 代码中的计算公式有误,导致计算出的速度值始终为0。
针对以上可能的原因,可以采取以下几个步骤进行排查和修改:
1. 确认编码器的接线是否正确,包括引脚连接和电源接入等。可以使用示波器等工具来检测编码器输出的波形是否正确。
2. 检查计时器的时钟源和预分频器设置是否正确,可以参考相关的芯片手册或者参考其他可靠的代码示例进行修改。
3. 检查计算公式是否正确,包括编码器的分辨率、计时器的时钟频率和计算结果的单位等。可以手动计算一些样例数据,比如10个脉冲的编码器计数值和时间戳,来验证计算公式的正确性。
针对代码修改,可以参考以下建议:
1. 检查编码器计数器和时间戳的读取是否正确,可以加入一些调试输出来验证。
2. 将计算公式中的常量值换成宏定义或者全局变量,方便修改和调试。
3. 将计算结果进行平滑处理,比如使用滑动平均值等算法,避免因为噪声等干扰导致结果不准确。
总之,需要仔细排查调试代码,找出问题所在,并进行逐步修改和验证,才能得到正确的速度值。
相关问题
static int Encoder_Count_Last = 0;static uint32_t Time_Last = 0;void Init_Encoder_Speed(void) { Encoder_Count_Last = TIM4->CNT; Time_Last = HAL_GetTick();}float Read_Encoder_Speed(void) { int Encoder_Count = TIM4->CNT; uint32_t Time = HAL_GetTick(); int Encoder_Diff = Encoder_Count - Encoder_Count_Last; if (Encoder_Diff > 0x7fff) { Encoder_Diff -= 0xffff; } else if (Encoder_Diff < -0x7fff) { Encoder_Diff += 0xffff; } float Speed = Encoder_Diff / 192.0f / ((Time - Time_Last) / 1000000.0f); Encoder_Count_Last = Encoder_Count; Time_Last = Time; return Speed;}这段代码是什么意思
这段代码是用来读取编码器速度的。首先在初始化函数 Init_Encoder_Speed 中记录当前编码器的计数值 Encoder_Count 和当前时间 Time。然后在 Read_Encoder_Speed 函数中,读取当前编码器计数值 Encoder_Count 和当前时间 Time,计算编码器计数值的变化量 Encoder_Diff。由于编码器计数器是一个16位的有符号数,所以需要处理溢出的情况。最后根据编码器计数值的变化量和时间的变化量计算编码器的速度,并将当前计数值和时间记录下来,返回计算出来的速度值。
static int Encoder_Count_Last = 0;static uint32_t Time_Last = 0;void Init_Encoder_Speed(void) { Encoder_Count_Last = TIM4->CNT;Time_Last = HAL_GetTick();}float Read_Encoder_Speed(void) { int Encoder_Count = TIM4->CNT; uint32_t Time = HAL_GetTick(); int Encoder_Diff = Encoder_Count - Encoder_Count_Last; if (Encoder_Diff > 0x7fff) { Encoder_Diff -= 0xffff; } else if (Encoder_Diff < -0x7fff) { Encoder_Diff += 0xffff; } float Speed = Encoder_Diff / 192.0f / ((Time - Time_Last) / 1000000.0f);Encoder_Count_Last = Encoder_Count;Time_Last = 时间;返回速度;}使用这段代码测速后将速度值通过串口打印到终端上后显示速度为inf怎么修改代码
这段代码中可能出现速度为inf的情况是因为除数为0,也就是时间间隔为0,导致计算出的速度为无穷大(inf)。
为了避免这种情况,你可以在计算速度之前先判断时间间隔是否为0,如果为0则将速度设置为0,如下所示:
```
float Speed;
int Encoder_Count = TIM4->CNT;
uint32_t Time = HAL_GetTick();
int Encoder_Diff = Encoder_Count - Encoder_Count_Last;
if (Encoder_Diff > 0x7fff) {
Encoder_Diff -= 0xffff;
} else if (Encoder_Diff < -0x7fff) {
Encoder_Diff += 0xffff;
}
float Time_Diff = (Time - Time_Last) / 1000000.0f;
if (Time_Diff == 0) {
Speed = 0;
} else {
Speed = Encoder_Diff / 192.0f / Time_Diff;
}
Encoder_Count_Last = Encoder_Count;
Time_Last = Time;
return Speed;
```
这样就可以避免出现速度为inf的情况了。
阅读全文