使用MCU作实时控制时,用定时器结合PID算法来控制电机工作,要想稳住不抖,确实得下一番功夫,相对来说还是需要有一定经验的。下面我就结合自己的经验,详细说说我是怎么做的,也顺便吐槽吐槽那些让我调到忘记怎么写的时刻。
硬件层面,首先,硬件层面得打好基础,要把电路做的稳定才行。当然拉对MCU的选择很关键,得选那些性能稳定、定时器资源丰富的型号。定时器要配置可以很好的操作配合的很洽当,PWM输出的频率和占空比得根据电机的特性和需求来设定。如果电机需要快速响应,PWM频率就得设高些;如果电机功率大,占空比就得调整得精细些,避免电流过大烧坏电机,和PCB板MOS管。 电机的驱动电路也得设计好,通常会选择那些专门为电机驱动设计的芯片,当然这个要根据产品的需要来选择,国内现在电机驱动芯片非常多,而且像那些芯片的功能远超国外的芯片,它们内置了H桥电路,可以方便地控制电机的正反转和调速。还有电流设计环,电机堵转检测等等一些功能同时,为了保护电机和MCU,我还会在电路中加入过流保护、过压保护和欠压保护等电路。
定时器配置,精准触发定时器是实时控制的核心,我通常会用定时器的PWM输出功能来生成控制电机的信号。定时器的中断服务程序里,我会进行ADC采样,读取电机的反馈信号,电流、速度或者位置,根据PID算法计算出新的PWM占空比,更新到定时器的比较寄存器中,从而控制电机的转速,一般都是通过霍尔传感器来实现采集。 定时器的配置得非常精准,定时器的预分频系数、自动重装载值等,都得根据系统的时钟频率和PWM频率来计算,为了得到更精确的PWM波形,我还会使用定时器的互补输出和死区时间等功能,避免上下管同时导通造成短路。
PID算法,PID算法是实时控制的灵魂,P比例、I积分、D微分三个参数的调整,简直就是个技术活,也是个耐心活,这个要考虑到个人的耐心,也要看个人细心,如果处理的好,那电机工作起来就会很顺,我介绍一下这三个参数是什么作的。 P参数,主要负责系统的响应速度。P参数调大了,电机响应快,但容易超调,甚至振荡;P参数调小了,电机响应慢,但系统稳定。我通常会先调P参数,让电机能够快速响应指令,但又不会超调太多。 I参数,主要负责消除系统的稳态误差。如果电机在稳定运行时还有误差,那就得调I参数。但I参数调大了,系统容易积分饱和,导致超调甚至振荡;I参数调小了,稳态误差又消除不了。我通常会等P参数调得差不多了,再慢慢调I参数。 D参数,主要负责抑制系统的超调和振荡。D参数调大了,系统响应会变慢,但超调会减小;D参数调小了,系统超调会增大。我通常会最后调D参数,根据系统的实际情况来微调。 调参的过程简直就是个煎熬。有时候,为了找到一组合适的参数,我得反复修改代码,反复测试,反复观察电机的运行情况。有时候,调了一整天,电机还是抖得像帕金森一样,那时候的心情,简直比吃了苍蝇还难受。
中断优先级,在实时控制中,中断优先级的管理也很重要,把那些对实时性要求高的任务,ADC采样、PID计算等,放在高优先级的中断中处理。而那些对实时性要求不高的任务,通信、显示等,就放在主循环中处理。 有时候,为了优化系统的实时性,我还会玩一些中断优先级的多样性控制,会把PWM输出的更新中断设为最高优先级,确保PWM波形的稳定性;把ADC采样的中断设为次高优先级,确保能够及时获取电机的反馈信号;而把PID计算的中断设为中等优先级,既保证计算的速度,又避免占用太多的CPU资源。
当然,也不是每次都能调得那么顺利。有一次,我接了一个项目,要求用MCU控制一个电机,实现精确的速度和位置控制。我信心满满地开始调参,结果电机抖很厉害,完全没法用。 我反复检查了硬件电路,确认没有问题;又反复检查了代码,也没有发现明显的错误,后面我才发现,原来是定时器的配置有问题。我把定时器的预分频系数设错了,导致PWM的频率不对,电机自然就抖得厉害。所以还是要很细心任何一个细节都不能马虎。有时候,一个小小的错误,就可能导致整个系统无法正常工作。
|