实验五 编码器控制
抱歉,这一次的更新让大家等待了这么久,好在我又回来了,今天我们来看看小车的编码器,来仔细分析一下我们是怎么控制电机的运转的,还是那句话,有什么说的不对的或者有好的见解地方希望大家跟帖指正交流。
首先,既然要来分析编码器,我们得先看看编码器长啥样在哪里不是、、、
在了解了编码器长啥样了之后,我们接下来看看PWM电机调速的工作原理:
对于电机的转速调整,我们是采用脉宽调制(PWM)办法,控制电机的时候,电源并非连续地向电机供电,而是在一个特定的频率下以方波脉冲的形式提供电能。不同占空比的方波信号能对电机起到调速作用,这是因为电机实际上是一个大电感,它有阻碍输入电流和电压突变的能力,因此脉冲输入信号被平均分配到作用时间上,这样,改变在输入方波的占空比就能改变加在电机两端的电压大小,从而改变了转速。简单点说就是输入方波占空比越大,小车速度越快,当我们将电源直接接在电机两端时,就相当于100%的占空比时,小车速度也就达到极致了。至于PWM信号打哪儿来的,我们稍后继续讨论!
当然了,这只是个示意图,看完了编码器上的接线说明,我们继续分析电机的驱动,因为我们这里的直流电机是需要足够的电流才可以驱动,而主控芯片的IO口所提供的电流显然达不到这个要求,所以我们就需要一块电机驱动芯片来对电流进行放大。我们这次的小车用的驱动芯片是TB6612FNG,它的原理图如下:
可能大家看到这个原理图会说,然而这并没有什么卵用,应为大家都知道它的实质其实基于MOSFET的H桥集成电路,其效率高于晶体管H桥驱动器。
大家都知道,电流经过直流电机的方向不一样是,转动的方向是相反的,那么假设S1和S4闭合时直流电机是正向转动的,那么S3和S2闭合时直流电机显然就是反向转动的。
void Set_Pwm(int moto1,int moto2) { if(moto1<0) AIN2=1, AIN1=0; else AIN2=0, AIN1=1;
PWMA=myabs(moto1);
if(moto2<0) BIN1=0, BIN2=1; else BIN1=1, BIN2=0;
PWMB=myabs(moto2);
}
这段代码就能很好的证明了。
那么接下来我们看看TB6612FNG这款驱动芯片的真值表吧:
首先,STBY很明显是使能端信号,高电平有效的。
其次,IN1和IN2是控制电流流过的方向,可以控制电机的正反转。
最后,PWM信号为低电平时,可以短暂制动,脉冲输入信号被平均分配到作用时间上,因此通过占空比的调节可以调整转速,前面也已经讲过了。
好了,前面的基本知识我们也已经讲解的比较仔细了,现在我们来解析一下代码是怎么写出来的。在motor.c这段代码中(ps:7月10号版本),我们可以很看到通过TIM3(定时器3)作为电机的PWM源信号产生,并且都工作早PWM1模式下,而在PWM1模式下,变化的计数器不断与CCRy进行比较。假设计数器采用加计数方式,当计数器的值TIMx_CNT小于TIMx_CCRy时,PWM信号保持高电平。当TIMx_CNT不断增加,直到大于TIMx_CCRy时,PWM变成低电平。TIMx_CNT继续增加,当达到TIMx_ARR预设的值后,复位返回0值。在第15行代码中:
TIM3->ARR=arr;//设定计数器自动重装值
可以看到,TIM3->ARR决定了PWM信号的周期
在encoder.c中,TIM2和TIM4被初始化为编码器接口模式
int Read_Encoder(u8 TIMX) { int Encoder_TIM; switch(TIMX) { case 2: Encoder_TIM= (short)TIM2 -> CNT; TIM2 -> CNT=0;break; case 3: Encoder_TIM= (short)TIM3 -> CNT; TIM3 -> CNT=0;break; case 4: Encoder_TIM= (short)TIM4 -> CNT; TIM4 -> CNT=0;break; default: Encoder_TIM=0; } return Encoder_TIM; }
在这段程序中,很容易看出来,TIM2 -> CNT决定了PWM信号的占空比,也就是决定了速度,因此,返回值Encoder_TIM如注释所说为速度值。
通过这里的Read_Encoder函数,我们就可以的到左右轮的编码值了,这个可以在最重要的控制文件control.c中的第13行和第17行中看到:
Encoder_Right=Read_Encoder(4); Encoder_Left =-Read_Encoder(2);
得到的左右轮编码值会作为速度PI控制函数的入口参数。
在上位机中,我们得到的左右轮编码值空转时都接近600左右,基本保持一致:
这次的编码器实验我没能写的太清楚,可能自己理解的还不够透彻,有什么问题希望大家不吝赐教,谢谢。