如何利用HAL_Delay实现加速度计与温度传感器的不同采样频率
实现加速度计每秒读取打印、温度传感器每1.5秒读取打印的方案
需求说明
原代码中加速度计与温度传感器均每秒执行一次读取及打印操作,现需调整为:
- 加速度计保持每秒读取并打印一次
- 温度传感器改为每1.5秒读取并打印一次
修改后的代码
int main(void) { initialise_monitor_handles(); HAL_Init(); BSP_ACCELERO_Init(); BSP_TSENSOR_Init(); uint32_t last_temp_time = 0; // 记录上次读取温度的系统时间(毫秒) while (1) { // 处理加速度计:每秒读取并打印一次 float accel_data[3]; int16_t accel_data_i16[3] = { 0 }; BSP_ACCELERO_AccGetXYZ(accel_data_i16); accel_data[0] = (float)accel_data_i16[0] / 100.0f; accel_data[1] = (float)accel_data_i16[1] / 100.0f; accel_data[2] = (float)accel_data_i16[2] / 100.0f; // 处理温度传感器:每1.5秒读取并打印一次 float temp_data = 0.0f; if (HAL_GetTick() - last_temp_time >= 1500) { temp_data = BSP_TSENSOR_ReadTemp(); last_temp_time = HAL_GetTick(); // 更新上次读取温度的时间 } // 打印数据:温度未更新时保持上次值,也可选择仅在更新时打印温度 printf("Accel X : %f; Accel Y : %f; Accel Z : %f; Temperature : %f\n", accel_data[0], accel_data[1], accel_data[2], temp_data); HAL_Delay(1000); // 保证加速度计的1秒周期 } }
代码逻辑说明
- 时间戳跟踪:用
HAL_GetTick()获取系统运行毫秒数,通过对比当前时间与上次读取温度的时间差判断触发时机,避免循环计数带来的累积误差。 - 加速度计周期保障:每次循环优先处理加速度计读取,配合
HAL_Delay(1000)确保严格的1秒执行周期。 - 温度触发逻辑:当时间差达到1500ms时才读取温度并更新时间戳,精准控制1.5秒的执行间隔。
- 打印灵活调整:当前打印逻辑保留温度字段,若需仅在温度更新时打印温度信息,可将温度打印代码移至
if判断块内部。
内容的提问来源于stack exchange,提问作者Pann Phyu Phway
相关产品推荐
相关产品推荐

