用单片机实现电机调速

2016-06-08 11:50:01 wuhenyouyuyouyu 阅读数 13587

出处:http://blog.sina.com.cn/s/blog_6035432c0100hc8y.html

上一篇文章已经讲解了直流电机的驱动,怎么使它正转,反转和停止,并详细的说了一下H桥原理。今天这里写一下怎么用单片机控制直流电机的速度。

 

直流调速器就是调节直流电动机速度的设备,上端和交流电源连接,下端和直流电动机连接,直流调速器将交流电转化成两路输出直流电源,一路输入给直流电机砺磁(定子),一路输入给直流电机电枢(转子),直流调速器通过控制电枢直流电压来调节直流电动机转速。同时直流电动机给调速器一个反馈电流,调速器根据反馈电流来判断直流电机的转速情况,必要时修正电枢电压输出,以此来再次调节电机的转速。

直流电机的调速方案一般有下列3种方式:

  • 1、改变电枢电压;
  • 2、改变激磁绕组电压;
  • 3、改变电枢回路电阻。

直流电动机的调速 <wbr>用单片机产生PWM控制

使用单片机来控制直流电机的变速,一般采用调节电枢电压的方式,通过单片机控制PWM1,PWM2,产生可变的脉冲,这样电机上的电压也为宽度可变的脉冲电压。根据公式

U=aVCC

其中:U为电枢电压;a为脉冲的占空比(0<a<1);VCC直流电压源,这里为5V。

电动机的电枢电压受单片机输出脉冲控制,实现了利用脉冲宽度调制技术(PWM)进行直流电机的变速。

直流电动机的调速 <wbr>用单片机产生PWM控制

因为在H桥电路中,只有PWM1与PWM2电平互为相反时电机才能驱动,也就是PWM1与PWM2同为高电平或同为低电平时,都不能工作,所以上图中的实际脉冲宽度为B

我们把PWM波的周期定为1ms,占空比分100级可调(每级级差为10%),这样定时器T0每0.01ms产生一次定时中断,每100次后进入下一个PWM波的周期。上图中,占空比是60%,即输出脉冲的为0.6ms,断开脉冲为0.4ms,这样电枢电压为5*60%=3V。

我们讨论的是可以正转反转的,如果只按一个方向转,我们就只要把PWM1置为高电平或低电平,只改变另一个PWM2电平的脉冲变化即可,,如下图(Q4导通,Q3闭合,电机只能顺时针调整转动速度)

直流电动机的调速 <wbr>用单片机产生PWM控制

C语言代码:


#include<AT89X52.h>
#define uchar unsigned char
#define uint unsigned int

sbit K5=P1^4;
sbit K6=P1^5;
sbit PWM1=P1^0;
sbit PWM2=P1^1;
sbit FMQ=P3^6;


uchar ZKB1,ZKB2;

void delaynms(uint aa)
{
  uchar bb;
  while(aa--)
  {
   for(bb=0;bb<115;bb++)     //1ms基准延时程序
   {
    ;
   }
  }
 
}

void delay500us(void)
{
  int j;
  for(j=0;j<57;j++)
  {
   ;
  }
}

void beep(void)
{
  uchar t;
  for(t=0;t<100;t++)
  {
   delay500us();
 FMQ=!FMQ;   //产生脉冲
  }
  FMQ=1;    //关闭蜂鸣器
  delaynms(300);
}


void main(void)
{
  TR0=0;   //关闭定时器0
  TMOD=0x01;  //定时器0,工作方式1
  TH0=(65526-100)/256;
  TL0=(65526-100)%256;    //100us即0.01ms中断一次
  EA=1;        //开总中断
  ET0=1;       //开定时器0中断
  TR0=1;       //启动定时器T0
  ZKB1=50;     //占空比初值设定
  ZKB2=50;     //占空比初值设定
  while(1)
  {
   if(!K5)
 {
   delaynms(15);     //消抖
   if(!K5)      //确定按键按下
   {
     beep();
    ZKB1++;      //增加ZKB1
     ZKB2=100-ZKB1;    //相应的ZKB2就减少
   }
  }      
 if(!K6)
 {
   delaynms(15);     //消抖
   if(!K6)      //确定按键按下
   {
     beep();
    ZKB1--;      //减少ZKB1
     ZKB2=100-ZKB1;    //相应的ZKB2增加
   }
 }
 if(ZKB1>99)
 ZKB1=1;
 if(ZKB1<1)
 ZKB1=99;
 
   }
}


