视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
基于LPC2124的直流电机调速系统Proteus仿真
2025-09-29 04:53:43 责编:小OO
文档
基于LPC2124的直流电机调速系统Proteus仿真

1直流电机、减速器及传感器选型

设计要求驱动轮式机器人,两轮的直径相同为0.1m,驱动电机选用直流电机,为了满足加速度需求,每个电机配备了减速装置,且两轮为驱动。小车运行过程中自带电池,电池的供电电压为+24VDC,为满足机器人比赛需要,经需求分析可得该机器人运动控制系统的最大速度为:5.0m/s,最大加速度为:20m/,控制方案采用闭环控制方案。

通过计算可知,在没有减速器的情况下,电机应达到955r/min才能实现最大转速5.0m/s,启动时间应该小于0.25s才能达到最大加速度20m/的要求。所以,可以选择额定电压24V,空载转速2500r/min的直流电机,采用调速比2.5的减速器,加速度要求通过软件实现。

系统要求采用闭环控制方案,本设计采用转速单闭环控制,选用旋转编码器作为测速传感器。旋转编码器不仅精度高,而且安全稳定、维护方便,在Proteus库里有配套旋转编码器的直流电机,方便仿真。理论上旋转编码器的光栅数越大,测速越精确,但是光栅数的增大会增加制作难度和成本,本设计只是用于轮式机器人的测速,采用光栅数1024的旋转编码器足以,同时可以采用四倍频电路提高转速分辨率。

在基于Proteus仿真的直流电机调速系统中,由于各种,设计并不能达到系统的具体要求,但是可以作为一个可供参考的调速模型。

2直流电机调速系统硬件设计

2.1硬件系统结构图

直流电机转速单闭环调速系统硬件结构图如图1 所示

图1 直流电机转速单闭环调速系统硬件结构图

2.2 LPC2124简介

LPC2124是基于一个支持实时仿真和跟踪的16/32位ARM7TDMI-S CPU的微控制器,并带有256KB嵌入的高速Flash存储器。128位宽度的存储器接口和独特的加速结构使32位代码能够在最大时钟速率下运行,且可使用16位Thumb模式。

LPC2124支持多种通信接口,包括UART, 和SPI等串行接口以及PWM输出接口,外围接口部分设计极为方便、灵活。

2.3 电机驱动芯片L298介绍

L298N是ST公司生产的一种高电压、大电流电机驱动芯片。该芯片采用15脚封装。主要特点是:工作电压高,最高工作电压可达46V;输出电流大,瞬间峰值电流可达3A,持续工作电流为2A;额定功率25W。内含两个H桥的高电压大电流全桥式驱动器,可以用来驱动直流电动机和步进电动机、继电器线圈等感性负载;采用标准逻辑电平信号控制;具有两个使能控制端,在不受输入信号影响的情况下允许或禁止器件工作有一个逻辑电源输入端,使内部逻辑电路部分在低电压下工作;可以外接检测电阻,将变化量反馈给控制电路。使用L298N芯片驱动电机,该芯片可以驱动一台两相步进电机或四相步进电机,也可以驱动两台直流电机。芯片内部结构图如图2所示。

图2 L298芯片的内部结构图

L298驱动直流电机参考表1

表1 L298驱动直流电机参考表

电机旋转方式控制端IN1

控制端IN2

控制端IN3

控制端IN4

输入PWM信号改变脉宽可调速

调速端A

调速端B

M1正转///
反转///
停止///
M2正转///
反转///
停止///
2.4 直流电机调速系统Proteus仿真电路

     Proteus的元件库中提供许多种类型的电机元件,从简单的直流电机到步进电机、伺服电机都有,我们选取一个带编码器的电机MOTOR-ENCODER来仿真,之所以用带编码器的,是因为我们需要用到编码器的输出信号来测量电机的转速。MOTOR-ENCODER的编码输出与本系统所要求的增量式旋转编码具有同等功能,可提供两路路具有90○相位差的编码脉冲,利用其中任何一个可实现对转速的检测。

在MOTOR-ENCODER的属性中可设置其参数,本系统对MOTOR-ENCODER的参数设置如表2所示。

表2 Motor-Encoder参数表

参数名参数值 

额定电压24 V
线圈电阻12 Ω
线圈电感100 mH
空载转速1000 rpm
负载率10 %
每转脉冲数60
直流电机调速系统Proteus仿真电路如图2所示。

图2 直流电机调速系统Proteus仿真电路

    系统采用24MHz晶振提供外部时钟,LPC2124的P0.6,P0.7输出高低电平控制电机转速方向;四个二极管作为续流二极管,起保护作用;四个按键通过上拉电阻与LPC通用端口相连,按键按下,低电平有效,另外通过一个四输入与门与外部中断EINT0相连,通过外部中断方式判断是否有按键按下,四个按键分别实现电机加速、减速、反转、制动的功能。

