You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用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秒周期
    }
}

代码逻辑说明

  1. 时间戳跟踪:用HAL_GetTick()获取系统运行毫秒数,通过对比当前时间与上次读取温度的时间差判断触发时机,避免循环计数带来的累积误差。
  2. 加速度计周期保障:每次循环优先处理加速度计读取,配合HAL_Delay(1000)确保严格的1秒执行周期。
  3. 温度触发逻辑:当时间差达到1500ms时才读取温度并更新时间戳,精准控制1.5秒的执行间隔。
  4. 打印灵活调整:当前打印逻辑保留温度字段,若需仅在温度更新时打印温度信息,可将温度打印代码移至if判断块内部。

内容的提问来源于stack exchange,提问作者Pann Phyu Phway

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 12:55:19