void time0(void) interrupt 1
{
  static uchar N=0;
  TH0=(65526-100)/256;
  TL0=(65526-100)%256;
  N++;
  if(N>100)
  N=0;
  if(N<=ZKB1)
  PWM1=0;
  else
  PWM1=1;
  if(N<=ZKB2)
  PWM2=0;
  else
  PWM2=1;

}


//显现:电机转速到最高后,也就是N为1或99时,再按一下,就变到99或1,
//电机反方向旋转以最高速度

 


2016-04-22 13:59:58 shuoyueqishilove 阅读数 14522

      经过不断地摸索和参考高手的设计,最终完成了单片机的步进电机控制,可以实现步进电机的实时正反转,加速,减速。

     至于步进电机的工作原理,相信很多人都已经知道,本次采用的是四相步进电机,采用四相八拍的工作方式,即:A-AB-B-BC-C-CD-D-DA-A

      具体电路和代码如下:

      之前也做过按键控制的的程序,但是每次按下键后,相应很慢,非得等到一个模块的循环完成,才能响应按键的操作,这几天在网上看到了有高手通过启用外部中断的方法来实现按键的控制,自己下去再proteus中验证 ,效果很不错,很高兴,现在把相关的电路图和代码图贴出来仅供参考,欢迎指教......

代码及工程已经上传至CSDN,欢迎下载!

https://download.csdn.net/download/shuoyueqishilove/9499242


2019-04-26 08:01:28 future_ai 阅读数 837

附录2

直流电机PWM调速系统中控制电压非线性研究

引言

    由于线性放大驱动方式效率和散热问题严重,目前绝大多数直流电动机采用开关驱动方式。开关驱动方式是半导体功率器件工作在开关状态,通过脉宽调制PWM控制电动机电枢电压,实现调速。目前已有许多文献介绍直流电机调速,宋卫国等用89C51单片机实现了直流电机闭环调速;张立勋等用AVR单片机实现了直流电机PWM调速;郭崇军等用C8051实现了无刷直流电机控制;张红娟等用PIC单片机实现了直流电机PWM调速;王晨阳等用DSP实现了无刷直流电机控制。上述文献对实现调速的硬件电路和软件流程的设计有较详细的描述,但没有说明具体的调压调速方法,也没有提及占空比与电机端电压平均值之间的关系。在李维军等基于单片机用软件实现直流电机PWM调速系统中提到平均速度与占空比并不是严格的线性关系,在一般的应用中,可以将其近似地看作线性关系。但没有做深入的研究。本文通过实验验证,在不带电机情况下,PWM波占空比与控制输出端电压平均值之间呈线性关系;在带电机情况下,占空比与电机端电压平均值满足抛物线方程,能取得精确的控制。本文的电机闭环调速是运用Matlab拟合的关系式通过PID控制算法实现。

1 系统硬件设计

    本系统是基于TX-1C实验板上的AT89C52单片机,调速系统的硬件原理图如图1所示,主要由AT89C52单片机、555振荡电路、L298驱动电路、光电隔离、霍尔元件测速电路、MAX 232电平转换电路等组成。

 

图1 闭环控制系统示意图

2 系统软件设计

    系统采用模块化设计,软件由1个主程序,3个中断子程序,即外部中断0、外部中断1,定时器0子程序,PID算法子程序,测速子程序及发送数据到串口显示子程序组成,主程序流程图如图2所示。外部中断0通过比较直流电平与锯齿波信号产生PWM波,外部中断1用于对传感器的脉冲计数。定时器0用于对计数脉冲定时。测得的转速通过串口发送到上位机显示,通过PID模块调整转速到设定值。本实验采用M/T法测速,它是同时测量检测时间和在此检测时间内霍尔传感器所产生的转速脉冲信号的个数来确定转速。由外部中断1对霍尔传感器脉冲计数,同时起动定时器0,当计数个数到预定值2 000后,关定时器0,可得到计2 000个脉冲的计数时间,由式计算出转速:

n=60f/K=60N/(KT) (1)

    式中:n为直流电机的转速;K为霍尔传感器转盘上磁钢数;f为脉冲频率;N为脉冲个数;T为采样周期。

 

图2 主程序流程图

3 实验结果及原因分析

    3.1 端电压平均值与转速关系

    3.1.1 实验结果

    实验用的是永磁稳速直流电机,型号是EG-530YD-2BH,额定转速2 000~4 000 r/min,额定电压12 V。电机在空载的情况下,测得的数据用Matlab做一次线性拟合,拟合的端电压平均值与转速关系曲线如图3(a)所示。相关系数R-square:0.952 1。拟合曲线方程为:

y=0.001 852x+0.296 3 (2)

    由式(2)可知,端电压平均值与转速可近似为线性关系,根椐此关系式,在已测得的转速的情况下可以计算出当前电压。为了比较分析,同样用Matlab做二次线性拟合,拟合的端电压平均值与转速关系曲线如图3(b)所示。相关系数R-square:0.986 7。

 

图3 端电压平均值与转速关系曲线图

3.1.2 原因分析

    比较图3(a)可知,当转速在0~1 500 r/min和4 000~5 000 r/min,端电压平均值与转速间存在的非线性,用二次曲拟合如图3(b)所示,拟合相关系数较高。由图3(a)可见,当电机转速为0时电机两端电压平均值约为1.3 V。这是因为电机处于静止状态时,摩擦力为静摩擦力,静摩擦力是非线性的。随着外力的增加而增加,最大值发生在运动前的瞬间。电磁转矩为负载制动转矩和空载制动转矩之和,由于本系统不带负载,因此电磁转矩为空载制动转矩。空载制动转矩与转速之间此时是非线性的。电磁转矩与电流成正比,电流又与电压成正比,因此此时电压与转速之间是非线性的。

    当转速在2 000~4 000 r/min线性关系较好,占空比的微小改变带来的转速改变较大,因此具有较好的调速性能。这是因为随着运动速度的增加,摩擦力成线性的增加,此时的摩擦力为粘性摩擦力。粘性摩擦是线性的,与速度成正比,空载制动转矩与速度成正比,也即电磁转矩与电流成正比,电流又与电压成正比,因此此时电压与转速之间是线性的。当转速大于4 000 r/min。由于超出了额定转速所以线性度较差且调速性能较差。此时用二次曲线拟合结果较好,因为当电机高速旋转时,摩擦阻力小到可以忽略,此时主要受电机风阻型负荷的影响,当运动部件在气体或液体中运动时,其受到的摩擦阻力或摩擦阻力矩被称为风机型负荷。对同一物体,风阻系数一般为固定值。阻力大小与速度的平方成正比。即空载制动转矩与速度的平方成正比,也即电磁转矩与速度的平方成正比,电磁转矩与电流成正比,电流又与电压成正比,因此此时电压与转速之间是非线性的。

 3.2 占空比与端电压平均值关系

    3.2.1 实验结果

    拟合占空比与端电压平均值关系曲线如图4所示。相关系数R-square:0.998 4。拟合曲线方程为:

 

图4 占空比与端电压平均值关系曲线图

    如图4所示,占空比与端电压平均值满足抛物线方程。运用积分分离的PID算法改变电机端电压平均值,可以运用此关系式改变占空比,从而实现了PWM调速。

    用示波器分别测出电压的顶端值Utop与底端值Ubase,端电压平均值Uarg满足关系式:

    其中:α为占空比。

    正是由于所测得的电机端电压底端值Ubase不为0,所以得出的占空比与端电压平均值之间关系曲线为抛物线。若将电机取下,直接测L298的out1与out2输出电压。所测得的电机端电压底端值Ubase约为0,所得的占空比与端电压平均值满足线性关系,即令式(4)中Ubase为0,式(4)变为:

 

    3.2.2 原因分析

    将电机取下后,直接测L298的输出端之间的电压,占空比与端电压平均值满足关系式(5),说明整个硬件电路的设计以及软件编程的正确性。从电机反电势角度分析,当直流电机旋转时,电枢导体切割气隙磁场,在电枢绕组中产生感应电动势。由于感应电动势方向与电流的方向相反,感应电动势也即反电势。直流电机的等效模型如图5所示。图5(a)表示电机工作在电动机状态。图5(b)表示电机工作在发电机状态。

 