3直流电机调速系统软件设计

3.1 直流电机调速系统软件设计流程图

直流电机调速系统软件设计流程图如图3所示,中断程序如图4、图5所示。

       

图3 调速系统软件                 图4 按键中断           图5 测速中断

设流程图                       程序流程图            程序流程图

3.2 PWM模块

系统采用PWM方法调整电动机的速度,首先应确定合理的脉冲频率。脉冲宽度一定时,频率对电机运行的平稳性有较大影响,脉冲频率高电动机运行的连续性好,但带负载能力差;脉冲频率低则反之。

调脉宽的方式有三种:定频调宽、定宽调频和调宽调频。

我们采用了定频调宽方式,因为采用这种方式,电动机在运转时比较稳定;并且在采用LPC2124产生PWM脉冲的软件实现上比较方便。

PWM输出频率采用系统时钟频率,通过转速调节器调节PWM占空比,实现直流电机的调速驱动。PWM初始化子程序流程如图6所示。

图6 PWM初始化流程图

3.3测速模块

本系统采用T法测速,旋转编码器输出的脉冲由LPC2124的P0.28捕获,电机每转一圈旋转编码器输出60个脉冲,每捕获一个编码器输出脉冲,则进入中断读取定时器的值,计算测速时间,通过公式(1-2)计算转速

                (1-1)

T法测速原理如图7所示。

图7 T法测速原理图

定时器0初始化流程图如图8所示。

图8 定时器0初始化流程图

3.4 数字PI调节器模块

在微机数字控制系统中,当采样频率足够高时,可以先按模拟系统的设计方法设计调节器,然后再离散化,就可以得到数字控制器的算法,这就是模拟调节器的数字化。

当输入时误差函数e(t)、输出函数是u(t)时,PI调节器的传递函数如下:

                (1-2)

式中:Kpi为PI调节器比例部分的放大系数;

t为PI调节器的积分时间常数。

式子(1-2)的时域表达式可写成:

                (1-3)

其中,为比例系数,1/t为积分系数。

将上式离散化成差分方程,其第k拍输出为:

(1-4)

其中,为采样周期。

式(1-4)表述的差分方程为位置式算法,u(k)为第k拍的输出值。

由式子看出,比例部分只与当前的偏差有关,而积分部分则是系统过去所有偏差的累积。位置式PI调节器的结构清晰,P和I两部分作用分明,参数调整简单明了。

为了安全起见,常须对调节器的输出实行限幅。

在数字控制算法中,要对u限幅,只须在程序内设置限幅值um,当u(k)>um时,便以限幅值um作为输出。而位置式算法必须要同时设积分限幅和输出限幅。

带有积分限幅和输出限幅的位置式数字PI调节程序框图如图9所示。

图9位置式数字PI调节流程图

本系统只采用了P调节器,即令PI参数为零,经过仿真发现系统可以较稳定地运行。

3.5 直流电机制动

直流电机要达到快速制动,必须采用反压制动方式,所以制动过程采用另外的程序设计。因为原先采用统一的调速程序发现,制动过程反转超调后就向反方向加速,导致系统不稳定。采用的程序设计实现电机逐级制动,随转速降低减小PI参数,最后置高P0.6、P0.7,保证超调也不会反转加速。

4直流电机调速系统Proteus仿真结果

本系统采用简单的按键操作,实现电机的加速、减速、制动、反转功能,由于时间仓促,在判断按键过程,我们只考虑了只有一个按键按下的情况。

本系统各按键的共能如下

1 加速键用于电机加速,每按一次电机转速增加10r/min。

2 减速键用于电机减速,每按一次电机转速减小10r/min。

3 制动键用于电机制动,停止电机旋转。

4 反转键用于电机反转,每按一次电机反转。

按键仿真图如图10所示。

图10 按键仿真图

当连接好仿真图和载入LPC2124的执行文件后,单击Proteus的仿真启动按钮,则开始对本系统的仿真。其运行流程如下:

(1) 按20次加速键让电机启动正转,达到200r/min,所需时间大致在1.3s 左右,如图11所示。

图11 加速正转

    (2) 按一次减速键,电机转速减小10r/min,到达190r/min,如图12所示。

图12 减速

    (3) 按一次反转按键,电机反转,到达-190r/min,如图13所示。

图13 反转

    (4) 按一次制动键,电机制动,转速较大时,电机可以快速制动到接近零,之后缓慢减速,如图14所示。

图14 制动

      经过仿真调试,发现系统可以实现基本的调速功能,并且可以较快速地启动,系统具有较好的稳定性,误差范围在。

5  结束语

