float Read_Encoder_Speed(void) { static int Encoder_Count_Last = 0; static uint32_t Time_Last = 0; int Encoder_Count = TIM4->CNT; uint32_t Time = millis(); if (Encoder_Count > 0xefff) { Encoder_Count -= 0xffff; } float Speed = ((Encoder_Count - Encoder_Count_Last) / 2.0f) / (1.0f * (Time - Time_Last) / 1000.0f) / 96.0; Encoder_Count_Last = Encoder_Count; Time_Last = Time; return Speed; }优化这段代码
时间: 2023-06-11 16:07:27 浏览: 375
speedcheckATMEGA48.rar_atmega48_encoder\ speed_speedcheckATMEGA4
这段代码主要用于读取编码器的速度,并返回一个浮点数。以下是我对该代码的优化建议:
1. 将变量Encoder_Count_Last和Time_Last声明为静态变量是合理的,但是这些变量的初始化应该在函数外部进行,以免每次调用函数时都要重新初始化。
2. 使用毫秒级别的时间计算速度可能会导致精度损失。建议使用微秒级别的时间(例如使用HAL库中的HAL_GetTick()函数),可以提高计算精度。
3. 在计算速度之前,应该先判断编码器计数是否溢出,如果溢出则需要进行修正。
4. 将计算速度的公式进行简化,可以提高代码执行效率。
综上所述,以下是我优化后的代码:
```
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_Last和Time_Last变量。我还将时间计算精度提高到了微秒级别,并添加了对编码器计数溢出的修正。在计算速度时,我使用了简化的公式,可以提高代码执行效率。
阅读全文