位置与速度传感器

← 返回 FOC MOC | ← 返回主页

库中编码器


引言:传感器在FOC控制中的核心作用

在无刷电机磁场定向控制(FOC)中,精确获取转子位置和速度是实现高性能、高效率控制的前提。本讲将深入剖析三种主流位置/速度传感器: 光电/磁编码器 、 霍尔传感器 和 旋转变压器 。它们如同电机的“眼睛”,为控制算法提供关键的反馈信息。

一、光电与磁编码器 (Encoder)

1.1 基本原理

编码器通过将机械位移(角度)转换为数字脉冲信号来工作。主要分为两大类:

  • 增量式编码器 :输出A、B两相正交脉冲和Z相索引脉冲。通过计数脉冲数和判断A、B相位差来获得相对位移和方向。
  • 绝对式编码器 :每个位置对应唯一的二进制编码(如格雷码),上电即可获得绝对位置,无需寻零。

1.2 关键接口与信号

信号线增量式编码器绝对式编码器(并行)接口说明
A相正交脉冲-与B相相位差90°,用于判向和计数
B相正交脉冲-同上
Z相零位脉冲-每转一个脉冲,用于机械零位校准
数据线 D0-Dn-绝对位置数据位并行输出位置编码(如12位=4096线)
通讯线 (CLK, DATA)-SSI, BiSS, EnDat等串行同步/异步接口,节省引脚

1.3 接口电路与代码示例(STM32 TIM编码器模式)

STM32等MCU的定时器通常内置正交编码器接口,可硬件解码A、B相信号。

// STM32 HAL库 编码器接口初始化示例
void Encoder_TIM3_Init(void) {
    TIM_Encoder_InitTypeDef sConfig = {0};
    TIM_MasterConfigTypeDef sMasterConfig = {0};
 
    htim3.Instance = TIM3;
    htim3.Init.Prescaler = 0;
    htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim3.Init.Period = 65535; // 16位最大值
    htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
 
    // 配置编码器模式:在TI1和TI2边沿都计数
    sConfig.EncoderMode = TIM_ENCODERMODE_TI12;
    sConfig.IC1Polarity = TIM_ICPOLARITY_RISING;
    sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;
    sConfig.IC1Prescaler = TIM_ICPSC_DIV1;
    sConfig.IC1Filter = 6; // 滤波系数,防抖动
    sConfig.IC2Polarity = TIM_ICPOLARITY_RISING;
    sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;
    sConfig.IC2Prescaler = TIM_ICPSC_DIV1;
    sConfig.IC2Filter = 6;
    HAL_TIM_Encoder_Init(&htim3, &sConfig);
 
    sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
    sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
    HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig);
 
    HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL); // 启动编码器接口
}
 
// 读取位置和计算速度(在定时中断中调用)
int32_t Get_Encoder_Speed(void) {
    static int32_t last_count = 0;
    int32_t current_count = (int32_t)TIM3->CNT; // 直接读计数器
    int32_t diff = current_count - last_count;
 
    // 处理计数器溢出(16位,周期65535)
    if(diff > 32767) diff -= 65536;
    else if(diff < -32767) diff += 65536;
 
    last_count = current_count;
    // diff * (60 * 定时中断频率) / (编码器线数 * 4) = 转速 RPM
    return diff;
}

二、霍尔传感器 (Hall Sensor)

2.1 基本原理

基于霍尔效应,当有磁场垂直于半导体薄片通过时,在薄片两侧会产生电势差(霍尔电压)。在电机中,通常将三个霍尔元件间隔120°电角度安装,用于检测永磁转子的磁极位置。

2.2 霍尔信号与电角度关系

三个霍尔传感器输出3位二进制码,每60°电角度变化一次,一个电周期内产生6个不同的状态,对应6个扇区。

电角度扇区H1 (U相)H2 (V相)H3 (W相)二进制值FOC所需角度
0° - 60°100100 (4)30°
60° - 120°110110 (6)90°
120° - 180°010010 (2)150°
180° - 240°011011 (3)210°
240° - 300°001001 (1)270°
300° - 360°101101 (5)330°

2.3 接口与扇区判断代码

// 读取霍尔状态并计算扇区 (假设接在GPIOA的PIN0,1,2)
uint8_t Get_Hall_Sector(void) {
    uint8_t hall_state = (GPIOA->IDR & 0x0007); // 读取低3位
    uint8_t sector = 0;
 
    switch(hall_state) {
        case 0b001: sector = 5; break; // 扇区 5 (对应电角度 300°-360°)
        case 0b011: sector = 4; break; // 扇区 4
        case 0b010: sector = 3; break; // 扇区 3
        case 0b110: sector = 2; break; // 扇区 2
        case 0b100: sector = 1; break; // 扇区 1
        case 0b101: sector = 0; break; // 扇区 0 (对应电角度 0°-60°)
        default: sector = 0; break; // 错误状态
    }
    return sector;
}
 