图5 直流电机等效电路

    如图5(a)所示,电压平衡方程为:

式中:U为外加电压;Ia为电枢电流;Ra为电枢绕组电阻;2△Ub为一对电刷接触压降,一般取2△Ub为0.5~2 V;Ea为电枢绕组内的感应电动势。电机空载时,电枢电流可忽略不计,即电流Ia为0。空载时的磁场由主磁极的励磁磁动势单独作用产生。给电机外加12 V的额定电压,由(6)可得反电势:

 

    以40%的占空比为例,电机端电压Uab是测量中的电压平均值Uarg,其值为8.34 V,测量中的电压底端值Ubase约为7 V。由式(7)可得Ea的值范围应在6.34~7.84 V。由图5(b)可见,此时Uab的值是测得的底端值Ubase即电机的电动势Ea为7 V。

    当PWM工作在低电平状态,直流电机不会立刻停止,会继续旋转,电枢绕组切割气隙磁场,电机此时工作在发电机状态,产生感应电动势E。

 

    式中:Ce为电机电动势常数;φ为每级磁通量。由于电机空载,所以图5(b)中无法形成回路。用单片机仿真软件Proteus可直观的看出在PWM为低电平状态,电机处于减速状态。低电平持续时间越长,电机减速量越大。正是由于在低电平期间,电机处于减速状态,由式(8)可知,Ce,φ均为不变量,转速n的变化引起E的改变。此时Uab的值等于E的值。电机在低电平期间不断的减速,由于PWM周期较短,本文中取20 ms,电机在低电平期间转速还未减至0,PWM又变为高电平了。这样,就使测得的Ubase值不为0。以40%的占空比为例,当PWM工作在低电平状态,测得Ubase的值约为7 V。由式(8)可知,当正占空比越大,转速也就越大,同时减速时间越短,感应电势E的值越大。所以Ubase的值也就越大。

4 结语

    重点分析了直流电机PWM调速过程中控制电压的非线性,对非线性的影响因素做了详细的分析。由于PWM在低电平期间电压的底端值不为0,导致了占空比与电机端电压平均值之间呈抛物线关系。因此,可用得出的抛物线关系式实现精确调速。本系统的非线性研究可为电机控制中非线性的进一步研究提供依据,在实际运用中,可用于移动机器人、飞行模拟机的精确控制。

2017-05-26 21:36:44 u013055655 阅读数 2797

PID作为一种线性控制器在各领域得到广泛使用,具体原理就不细说了,本人其实也是一知半解就不班门弄斧了。

以下仅就这两天对于PID实现电机调速的一些心得跟大家分享一下。

PID主要的实现方式有两种 ,位置式和增量式,公式就不列了,其实核心思想个人认为就是时刻检测误差,再乘一定系数,再用此值修正。

位置式PID计算出的就是控制量u(k),电机控制中此值就是PWM的占空比。

增量式PID计算出的值是△u(k),还需要加上u(k-1)才是控制量 即 u(k)=△u(k)+u(k-1)。

用C语言实现单片机对电机的PID调速,需要注意采样周期,我定为10.25ms测试可用,不知这个时间有没有什么讲究。

使用位置式PID时,我创建的是float工程,最终无论如何也没有调试成功,难道是16为单片机(MC9S12EP100)对浮点运算有要求?后来换了增量式PID,采用整形的工程,先左移8位的计算完右移动的方式,避免系数太小除成 0,最终实现PID调速。

增量式整形工程的PID也有很多细节需要注意。最重要的就是注意最后计算完成右移语句的位置,必须是在完成所有计算之后再右移,否则当偏差不够大时还是会除成0,导致调不到目标转速,总差一点。