本设计采用ARM7 LPC2124及外部扩展设备实现对直流电机的转速监控,在硬件上采用了基于PWM技术的H型桥式驱动电路,解决了电机驱动的效率问题,在软件上也采用较为合理的系统结构及算法,提高了ARM的使用效率。

以往的数字化直流调速系统中转速常用测速发电机来检测,这种测速方法的精度不够高,在低速时更为严重,很难保障生产的高效、安全运行,所以在本次设计中测速采用了目前较先进的旋转编码器测速,即数字测速。数字测速不仅精度高,而且安全稳定、维护方便。本系统的直流调速系统采用单闭环P调节器控制。用软件编程完成转速驱动,转速检测,实现了对转速的最优化调节。同时还实现了转速的按键输入控制。

通过本次设计,加强了我对ARM应用知识的掌握,同时了解了目前工业生产中数字化系统的重要性,使我对使用ARM实现自动化控制的设计过程有了全面地了解。通过学习控制系统工作原理以及如何利用ARM实现各种功能,我查阅了大量相关资料,学会了许多知识,培养了我解决问题的能力。同时在对硬件电路设计的过程中,巩固了我的专业课知识,使自己受益匪浅。当然在本次设计中还有需要完善的地方,比如可以增加一个显示模块,显示系统运行的状态,还可以改善调节器,采用PID调节器使转速稳定无超调,另外还可以改善按键输入为数字键盘输入,这样可以给定具体的转速。

总之,通过本次设计不仅进一步强化了专业知识,还掌握了设计系统的方法、步骤等,为今后的工作和学习打下了坚实的基础。由于时间仓促,本论文中或多或少会存在一些缺点,所设计的软件难免存在一些不足,恳请老师批评和指正。

附录  基于LPC2124的直流电机调速系统源代码

/******************************************************************************

*File: Main.c

*功能: 使用PWM6输出PWM信号,通过KEY1,KEY2,KEY3控制电机转速,KEY1按一次加速10r/min,KEY2按一下减速10r/min,KEY3按一下制动,KEY4按一下反转

******************************************************************************/

#include "LPC21xx.h"

typedef   unsigned int uint32;

typedef int int32;

#define pwmdata 240000           /*PWM周期*/

#define f0 1000000               /*计数器频率*/

#define Z 60                   /*电机每转一圈产生Z个脉冲*/

#define kp 0.1                   /*PI调节器比例系数*/

#define ki 0                   /*PI调节器积分系数*/

#define KEY   0x0b800000       /*P0.23,P0.24,P0.25,P0.27引脚连有按键*/

#define KEY1  0x00800000       /*P0.23引脚连接KEY1*/

#define KEY2  0x01000000       /*P0.24引脚连接KEY2*/

#define KEY3  0x02000000       /*P0.25引脚连接KEY3*/

#define KEY4  0x08000000       /*P0.27引脚连接KEY4*/

uint32 t1=0,t2=0,i=0;

uint32 flag=0;                   /*制动标志,flag=1转速接近0*/

uint32 fv=0;                   /*正反转标志,fv=0正转,fv=1反转*/ 

int32 nu=0,n=0;                    /*nu给定转速,n检测转速*/

__irq void IRQ_T0(void)