// 根据扇区估算电角度(用于FOC的Park变换)
float Get_Electrical_Angle_From_Hall(uint8_t sector) {
    float base_angle[] = {30.0f, 90.0f, 150.0f, 210.0f, 270.0f, 330.0f};
    // 注意:这只是扇区中心角度,实际需要结合速度进行插值
    return base_angle[sector] * (3.1415926f / 180.0f); // 转换为弧度
}

三、旋转变压器 (Resolver)

3.1 基本原理与结构

旋转变压器是一种模拟式角度传感器,其工作原理类似于微型变压器。它由转子(励磁绕组)和定子(正弦、余弦输出绕组)组成。转子通入高频交流励磁信号(通常5-10kHz),定子输出的两路信号的幅值分别与转子角度的正弦和余弦成正比。

输出信号表达式:

其中,为励磁信号,为变比,为转子机械角度。

3.2 RDC芯片与数字接口

旋转变压器需要专用的RDC(旋变数字转换器)芯片(如AD2S1200, AU6802)将模拟的SIN/COS信号解调为数字角度和速度。常用接口有:

  • SPI :直接读取角度数据寄存器。
  • 并行数据总线 :高速读取,引脚多。
  • 增量式输出 :模拟增量编码器,输出A/B/Z脉冲。

旋变信号处理架构图

四、三种传感器对比与选型指南

特性霍尔传感器增量式编码器绝对式编码器旋转变压器
精度低 (60°扇区)中-高 (可达每转数万线)高 (12-24位)高 (10-16位)
成本最低低-中高中-高
环境耐受性好较差 (光电怕污染)较差极好 (耐高温、振动、油污)
上电位置需转动获取需寻零立即获得立即获得
接口复杂度简单 (3路GPIO)中等 (TIM编码器模式)复杂 (并行/串行协议)复杂 (需RDC芯片)
典型应用低成本风机、泵、电动车轮毂电机工业伺服、机器人关节、CNC高端伺服、航天、绝对位置关键场合汽车EPS、新能源车电机、航空发动机

选型建议

  1. 成本敏感,精度要求不高 :选择 霍尔传感器 ,结合无感启动算法可满足多数消费级产品。
  2. 通用伺服,高精度控制 :选择 高线数增量式编码器 ,性价比高,接口成熟。
  3. 恶劣环境(高温、振动、油污) :首选 旋转变压器 ,可靠性无可替代。
  4. 需要绝对位置,且不允许上电寻零 :选择 绝对式编码器 或旋转变压器。

五、在FOC算法中的传感器数据融合

在实际高性能FOC系统中,常采用多传感器融合技术,例如:

  • 霍尔 + 编码器 :霍尔用于低速和启动时提供粗略绝对位置,编码器用于高速高精度测量。通过 观测器(如滑模观测器、卡尔曼滤波器) 进行数据融合。
  • 旋变 + 加速度计 :在车辆动力学控制中,融合旋变角度与IMU数据,提高动态响应和抗扰能力。
// 简化的传感器融合伪代码(霍尔初始化 + 编码器跟踪)
typedef struct {
    float electrical_angle; // 融合后的电角度
    float mechanical_angle; // 机械角度
    float speed_rpm;        // 转速
    uint8_t hall_sector;
    int32_t encoder_count;
} SensorFusion_TypeDef;
 
void Sensor_Fusion_Update(SensorFusion_TypeDef* sens) {
    uint8_t new_sector = Get_Hall_Sector();
    if(new_sector != sens->hall_sector) {
        // 霍尔扇区变化,进行角度同步
        sens->hall_sector = new_sector;
        float hall_base_angle = Get_Electrical_Angle_From_Hall(new_sector);
        // 将编码器计数映射到当前扇区对应的角度范围内
        // ... 同步逻辑 ...
    }
    // 正常运行时,主要依赖编码器高分辨率计数
    int32_t enc_diff = Get_Encoder_Speed();
    sens->encoder_count += enc_diff;
    sens->speed_rpm = (enc_diff * 60.0f * CONTROL_FREQ) / (ENCODER_LINES * 4);
    sens->electrical_angle = (sens->encoder_count * 2.0f * PI) / (ENCODER_LINES * 4 * POLE_PAIRS);
}