IC-PT3325是一款光电编码器芯片 其特点如下图所示
3325是一块增量式编码器芯片 每一圈返回2500个脉冲信号,ABZ信号互补输出,AB两相信号的相位差反应电机的转向,Z信号则是一圈一个脉冲的零信号。UVW是用于无刷直流电机的换向和相位信号但是需要对准。
本人使用STM32F103单片机使定时器工作在编码器模式,接收AB两相的脉冲信号进行计数。计数器计数方向和AB相信号的关系如下图所示,(本人的设计中A相信号接在TI1,B相信号接在TI2)。
本人使用的是STM32cubeMX配置的工程,编码器配置如下图所示。选择组合通道中的编码器模式,通道1和通道2会自动设为编码器模式,本人的设计中只计A相的脉冲所以2分频,定时器的编码器模式有低通滤波器我没有使用。从上升沿开始计数,其余的都是默认。使用STM32cubeMX5.2.1固件库使用F1的1.7.0版本。
使用算法将16位计数器扩展为32计数。设置50ms中断读取一次计数器数据,32位数据存储1s内的次数得到转速。
void HAL_TIM_PeriodElapsedCallback( TIM_HandleTypeDef* htim )
{
if( TIM4 == htim->Instance )
{
now_count = __HAL_TIM_GET_COUNTER(&htim3); //50ms一次中断取出计数器数值
Angle = now_count - last_count; //计算出单位时间内脉冲数
if (Angle < 0) //负数转为正数
{
Angle = Angle + count_period;
}
last_count = now_count; //将此次脉冲数存
Pulsecount1 = Pulsecount1 + Angle; //累加单位时间内脉冲 32位数据
time_cnt++; //时间变量累加
now_count = 0; //变量清零
Angle = 0; //角度变量清零
if (time_cnt >= 20)
{
time_cnt = 0;
Pulsecount = Pulsecount1 / 2500;
Pulsecount1 = 0x00000000;
}
}
}