一开始我还认为是转速测的不准导致的,后来用平均转速却根本无法计算。这里再多提一句,平均转速对PID计算的精度貌似是没有用的,我这里用滚动计算的方式计算10个齿的平均转速。

 if(CrankToothNum>=10)                                          //存十个齿前的齿号
    {
       i_Vary= CrankToothNum -10;
    }
  else
    {
       i_Vary= CrankToothNum+10;     
    }
    CrkAS_tiInsSpeedSum -=  CrkDrv_tiInsSpeed[i_Vary];
    CrkAS_tiInsSpeedSum += ctCrankCyc;                               //减一个加一个 去旧迎新 始终保持存着十个数

但是,这里注意这个平均转速实用在PID里其实△e就是误差e(某齿瞬时转速)-误差e(该齿前十个齿的瞬时转速),相比还不一定有瞬时转速精确。

后来发现是因为右移除的早了,猜测达不到目标转速就是因为刚开始误差够大,除完还不至于是0,等小到一定程度就不能再调了。

在提示一下,增量式PID这两句一定不能颠倒:

 pid.gPreError=pid.gExError;  //上上一次偏差存储 用于计算  
 pid.gExError=Error;             //上一次偏差存储 用于计算

最后总结一个PID系数整定的个人理解方法,先把P和D都设为0,只用I,因为只有积分无论如何都是可以调到目标值的只是速度快慢,积分稳了之后再调P。D个人感觉不用也罢 。最主要的就是积分I的系数了。

以上,欢迎交流讨论。



2019-11-16 13:42:17 JiaoDaBoy 阅读数 2739

注:获取全套设计资源,请见文末说明…
设计思路
直流电机PWM控制系统的主要功能包括:很实现对直流电机的加速、减速以及电机的正转、反转和急停,并且可以调整电机的转速,能够方便的实现电机的智能控制。

主体电路:即直流电机PWM控制模块。这部分电路主要由AT89C52单片机的I/O端口、定时计数器、外部中断扩展等控制直流电机的加速、减速以及电机的正转和反转,并且可以调整电机的转速,能够很方便的实现电机的智能控制。其间是通过AT89C52单片机产生脉宽可调的脉冲信号并输入到L298驱动芯片来控制直流电机工作的。该直流电机PWM控制系统由以下电路模块组成:
设计输入部分:这一模块主要是利用带中断的独立式键盘来实现对直流电机的加速、减速以及电机的正转、反转和急停控制。
设计控制部分:主要由AT89C52单片机的外部中断扩展电路组成。直流电机PWM控制实现部分主要由一些二极管、电机和L298直流电机驱动模块组成。
设计显示部分:LED数码显示部分,实现对PWM脉宽调制占空比的实时显示。

系统框架
在这里插入图片描述
原理为:直流电机PWM调速系统以AT89C52单片机为控制核心,由命令输入模块、LED显示模块及电机驱动模块组成。采用带中断的独立式键盘作为命令的输入,单片机在程序控制下,定时不断给L298直流电机驱动芯片发送PWM波形,H型驱动电路完成电机正,反转和急停控制;同时单片机不停的将PWM脉宽调制占空比送到LED数码管完成实时显示。
仿真电路图
在这里插入图片描述

仿真结果如下
在这里插入图片描述
本设计内容详细,涵盖 单片机最小系统设计原理;按键与数码管显示设计;PWM调速原理、方法及实现过程;L289电机驱动芯片设计原理;完整Keil c程序 等内容。让您对直流电机PWM调速控制系统设计过程一目了然。

资源分享内容

(1)基于51单片机的直流电机PWM调速控制系统设计.doc【完整版文档】
(2)Proteus仿真文件;
(3)Keil C语言程序文件;
(4)L298驱动芯片技术手册等参考资料;
(5)Visio绘制的流程图;

资源截图如下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
资源获取方法
资源获取方法
资源获取方法
重要的事情说三遍!!!!!!!!!!!
由于本设计为作者原创设计,
获取完整的Word设计报告、Proteus仿真、Keil C程序、Visio流程图文件和参考文献资料。
请微信搜索关注公众号:交大小将
在这里插入图片描述