位置与速度传感器
引言:传感器在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° | 1 | 0 | 0 | 100 (4) | 30° |
| 60° - 120° | 1 | 1 | 0 | 110 (6) | 90° |
| 120° - 180° | 0 | 1 | 0 | 010 (2) | 150° |
| 180° - 240° | 0 | 1 | 1 | 011 (3) | 210° |
| 240° - 300° | 0 | 0 | 1 | 001 (1) | 270° |
| 300° - 360° | 1 | 0 | 1 | 101 (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、新能源车电机、航空发动机 |
选型建议
- 成本敏感,精度要求不高 :选择 霍尔传感器 ,结合无感启动算法可满足多数消费级产品。
- 通用伺服,高精度控制 :选择 高线数增量式编码器 ,性价比高,接口成熟。
- 恶劣环境(高温、振动、油污) :首选 旋转变压器 ,可靠性无可替代。
- 需要绝对位置,且不允许上电寻零 :选择 绝对式编码器 或旋转变压器。
五、在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);
}