
深入浅出解析智能车测速部分.docx
12页深入浅出解剖智能车测速部分作者:IT民工在打滚作者简介:笔者大一、二参加第三、四届智能车竞赛,大三担任校区实验中心助理引导学校同学参加第五届智能车竞赛,荣获全国智能车竞赛电磁组竞赛特等奖自从大三开始到此刻一直从事运动控制系统开发,对运动控制了解还算比较透切在此,跟学弟们分享下他熟识的,望能对学弟们参加竞赛有所帮助,让大家少走些弯路尽早走上自控的正轨,让咱们一起努力将咱们祖国自控技术推向更高的台阶当然更希望此文能抛砖引玉文中有错漏地方还望各位多多包涵智能车运动控制系统包含:运算处理器(MCU)、执行机构(有刷直流电机)、反馈机构(编码器或旋转变压器)自动化行业里完成的运动控制系统包含三环控制,三环控制分别为:电流环(转矩环),属于三环中的内环;转速环,属三环中的中间环;位置环,属三环中的最外环这三环运动控制算法在不同系统有所取舍,有些系统只需用其中的一环或两环,例如:张力控制系统只需用到电流环足以;智能车则需要电流环+速度环据我了解几乎没有同学上两环控制算法的,都是单单一个速度环(速度环PID)要控制好电机应该上两环控制,只有这样才能最好的发挥电机的驱动能力这里稍微解析下吧,我们都知道当电机的力矩小于负载时,电机旋转速度将降低;电机输出的力矩大于负载时,电机带动负载做加速运动;只有当电机输出力矩等于负载大小时,运动系统才进入匀速运行状态。
当我们给小车一个速度值时,如比当前值大,咱们得加大电机力矩,让车速尽快到达设定速度;如比当前速度小,则减少力矩或者给反向力矩(刹车)总言之,电流环是让车速尽快到达设定值电流环控制算法建议使用PI控制,信号处理频率10KHZ为宜(差点忘了提醒,上电流环记得上电流取样电路哦,取样电路有霍尔取样或电阻取样两种方法,对于智能竞赛上电阻取样法足以,此方法节约成本、电路简单)速度环建议使用PID控制算法、处理频率1KHZ就可以了上段讲解控制算法,接下来重点跟大家聊聊速度反馈部分在工业自动化上速度反馈传感器有编码器、旋转变压器两大类旋转变压器输出模拟信号适用于模拟量控制系统,其体积比较大,随着微处理器的发展其被选用得越来越少;编码器输出数字量抗扰性能较好、制造工艺简单、能很好与微处理器衔接,因此现代运动控制系统基本选用此传感器作为反馈单元纵观各届竞赛同学们选用的反馈元器件颇多的,有用光栅+光电管搭建的、有用霍尔+磁铁搭建的、有用鬼子的二手货+外部转换模块的、有用山寨欧姆龙的、有用广州展昌自动化Mini系列编码器的对以上产品每位 同学都持有各自的想法,咱们先不论好坏,先给大家讲讲编码器种类吧编码器可分为:增量式编码器(多为输出脉冲信号,但随技术的发展及工业自动化的需求不断提高,演变产生了RS-232、RS-485、电压信号、电流信号等智能型编码器,也有直接输出转速信号、角度信号、角加速度信号的编码器)、绝对式编码器(有单圈和多圈两种)两类。
好,咱们一类一类解说增量式编码器有单相脉冲信号、双相脉冲信号、三相脉冲信号,这不难理解单相就是只有单路脉冲信号,双相脉冲信号的有AB相两相脉冲相位差是90°,这可以用以判别编码器旋转方向,A相比B相前置90°时编码器为顺时针旋转,反则为逆时针旋转,这两相脉冲除了可以判断旋转方向外还可以做四倍频,四倍频后可以将精度提高4倍,这部分应用很简单,现在很多处理器都具有四倍频功能也就是正交编码器信号模块,咱们使用的K60MCU就具有这个功能,不知是否有同学使用,没使用的同学尽快应用上这个好东西啦,三相脉冲输出型编码器有ABZ三相脉冲信号,AB相跟两相的一个用法,Z相信号是零位信号,用于校验AB相脉冲的 或者特殊系统对机械零位的,这个信号可用可不用,今后出来工作了设计的产品就最好用上咯是啦,编码器信号输出有电压信号、有集电极开路输出(这种得加上拉电阻)接下来说说增量式编码器使用过程中需注意的地方,增量式输出的是脉冲信号,由它的工作机理我们知道编码器在一个地方往复运动也会输出脉冲(抖动就是往复运动),如只用单相脉冲测试的话很容易测到错误脉冲,以至速度偏差大,最终系统不稳定,因此建议大家使用双相信号测试。
增量式编码器测速就介绍到这,以下介绍绝对式测速法绝对式编码器测速法我引用广州展昌自动化科技有限公司的Mini1024J 10bit精度的编码来解说吧 ,这样比较好讲解,大家也好理解绝对编码器光码盘上有许多道光通道刻线,每道刻线依次以2线、4线、8线、16 线编排,这样,在编码器的每一个位置,通过读取每道刻线的通、暗,获得一组从2的零次方到2的n-1次方的唯一的2进制编码(格雷码),这就称为n位绝对编码器这样的编码器是由光电码盘的机械位置决定的,它不受停电、干扰的影响如下图Mini1024J绝对式编码器的转盘被均匀分成1024格,并每格依次标上0、1、2、3……1023,无论转盘处在哪个位置,读取到位移数据都在0~1023之间绝对编码器在每个位置上读取数值都是唯一的,断电数据不会丢失因此,此类编码器的抗干扰特性、数据的可靠性远远高于增量式编码器绝对式编码器测速原理由绝对式编码器工作原理可知,如10位精度的绝对式编码器在其转轴上均匀的标上1024个独立的标志位,外部每次读取的位置都是唯一的,单位时间内转轴的角度变化量就是轴的角速度W =2∏*(N_NUM–L_NUM)/1024*T式中:W为角速度;N_NUM为本次读取的位置值;L_NUM为上次读取的位置值;T为读取周期;执行机构线速度V = W*K*R式中:V为线速度;K为齿轮传动比;R执行机构转动轮半径;以上介绍了测速原理及计算公式,接下来介绍判断旋转方向的原理。
首先假设在读取周期内旋转角度小于180°,则可分成四个区域,如下图所示:0512051205120512L_NUMN_NUMN_NUML_NUML_NUML_NUMN_NUMN_NUM顺时针旋转顺时针旋转逆时针旋转逆时针旋转由上图可分析得N_NUM-L_NUM 在0 ~ 512 或 -1023 ~ -512区间内为顺时针;在512 ~ 1023或-512 ~ 0区间内为逆时针当假设条件成立时,如果没过零点,则|N_NUM-L_NUM|﹤512;如果过了零点,则|N_NUM-L_NUM|>512;顺时针越过零点时,可理解为编码器开始走下一圈,此时应加1023(也就是当N_NUM-L_NUM<-512时,则N_NUM-L_NUM+1023);逆时针越过零点时,可理解为编码器退回上一圈,此时应减1023(也就是当N_NUM-L_NUM>512时,则N_NUM-L_NUM-1023);经运算后数值大于0为顺时针,小于零位逆时针硬件接线框图单个传感器与单片机连接结构框图(适用于A、B车测速)双传感器与单片机连接结构框图(适用于C D E车测速,没记错的话3.3V~5V都是可以的)绝对式编码器测速流程图 代码也跟大家分享下吧SSI读取函数/*********************************************************************编码器SSI程序函数功能:读取传感器位移数据注:延时时间不能偏差太大,根据MCU实际工作频率做相应的修改**********************************************************************/unsigned int SSI(unsigned char add){ uchar k; uint dat1=0; if(add==0) { CSn_L=0; delay_us(1); //t_clkFE>=500ns for(k=0;k<10;k++) { CLK=0; delay_us(1); CLK=1; delay_us(1); dat1=(dat1<<1)+DAT;//C5 } for(k=0;k<6;k++) { CLK=0; delay_us(1); CLK=1; delay_us(1); } CSn_L=1; } else { CSn_R=0; delay_us(1); //t_clkFE>=500ns for(k=0;k<10;k++) { CLK=0; delay_us(1); CLK=1; delay_us(1); dat1=(dat1<<1)+DAT;//C5 } for(k=0;k<6;k++) { CLK=0; delay_us(1); CLK=1; delay_us(1); } CSn_R=1; } return dat1;}引脚定义&变量定义//引脚定义#define CSn_L PORTB_BIT0 //左轮编码器片选#define CSn_R PORTB_BIT1 //右轮编码器片选#define CLK PORTB_BIT2 //读取时钟#define DAT PORTB_BIT3 //数据输出uint N_num[2];//本次位移值uint L_num[2];//上次位移值int VL; //左轮转速int VR; //右轮转速定时中断服务函数/***************************************************************************************定时计数器|N_num[x]-L_num[x]|<512 ; N_num[x]> L_num[x] 顺时针旋转 N_num[x]< L_num[x] 逆时针旋转 |N_num[x]-L_num[x]|>512 ; N_num[x]> L_num[x] 逆时针旋转 N_num[x]< L_num[x] 顺时针旋转*******************************************************************************************/#pragma CODE_SEG __NEAR_SEG NON_BANKEDvoid interrupt 26 MDC_ISR(void){ L_num[0]=N_num[0]; //上传上次位移数据 N_num[0]=SSI(0); //读取当前位移数据 L_num[1]=N_num[1]; N_num[1]=SSI(1); VL = (N_num[0]-L_num[0]);//求差 VR = (N_num[1]-L_num[1]); if(VL>512) //逆时针越过零点,退回上一圈 VL = VL-1023; if(VL<-512)//顺时针越过零点,开始下一圈 VL = VL+1023; if(VL<0)//逆时针旋转 VL = 0x8000|(-VL); Sci0Write((uchar)(VL>>8)); Sci0Write((uchar)(VL&0x00ff)); 。
