在网上灌水的时候看见了一个说要做pwm直流电机调速的帖子,之前学习过pwm波的产生,我也知道pwm波能够调速但具体怎么实现没有深究过。看到这个帖子突然就想弄明白pwm波到底是怎么来对电机进行调速的,无论是从硬件方面还是软件方面都想有一个大致的了解。因此,我开始了一周的学习苦旅。当然了,学习就是自学嘛!内事不明问老婆,外事不明问度娘啊!在百度上找了半天找了一个关于直流电机调速的程序。这个程序是用的高级定时器TIM1和TIM8做的8路PWM波输出。之前我只是用过通用定时器的定时器功能和PWM波功能,但PWM波功能也大抵忘却了。因此,对着STM32的手册开始看起来。其实这个PWM波跟通用的差不多喽!都是设置一个比较值,当计数器的值小于这个值的时候输出高电平(或低电平),大于这个值时输出低电平(或高电平)。我看的是库函数版本的,但是我不懂的就会打开库函数的定义去看它到底改的是哪个寄存器,再对照STM32用户手册来看这个寄存器的功能,我感觉这个办法还不错对于库函数中参数设置的原因基本都有了解。如果你还是不清楚的话,你可以看用户手册中相应的部分比如PWM波输出模式,这些都有讲解的。说了半天怎么学的问题,还是回到正题吧!当然在设置PWM波之前,你还要设置定时器的时钟,就是设置分频器的值;还要设置计数周期,你不可能让计数一直计数下去吧(总是吃它也会撑死的)!还有向上计数向下计数啊等等。如此这般你的PWM就算配置好了。但是你仔细看STM32的用户手册你会发现高级定时器的功能是与通用定时器有区别的——死区和刹车。当然我们控制直流电机一般不会用到刹车功能,但是出于对刹车好奇,我还是看了下来。其实软件刹车呢,就是把输出都置0,当你输出的PWM波都为0时,你控制的外设就没电了然后不就停止了嘛!当然,要注意的是TIM_AutomaticOutput这个量一定要设置为ENABLE,如果你设置为DISABLE的话,当你的刹车信号量为从1变为0(假如你设置的是1为刹车使能量)的时候,PWM波还是不能输出的。下来再说说死区的功能,我一开始看到这个东西的时候也没想明摆它是干什么的,但后来我学到了控制电机的驱动H桥控制电路的时候,我想明白了。H桥控制电路主要是由四个三极管来完成的,其中对角的三极管构成一个通路,也就是说在一个边上的两个三极管是不能同时导通的,而我们通过软件的PWM波来控制三极管的通断的时候,硬件是有延迟的这就不可避免地会出现一个边的两个三极管会同时导通,这时候死区就有用处了。死区就是对有效信号进行了延时(注意是有效信号),从而避免了两个三极管的同时导通。当然死区时间的设置也是有一定讲究的,这在数据手册中都有说明。死区和刹车的设置都是用在一个结构体中设置的。直流电机还是不要设置刹车了,听论坛大神的说法是刹车可能会影响PWM波的输出波形。电机调速嘛,你得知道速度才能调啊!所以我们这里的测速工具就是增量编码器。增量编码器的原理就是电机带着光栅转动,光栅转动会导致光的通断,也就是脉冲信号,将其转换成电信号就能得到方波,从而我们可以对脉冲信号进行计数就能得到电机的转速。这样,问题就来了——我们怎么对脉冲信号进行计数呢?答案就是定时器的编码器模式(之前也没用过,研究了半天才弄明白)。通过TIM_EncoderInterfaceConfig这个函数可以设置定时器为编码器模式,同时可以设置哪个通道在哪种情况下进行计数。我理解的编码器模式就是通道采集增量式编码器发来的脉冲信号,然后对脉冲信号的上升沿或下降沿进行计数,当计数达到我们设置的计数器的自动装载值时,产生中断。当然,如果进行测速的话,我们只通过编码器模式得到电机运动的总路程S是不能得到速度,因此我们还需要一个定时器来计时,这样有路程有时间我们就可以得到电机的转速了。定时器的问题在这里就不赘述了,因为它是PWM模式和编码器模式的基础,不懂的同学自己去看吧!转速有了,那我们的下一步就是调速了。调速的话,就是学过自动化的同学都知道的PID控制,通过我们预想达到的速度与测得的电机速度的差值作为PID控制的输入,通过PID控制来逐渐缩小实际速度与预想速度的差值,最后达到预想速度。关于这个问题的大致理解就是这样的,如果自己想写PID控制的程序的话,我建议你还是好好看看这方面的书籍吧!毕竟我对这个控制也不会很理解,只是找到了一些这方面的资料。我也不能甄别真伪,所以就请大家自己去看吧!这里还要说的一个问题就是PID控制中参数的整定问题,我看了一些资料也不知道是怎么整定的,如果哪位大神知道这个东西,请赐教!!!!对了,还有一个问题是电机转向的问题。一个问题是怎么测得现在电机的转向问题,这在增量编码器中的原理中有的,是根据两个脉冲信号到达高电平的先后来判断的,反映到我们程序里面对应的就是编码器模式下定时器寄存器CR中的DIR位,读取DIR位是向上计数还是向下计数就可以判断是正转还是反转了。令一个问题是如何改变电机现有的转向。这个问题还要归结到硬件知识的H桥控制电路,H桥控制电路不仅能控制调速还能控制转向。一般情况下的H桥控制电路是要两路输入的,而这两路输入只能有一个来进行输入作为电机的电源,这两路输入的切换主要是改变电机线路的正负极接线方式从而改变电机的转向。因此,当需要改变电机的转向时,我们只需要把控制电机的这两路PWM信号进行切换就OK了。 以上这些基本就是我这5天时间里自己理解整理的关于PWM直流电机调速的一些想法。它只是为大家提供了一些编程思路以及控制流程,对于一些实际的代码我想还是大家自己去实现吧!关于硬件的东西,我个人的理解就是要设计一个控制电机的H桥控制电路还有一个就是把电机的增量编码器和STM32的IO口连接好。 这就是我对于STM32定时器和直流电机调速软硬件的一些想法,请各位大神多指正同时也期待与各位同仁的交流!
|