用dspic30f的qei模块测量交流电机速度和位置
本文介绍用dspic30f数字控制器的正交编码器接口(qei)模块,对电机的速度和位置进行控制的方法。提供了典型电机控制中转子的速度和位置测量的代码实例。
正交编码器接口(qei)模块
图1 正交编码器接口信号
图2 正交编码器接口功能方框图
dspic30f的正交编码器接口(qei)模块提供了一个与增量光编码器的接口,允许从电机或机械系统中,获得速度和相对转子位置信息。qei模块提供16位时基,接受从增量编码器连接的a、b和标志信号。电机速度和位置信息能用×2或×4分辨率进行测量。
qei模块有两个速度通道:a相(qea)和b相(qeb)。两个通道有对应关系,如果a相超前b相,则认为电机的方向是正转或正向的。如果a相滞后b相,则认为电机的方向是反转或反向的。第三个通道是indx,称标志脉冲通道,电机转子每旋转一周产生一个脉冲,用于确立转子绝对位置的基准。图1是这三个信号的相对时间关系。
由解释a相、b相和标志信号的逻辑译码器和精确计数的上/下计数器组成正交编码器。数字滤波器在输入信号时对信号进行滤波。图2是qei模块的方框图。这些功能包括:
两相信号和标志信号。
可编程译码器(提供计数器脉冲和计数方向)。
16位上/下位置计数器。
计数方向状态。
×2和×4分辨率计数。
位置计数器复位的两个模式。
普通用途16位定时器/计数器模式。
qei或计数器事件产生中断。
应用实例
图3是典型的qei应用实例,这里交流电机(acim)用正交编码器作为反馈信息控制。
应用实例要求:
在0°-360°范围内测量转子角位置。已知增量编码器光栅的数量,设置成相应的定标系数。用一个16位无符号变量表示。
测量角速度。已知的电机最高速度。用一个有符号16位变量表示,这里转子正转时符号是(+),反转时符号是(-)的。
在本例中使用下面的电机和编码器:
电机:lesson cat##102684,转子速度3450rpm
编码器:us数字模块e3-500-500-iht,分辨率500线。
qei模块初始化
图3 典型应用方案
图4 通过滤波器传送的信号,1:1滤波器时钟分频
使能数字滤波器
使能数字滤波器在增量编码器信号中滤波其他信号。对本例所用的结构,图4说明了输入信号的滤波作用。
滤波器计算时,编码器最小脉冲宽度为最高电机速度。在这个实例中,最小脉冲宽度由下式确定:
所配置的滤波器滤出任何小于15祍的脉冲,运行14.75mips,能够满足滤波器的要求,滤波器分频器由下式计算:
在qei模块中有可选择参数,选择64分频,13祍以下的脉冲将被滤出。
增量脉冲计数器
在每个qen引脚输入增量脉冲计数器信号。为了尽可能提高分辨率,qei配置成×4。×4计数模式时,每个qea和qeb信号沿到来时,poscnt寄存器增量计数或减量计数,图5是×4配置的定时信号。
复位脉冲计数器
脉冲计数器由index引脚复位。图6是index脉冲复位脉冲计数器的定时图。
代码实例
下面是qei模块初始化的代码实例:
实例1:qei模块初始化
void initqei(viod)
{
adpcfg|=0x0038;
//配置qei引脚作为数字输入
qeiconbit.qeim=0; //禁止qei模块
qeiconbit.cnterr=0; //清除计数错误
qeiconbit.qeisidl=0; //睡眠期间连续工作
qeiconbit.swpab=0; //qea和qeb交换
qeiconbit.pcdout=0; //标准i/o引脚工作
qeiconbit.posres=1;
//标志脉冲复位位置计数器
deltconbits.ceid=1; //禁止计数错误中断
deltconbits.qeout=1;
//允许qen引脚数字滤波器输出
deltconbits.qeck=5;
//对qen数字滤波器1:64时钟分频
deltconbits.indout=1;
// 允许index引脚数字滤波器输出
deltconbits.indck=5;
//对index数字滤波器1:64时钟分频
poscnt=0;
//复位位置计数器
qeiconbit.qeim=6;
//用index位置计数器复位×4模式
return;
}
表1 变量值和分辨率
用qei计算角度位置
控制算法采用小数运算,需要将位置计数器结果变换成一个符号小数。下式用于计算每转最大计数值。
max_count_per_rev=pulses_per_rev×count_inc_per_rev-1=500×4-1=1999
这里分辨率为0.18°。
用这个结果,位置计数变量需要将0到1999变换成有符号16位小数值0到32767。下面的公式是定标系数。
标志脉冲配置自动地复位poscnt。
编码实例
实例2:用qei计算角位置
int angpos[2]={0,0};
//用于速度计算的两个变量
int poscntcopy=0;
{
poscntcopy=(int)poscnt;
if (poscntcopy<0)
poscntcopy=- poscntcopy;
angpos[1]= angpos[0]
angpos[0]=(unsigned int)(((unsigned long) poscntcopy*2048)/125;
//0<=poscnt<=19991到0<=poscnt>1)
int speed;
void_attribute_((_interrupt_))_t1interrupt(void)
{
ifsobits.t1if=0;//清定时器1中断标志
positioncalculation();
speed=angpos[0]- angpos[1];
if(speed>=0)
{
if (speed>=(halfmaxspeed)
speed=speed-maxspeed;
}
else
{
if (speed<-(halfmaxspeed)
speed=speed+maxspeed;
}
speed*=2;
return;
}
结语
从本文的编码实例,可以得到表1所示数据。
如果测量的速度和角位置需要比较高的分辨率,可以用下列方法:
用比较长地时间周期精确计数。必须避免脉冲计数器寄存器poscn溢出,所以在这种情况下推荐使用poscn寄存器的精度。
使用输入捕捉通道代替转换每转计数周期测量。
用每转产生更多脉冲地增量计数器。
代码实例选用dspic30f6010 dsc,开发工具是mplab ide7.11和mplab c30 v1.31。
探索引领产业变革的颠覆技术,为机器人和人工智能领域发展开拓新价值
自驾、连网、电动化 汽车进化实现智慧城市愿景
浙江海洋大学研发便携式鱼类品质智能检测仪,可实现鱼体快速检测
如何修复发动机凸轮轴磨损问题
什么是软件接口_软件系统之间的接口方式
用dsPIC30F的QEI模块测量交流电机速度和位置
VL53L0X飞行时间测距传感器开发板套件
探索ADAS和自动化视觉系统的成像挑战
中国移动与CBA联盟成立5G联合实验室,正式启动“双五计划”
英国、欧盟为什么要阻止英伟达收购Arm?
Uber与现代汽车合作 打造一款电动空中出租车
电平如何利用CAN控制器转换成逻辑?
亨通光电发布了关于发行股份及支付现金购买资产暨关联交易情况
哪款wifi中继器最好用?什么品牌最值得选购?
Blockfi计划把加密货币借贷业务扩张至加州范围将覆盖美国44个州
四方光电化身武汉抗疫使者,以国际化视野打造优质产品
极目智能打造L2+级商用车视频域控解决方案
大科激光在长沙新厂举办了万瓦级光纤激光器产线投产仪式
惯导模块SKM-4DX给车载导航带来了哪些革新?
云知声山海大模型各项性能持续优化