static float floorTo(float i) { int32_t r=0; if(i==0)return 0; while(i<=10.0f && i>=-10.0f) { r--;i*=10; } while(i>=100.0f || i<=-100.0f) { r++;i/=10; } i=floorf(i); while(r>0) { i*=10;r--; } while(r<0) { i/=10;r++; } return i; }
时间: 2024-04-16 15:25:36 浏览: 110
这段代码是一个静态函数`floorTo`,用于将浮点数向下取整到最接近的整数。具体流程如下:
1. 定义了一个静态函数`floorTo`,该函数接受一个浮点数`i`作为输入,并返回一个浮点数作为取整后的结果。
2. 定义一个32位整型变量`r`,初始化为0,用于记录取整的偏移量。
3. 如果输入的浮点数`i`等于0,则直接返回0。
4. 进入第一个while循环,判断条件为`i`在-10.0f到10.0f之间。循环中,`r`递减1,表示向下取整的偏移量增加1,同时`i`乘以10,使得小数部分向左移动一位。
5. 第一个while循环结束后,进入第二个while循环,判断条件为`i`大于等于100.0f或小于等于-100.0f。循环中,`r`递增1,表示向下取整的偏移量减少1,同时`i`除以10,使得小数部分向右移动一位。
6. 使用`floorf`函数将浮点数`i`向下取整。
7. 进入第三个while循环,如果`r`大于0,则将浮点数`i`乘以10,并将`r`递减1,表示将小数部分向左移动一位。
8. 进入第四个while循环,如果`r`小于0,则将浮点数`i`除以10,并将`r`递增1,表示将小数部分向右移动一位。
9. 最后,返回浮点数`i`作为取整后的结果。
需要注意的是,函数中使用了数值常量10.0f、-10.0f、100.0f和-100.0f作为判断条件和操作数。如果您有其他问题,请随时提问。
相关问题
static float ceilTo(float i) { int32_t r=0; if(i==0)return 0; while(i<=10.0f && i>=-10.0f) { r--;i*=10; } while(i>=100.0f || i<=-100.0f) { r++;i/=10; } i=ceilf(i); while(r>0) { i*=10;r--; } while(r<0) { i/=10;r++; } return i; } static void updateBox(float *resY1,float *resY2,float d) { if(d<*resY2)*resY2=d; if(d>*resY1)*resY1=d; }
这段代码包含两个静态函数:`ceilTo`和`updateBox`。
首先是`ceilTo`函数,它用于将浮点数向上取整到最接近的整数。具体流程与之前解释的`floorTo`函数类似,只是使用了`ceilf`函数将浮点数向上取整。
然后是`updateBox`函数,它用于更新一个表示范围的盒子。具体流程如下:
1. `updateBox`函数接收三个参数:`resY1`指向表示盒子上限的浮点数指针,`resY2`指向表示盒子下限的浮点数指针,以及浮点数`d`作为更新的值。
2. 如果`d`小于`*resY2`(盒子下限),则将`d`赋值给`*resY2`,即更新盒子下限。
3. 如果`d`大于`*resY1`(盒子上限),则将`d`赋值给`*resY1`,即更新盒子上限。
这两个函数的具体用途需要结合上下文来理解,如果您有其他问题,请随时提问。
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;}这段代码怎么将速度值在屏幕上打印出来
可以使用串口打印函数将速度值输出到终端,例如使用STM32 HAL库中的UART串口打印函数`HAL_UART_Transmit()`。假设你使用的是串口1,可以在`main()`函数中添加以下代码:
```
char buffer[50]; // 缓存数组,用于存储待打印的字符串
float speed; // 用于存储读取到的速度值
// 初始化编码器
Init_Encoder_Speed();
while (1) {
// 读取速度值
speed = Read_Encoder_Speed();
// 将速度值转换为字符串并存储到缓存数组中
sprintf(buffer, "Encoder Speed: %.2f\r\n", speed);
// 通过串口1发送缓存数组中的字符串
HAL_UART_Transmit(&huart1, (uint8_t*)buffer, strlen(buffer), 100);
}
```
这样,每次循环都会读取速度值并将其打印到串口终端。注意需要在`main()`函数中先初始化串口1,否则串口打印函数无法工作。
阅读全文
相关推荐
![-](https://img-home.csdnimg.cn/images/20241231044901.png)
![-](https://img-home.csdnimg.cn/images/20241231044937.png)
![-](https://img-home.csdnimg.cn/images/20241231044937.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)