{    

   t2=T0CR2;                   //读取捕获寄存器

   T0CR2=0;                       //捕获寄存器清零

   if(t1   else if(t1>t2) n=1.236*60*f0/(Z*(t2-t1+f0));     //1.236为修正系数

   t1=t2;

   T0IR=0x40;            //清除捕捉0中断标志(向6位写1)                   

   VICVectAddr=0x00;   //中断结束

}

__irq void IRQ_EINT0(void)    

{

  uint32 i;

  IOCLR0=0x00000001;

  for(i=0;i<50;i++);                      //延时去抖

  if((IOPIN0&KEY)!=KEY)

    if((IOPIN0&KEY1)==0)                   //KEY1按键按下,加速

       {

         flag=0;

if(nu>=0) nu+=10;

         else nu-=10;

        }

    else if((IOPIN0&KEY2)==0)               //KEY2按键按下,减速

            {

              if(nu>10) nu-=10;

              else if(nu<-10) nu+=10;

                   else nu=0;

            }

         else if((IOPIN0&KEY3)==0) {nu=0;}        //KEY3按键按下,制动

                else if((IOPIN0&KEY4)==0)         //KEY4按键按下,反转

                   {

                     if(fv==0) fv=1;

                     else  fv=0;

                     nu=-nu;

                   }

  while((IOPIN0&KEY)!=KEY);             //等待按键放开  

  EXTINT=0x01;          //清楚EINT0中断标志

  VICVectAddr=0x00;   //中断结束

}

void TargetInit(void)

  /*管脚配置初始化*/

  PINSEL0=0x00080000;                     //设置PWM6连接到P0.9引脚

  PINSEL1=0x02000000;                     //P0.28捕捉

  IODIR0=0x000002c0;                      //P0.6,P0.7,P0.9输出

  /*PWM初始化*/

  PWMPR=0x00;                      //不分频,计数频率为Fpclk

  PWMMCR=0x02;                     //设置PWMMR0匹配时复位PWMTC

  PWMMR0=pwmdata;                  //设置PWM周期

  PWMMR6=120000;                   //设置PWM占空比

  PWMLER=0x40;                     //PWMMR6锁存

  PWMPCR=0x4000;                   //允许PWM6输出,单边PWM

  PWMTCR=0x09;                     //启动定时器,PWM使能

  /*EINT0中断初始化*/

  PINSEL1=(PINSEL1&0xfffffffc)|0x01;   //选择P0.16为EINT0

  EXTMODE=EXTMODE&0x0e;                   //电平触发

  EXTPOLAR=EXTPOLAR&0x0e;               //低电平中断

  /*定时器0初始化*/

  T0TC=0;                         //清除 T0计数值

  T0PR=23;                         //24分频(24MHZ分频后变成1MHZ)

  T0MR0=1000000;                 //计数匹配值

  T0CCR=0x0140;                    //第七位写1进入捕捉模式 (上升沿捕捉,进入中断)

  T0MCR=0x00000002;             //匹配后复位T0(不停止)

  T0TCR=0x00000002;             //复位计数器

  T0TCR=0x00000001;             //计数器使能

  

  /*中断向量初始化*/

  VICIntSelect=0x00000000;               //中断向量寄存器选择0,IRQ中断

  VICVectCntl0=0x20|4;                  //定时器0中断分配为向量IRQ通道0

  VICVectAddr0=(uint32)IRQ_T0;          //向量IRQ通道0的中断服务程序地址为IRQ_T0

  VICVectCntl1=0x20|14;                  //EINT0中断分配为向量IRQ通道1

  VICVectAddr1=(uint32)IRQ_EINT0; //向量IRQ通道1的中断服务程序地址为IRQ_EINT0

  VICIntEnable=(1<<4)|(1<<14);          //定时器0和EINT0中断使能

  EXTINT=0x07;                          //清楚外部中断标志

}        

/******************************************************************************

*名称: main()

*功能: 使用PWM6输出占空比可调的PWM波形,控制直流电机

******************************************************************************/

int main(void)

{  

  float PI=0,sum=0;

  int32 es=0;

  TargetInit();

  while(1)

  {  

     if(nu==0)                            //制动 

       if(fv==0)                        //如果正转

         if(n>50) PI=-0.8;

else if(n>20) PI=-0.5;

else if(n>10) PI=-0.3;

else if(n>3) PI=-0.1;

                         else {PI=0;flag=1;}

       else                                //如果反转

         if(n>50) PI=0.8;

else if(n>20) PI=0.5;

else if(n>10) PI=0.3;

else if(n>3) PI=0.1;

                         else {PI=0;flag=1;}

     else

           {

         if(nu>0) es=nu-n;

         else     es=nu+n;

         sum=sum+es;

         PI=kp*es+ki*sum;

         if(PI>0.8)PI=0.8;                //过饱和保护

if(PI<-0.8) PI=-0.8;

        }

     if(flag==1)

       {IOSET0=0x000000c0;}

     else

if(PI>0)

       {

       IOSET0=0x00000040;                    //设置P0.6高电平,P0.7低电平

       IOCLR0=0x00000080;                    //正转

       PWMMR0=pwmdata;

       PWMMR6=pwmdata*PI;                   //设置PWM占空比

       PWMLER=0x40;                         //PWMMR6锁存,更新PWM占空比

       }

else if(PI<0)

       {

       IOCLR0=0x00000040;                     //设置P0.6低电平,P0.7高电平

       IOSET0=0x00000080;                     //反转

       PWMMR0=pwmdata;

       PWMMR6=pwmdata*(-PI);                 //设置PWM占空比

       PWMLER=0x40;                          //PWMMR6锁存,更新PWM占空比

       }      

  }

  //return(0);

}

参考文献

[1] 杨旭强、吴红星、金钊编著,基于ARM的电动机控制技术[M].北京:中国电力出版社,2008.

[2] 周立功主编,ARM嵌入式系统基础教程(第2版)[M].北京:北京航天航空大学出版社,2008.9.

[3] 周润景、袁伟亭、景晓松编著,Proteus在MCS-51&ARM7系统中的应用百例[M].北京:电子工业出版社,2006..10.

[4] 陈伯时主编,电力拖动自动控制系统——运动控制系统[M].北京:机械工业出版社,2003.7.下载本文

显示全文
专题