void HAL_Delay_us(uint16_t us) { uint16_t delay = 0xffff-us-5; //从此数进行计数,如计数了65535次则刚好1us HAL_TIM_Base_Start(&htim3); //开启计数器 __HAL_TIM_SetCounter(&htim3,delay); //设置计数器 while(delay<0xffff-5) { delay = __HAL_TIM_GetCounter(&htim3); //获取当前计数值 } HAL_TIM_Base_Stop(&htim3); }
时间: 2024-04-13 09:25:01 浏览: 181
这是一个用于在微秒级别延时的函数。函数使用了一个定时器来计数,通过设置计数器的初始值和检测计数器的值来实现延时。具体的实现步骤如下:
1. 初始化一个变量`delay`,其值为`0xffff - us - 5`。这个变量将用于进行计数,每计数一次相当于延时1微秒。
2. 启动定时器`htim3`,开始计数。
3. 设置定时器`htim3`的计数器的初始值为`delay`。
4. 进入一个循环,循环条件为`delay < 0xffff - 5`。
5. 在循环中,获取当前计数器的值,并将其赋给`delay`。
6. 当计数器的值达到最大值(0xffff)时,跳出循环。
7. 停止定时器`htim3`的计数。
8. 函数执行完毕,延时结束。
该函数的作用是在给定的微秒数内进行延时。通过使用定时器的计数功能和循环来实现精确的延时。
相关问题
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的情况了。
阅读全文