STM32定时器与霍尔传感器的速度测量原理

该文章已生成可运行项目,
一、霍尔传感器与电机转动的本质关系
  1. 霍尔传感器工作原理

    • 3个霍尔元件呈120°分布,检测转子磁极位置

    • 电机每旋转60°电角度,霍尔组合状态变化一次

    • 完整电周期(360°电角度)产生6次状态变化

  2. 机械角度与电角度转换

电角度 = 机械角度 × 极对数(P)

             示例:4极电机(P=2),转1圈机械角度=360°,电角度=720°

         3. 关键参数定义

     机械频率就是转速

    二、速度计算公式的完整推导

    设:

    • Δt:两次霍尔变化的时间间隔(秒)

    • P:电机极对数(磁极数/2)

    • f_m:机械转速(转/秒)

    推导过程:

    1. 每个Δt对应60°电角度

    2. 完整电周期(360°)时间:T_e = 6 × Δt

    3. 机械转速:f_m = 1/(P × T_e) = 1/(P × 6 × Δt)

    4. RPM(转/分):RPM = 60 × f_m = 60/(6PΔt) = 10/(PΔt)

    最终公式

    RPM = 10 / (P × Δt)   [Δt单位:秒]
    三、STM32定时器的实现机制
    1. 定时器配置关键点
    // 高级定时器配置示例(TIM1)
    TIM_HandleTypeDef htim1;
    
    void ConfigureHallSensorTimer(void) {
      // 时钟配置:72MHz主频
      htim1.Instance = TIM1;
      htim1.Init.Prescaler = 71;        // 分频后1MHz (72MHz/(71+1))
      htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
      htim1.Init.Period = 0xFFFF;       // 最大计数值65535
      htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
      HAL_TIM_Base_Init(&htim1);
      
      // 霍尔传感器接口配置
      TIM_HallSensor_InitTypeDef sHallConfig;
      sHallConfig.IC1Polarity = TIM_ICPOLARITY_BOTHEDGE; // 双沿触发
      sHallConfig.IC1Prescaler = TIM_ICPSC_DIV1;
      sHallConfig.IC1Filter = 8;        // 滤波系数
      sHallConfig.CommutationDelayed = TIM_COMMUTATION_DELAY_NONE;
      HAL_TIMEx_HallSensor_Init(&htim1, &sHallConfig);
      
      // 启动捕获
      HAL_TIMEx_HallSensor_Start_IT(&htim1);
    }

    2. 捕获中断处理流程

    volatile uint32_t prev_capture = 0;
    volatile uint32_t overflow_count = 0;
    volatile float rpm = 0.0f;
    
    // 捕获中断服务函数
    void TIM1_CC_IRQHandler(void) {
      if (__HAL_TIM_GET_FLAG(&htim1, TIM_FLAG_CC1)) {
        uint32_t curr_capture = TIM1->CCR1;
        
        // 计算时间差(考虑溢出)
        uint32_t delta_count;
        if (curr_capture >= prev_capture) {
          delta_count = curr_capture - prev_capture;
        } else {
          // 计数器溢出处理
          delta_count = (0xFFFF - prev_capture) + curr_capture + 1;
          delta_count += overflow_count * 0x10000;
          overflow_count = 0;
        }
        
        // 计算实际时间(秒)
        float delta_t = delta_count / 1000000.0f; // 1MHz时钟=1us/count
        
        // 速度计算(假设P=2极对数)
        const uint8_t pole_pairs = 2;
        rpm = 10.0f / (pole_pairs * delta_t);
        
        prev_capture = curr_capture;
        __HAL_TIM_CLEAR_IT(&htim1, TIM_IT_CC1);
      }
    }
    
    // 溢出中断处理
    void TIM1_UP_IRQHandler(void) {
      if (__HAL_TIM_GET_FLAG(&htim1, TIM_FLAG_UPDATE)) {
        overflow_count++;
        __HAL_TIM_CLEAR_IT(&htim1, TIM_IT_UPDATE);
      }
    }

    四、速度计算实例分析

    假设场景

    • 4极电机(P=2)

    • 定时器时钟:72MHz

    • 预分频:71 → 计数频率1MHz

    • 测得Δcount = 25,000

    计算过程

    1. 实际时间间隔:
      Δt = 25,000 / 1,000,000 = 0.025秒

    2. 应用公式:
      RPM = 10 / (P × Δt) = 10 / (2 × 0.025) = 10 / 0.05 = 200 RPM

    公式物理意义

    • 分母 P × Δt:每60°电角度所需时间

    • 系数 10:由60秒/分 ÷ 6个区间推导而来

    • 整体表示:每分钟能完成多少个60°电角度区间

    五、实际应用中的关键问题处理

         1. 低速测量优化

    // 使用溢出计数扩展量程
    uint32_t total_count = (overflow_count * 65536) + delta_count;
    float delta_t = total_count / 1000000.0f;

         2. 噪声滤波技术

    • 硬件滤波:配置IC1Filter=8(约1μs滤波)

    • 软件滤波:

    #define FILTER_SAMPLES 5
    float rpm_buffer[FILTER_SAMPLES];
    float filtered_rpm = 0;
    
    // 在中断中更新
    rpm_buffer[sample_index] = rpm;
    sample_index = (sample_index + 1) % FILTER_SAMPLES;
    
    // 主循环中计算平均值
    for(int i=0; i<FILTER_SAMPLES; i++) {
      filtered_rpm += rpm_buffer[i];
    }
    filtered_rpm /= FILTER_SAMPLES;

    3. 动态范围处理: 

    // 根据速度动态调整预分频
    void AdjustTimerPrescaler(float rpm) {
      if(rpm > 5000) {
        TIM1->PSC = 0;  // 72MHz计数
      } else if(rpm > 1000) {
        TIM1->PSC = 35; // 2MHz计数
      } else {
        TIM1->PSC = 71; // 1MHz计数
      }
      HAL_TIM_GenerateEvent(&htim1, TIM_EVENTSOURCE_UPDATE);
    }
    六、霍尔安装偏差补偿

    当霍尔传感器与理想位置存在角度偏差时:

    // 偏差补偿公式
    float compensated_rpm = rpm * (1 + calibration_factor);
    
    // 校准过程示例
    void HallCalibration(void) {
      // 1. 锁定电机至已知位置
      // 2. 读取霍尔状态
      // 3. 计算偏差角度θ
      // 4. 计算补偿因子:k = 60° / (60° - θ)
    }

    七、总结:从捕获值到速度的完整路径

     通过理解霍尔状态变化与电机角位移的关系,掌握RPM=10/(P·Δt)公式的物理意义,并配合STM32定时器的捕获功能,即可实现精确的电机转速测量。实际应用中需注意噪声滤波、溢出处理和安装偏差补偿等关键技术点。

    本文章已经生成可运行项目
    评论
    成就一亿技术人!
    拼手气红包6.0元
    还能输入1000个字符
     
    红包 添加红包
    表情包 插入表情
     条评论被折叠 查看
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值