直流电机PID定速控制研究最近在研究有刷直流电机的PID转速控制,在网上买了学习套装就开始了各种学习。具备的基础知识:(1)PID的基础理论;如p,I,d的含义等等。(2)理论PID与单片机离散式PID的区别,如何在单片机实现离散PID。(3)STM32单片机的基本操作;如端口定义、按键、串口、定时器的PWM输出、定时器编码器模式操作等等。 在具备了以上知识后,当然我以前也用过STM32,也用过51和AVR单片机,对单片机的基本操作还是有基础的。 按照学习套件的源码进行了解析,我知道要想对电机转速进行定速控制,需要实时转速的反馈,所以第一个问题是找出源码中如何实现转速反馈的。系统用了定时器的编码器模式实现转速的测量,其实这种模式无非就是能实现4倍频,和51单片机的计数器差不多。即先用一个定时器定时20ms,然后到时去取定时器的值,读完后清零。这个是和其它测速法是一样的。假定目标转速设定为50,即20ms内读取50个脉冲,但要记住此50个脉冲是编码器发出的,有4倍频的关系才能计算出真正的转速。第二个问题:PID程序放的位置。这个其实就是利用其中一个定时器定时10ms进行中断,采集实时转速,然后计算应该输出的PWM值 。当时,为了减轻单片机负担,一般定时20ms检测一次。第三个问题:PWM的输出和调制。利用定时器PWM的输出,轻松可以实现。但在实际操作中,还是有很多问题。好好看看STM32定时器在PWM模式下的操作。这里面,我们设定的PWM频率是10KHz,ARR定义为7199,即72000000/7200=10000Hz。所以为了调制PWM,此方波高电平的时间,最多就是7200。我在研究这个问题的时候就是卡在了输出量上,因为在输出PWM时,肯定要限值,因为最大是7200,当通过PID计算后的PWM大于7200或者小于-7200时,都要调整为7200。 我就是想实时看一看输出的PWM是多少?结果这个问题困扰了我三天。在我的想象中,PWM输出的值 肯定在7200以内,不可能比这个大。但是用串口发出的数据显示,这个数据大极了,一直是FFEA差不多。后来,经过仔细研究发现,在KEIL中int定义的数是有符号的整型数,数据位数是32位。负数在存储器中存的是补码。由于眼瞎没看出来实际发送时用的是绝对值,而串口发送的是原值,导致送到电机控制芯片的是正值,而串口发的是负数,即补码,取反加一。所以串口中一直是比较大的数据。研究明白后,不禁松了一口气。写了以上文字以示纪念。 总结:细心,耐心,不放弃。同时身边的器材要齐全,比如好的示波器、万用表等等。
dalei1999@163.com
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>