宜昌老张

基于Proteus和LabVIEW的小车双轮电机系统仿真(视频)

0
阅读(8325)

    这次设计应用了上位机LabVIEW软件和下位机Arduino控制器。为了实现智能小车前进、后退、左转、右转,使小车能够向不同的方向运行,必须对小车的两个电机进行控制,包括对智能小车左右电机转向控制和速度调节。通过控制小车左右电机的转向,可以实现小车上述的四个行为动作。通过LabVIEW前面板控制左右电机的转速,达到对小车行驶速度的调节。LabVIEW前面板如图1所示。

    本文的着重点是利用Proteus软件仿真环境,模拟LabVIEW上位机软件控制小车左右轮直流电机的转速和转向,并详细介绍两个软件在PC机中进行零成本联机仿真的全过程。Proteus仿真的实物模型见图2,这个模型的机械结构由MakeBlock铝合金积木搭建而成,而电控部件选用了DFRobot公司的智能车三件套。

图1 小车控制LabVIEW前面板

图2 直流电机驱动的智能车


一、硬件设计

    图2使用到了 DFRobot公司出品的智能车三件套,它有三层电路板层叠而成,底下的板子是Arduino UNO,中间的板子是L298N大电流双路直流电机驱动板(L298N Motor Shield),最上面的板子是Xbee V5传感器扩展板,用于方便插接各种控制线。

图3 DFRobot公司出品的智能车三件套

    L298N Motor Shield扩展模块是一款基于直流电机驱动芯片L298N的Arduino扩展板。该模块可以驱动两个电机,采用了可堆叠的设计方式,使用时直接插装到Arduino UNO控制板上就可以使用,它采用PWM方式进行直流电机的调速。在实验中,将左右电机的两根电源线分别接在该模块电机端口上,并在外接电源端口接上电池盒的电源线。对直流电机供电的电源应有较大的功率,这里选择了6节1.5V的充电电池进行供电,确保电机具有强大的动力。接线示意图如图4所示。

图4 L298N模块接线

    搭建硬件平台的时候,将L298N Motor Shield扩展模块插装在Arduino控制板上。下面将会讨论到该模块对Arduino控制板的引脚占用情况。表1是L298N Motor Shield扩展模块对Arduino控制板数字引脚占用的详细说明。

表1  L298N模块对控制板引脚资源的占用

    DIRA(M1)和PWMA(E1)分别控制小车左侧电机的转向和转速。同样,DIRB(M2)和PWMB(E2)分别控制小车右侧电机的转向和转速。由于两个电机是对称安装在小车底板横梁上的,如果对它们采用相同的接线方法,那么两个电机为了保持在小车行驶时转向一致,必须让两个电机的转向相反。在本文采用的是这种方法,在表2中给出了小车的动作与电机转向的关系。当然,如果是将它们的接线采用相反方式,就可以让两个电机按相同的转向运行。

表2 小车动作与电机的转向

   该驱动板用来驱动两个电机,分别控制电机1的使能端口E1和转向端口M1,电机2的使能端口E2和转向端口M2。Arduino控制器向这4个端口发送信息,就可以控制两个电机的启停,转向和速度,从而实现实验的要求。


二、下位机软件设计

   下面介绍两个直流电机驱动的Arduino程序编写。Arduino控制板主要任务是接收上位机发送的指令,然后对L298N Motor Shield扩展模块的四个控制端口进行控制,从而控制两个电机的运转。可以根据电机M1和M2的功能表来确定Arduino程序如何正确可靠地实现对电机的控制。功能表如下:

表3  E1和M1的功能表

   参照功能表,不难得出Arduino在接收到上位机LabVIEW的控制指令后应该如何改写电机M1和M2的转向端和使能端的电位,以达到正确的控制效果。当然,下位机和上位机只有协调一致才可以获得理想的控制效果。在这里,先给出下位机Arduino的程序。

   Arduino程序有两个主要的任务:首先,接收上位机LabVIEW发送的4字符的控制命令。然后,根据字符串命令,向电机驱动板的E1、M1、E2和M2发指令,刷新电位,控制两台电机的运行。字符串命令中,前2个字符val[0]、val[1]控制电机M1,后2个val[2]、val[3]控制电机M2。下面是Arduino的详细程序和解释说明。图5是Arduino的程序流程图,展示了整个下位机的控制思想。

图5 两个电机控制的程序流程图

Arduino程序:


int E1 =5;                      //连接电机1的使能端口到数字接口5
int M1 =4;                     //连接电机1的转向端口到数字接口4
int E2 = 6;                     //连接电机2的使能端口到数字接口6
int M2 =7;                     //连接电机2的转向端口到数字接口7
byte val[4];                    //暂存上位机发送的四个字节的电机控制指令
void setup()
{
   Serial.begin(9600);                 //设置串口波特率为9600 pbs
   pinMode(M1, OUTPUT);            //设置引脚为输出模式
   pinMode(E1, OUTPUT);
   pinMode(M2, OUTPUT);
   pinMode(E2, OUTPUT);
}
void loop()     
{
  delay(10);                         //延时10ms
  if (Serial.available()>0)              //如果读缓冲区有字节
  {
   for(int i=0; i<4; i++)               //读取上位机发送的四个字节的控制指令
   {
val[i] = Serial.read();} 
   }
    if(val[0]==0xAA && val[2]==0xAA) //如果第一、二个字节为0xAA 
     {
       digitalWrite(M1,HIGH);         //电机1反转
       analogWrite(E1,val[1]);         //电机1 PWM调速
       digitalWrite(M2,HIGH);        //电机2反转
       analogWrite(E2,val[3]);        //电机2 PWM调速
     }
    if(val[0]==0xBB && val[2]==0xAA) //如果第一、二字节分别为0xBB和0xAA  
    {
      digitalWrite(M1,LOW);          //电机1正转
      analogWrite(E1,val[1]);          //电机1 PWM调速
      digitalWrite(M2, HIGH);         //电机2反转
      analogWrite(E2, val[3]);         //电机2 PWM调速
    }
     if(val[0]==0xAA && val[2]==0xBB) //如果第一、二字节分别为0xAA和0xBB     {
      digitalWrite(M1, HIGH);         //电机1反转
      analogWrite(E1, val[1]);         //电机1 PWM调速
      digitalWrite(M1, LOW);         //电机2正转
      analogWrite(E2, val[3]);         //电机2 PWM调速
      }
    if(val[0]==0xBB && val[2]==0xBB) //如果第一、二字节为0xBB  
    {
      digitalWrite(M1, LOW);         //电机1正转
      analogWrite(E1, val[1]);         //电机2 PWM调速
      digitalWrite(M2, LOW);         //电机2正转
      analogWrite(E2, val[3]);         //电机2 PWM调速
    }
}



三、上位机软件设计

    这里编写了上位机LabVIEW程序对Arduino进行控制。LabVIEW主要任务是向下位机发送4个字节的字符串命令。字符串命令的格式为:

“AA/BB”+电机1转速+“AA/BB”+电机2转速

   通过格式化写入字符串VI后,得到符合上文格式的字符串命令。通过VISA写入将字符串命令写入缓冲区发送到下位机Arduino。LabVIEW框图程序如图6所示。

    配置好相关的串口参数后,就可以实现上位机LabVIEW对智能小车电机的控制。在实际运行之前,可以先通过Proteus进行仿真,来验证方案是否是可行的。接下来将介绍Proteus联合LabVIEW和Arduino进行仿真。

图6 LabVIEW电机控制程序框图

 

四、系统仿真

Proteus对Arduino单片机进行仿真,可以验证方案的可行性。在仿真之前,需要对软件进行一些必要的设置。下面,详细介绍Arduino单片机Proteus仿真的实现过程。

1、 虚拟串口

   为了实现上位机与下位机的通讯的仿真,需要使用虚拟串口软件,在设备中创建一对虚拟串口,如图7所示,创建了一对虚拟串口COM7和COM8。

图7虚拟串口配对

2、定位Hex文件的生成位置

   Arduino编译之后,会自动删除Hex文件,在Proteus仿真中,需要使用Arduino软件生成的Hex文件。为了找到hex文件,并且加载到Porteus仿真环境中的单片机ATMEGA328P中进行仿真,所以需要预先新建一个文件夹用于存放Arduino编译后生成的Hex文件。

    首先要在D盘新建一个命名为“Arduino_Hex”文件夹,用于放置Hex文件。然后,击Arduino IDE菜单栏的File->preferences,打开对话框,如图8所示。把“Show verbose output during”的两项参数打勾。双击“preferences.txt”打开文件。点击Arduino界面preferences对话框下方的OK按钮,然后关闭Arduino IDE编程界面。最后,在刚才打开的preferences文档的最后一行加入“build.path=d:\Arduino_Hex”,保存文档即可。

图8  Arduino的Preference参数设置

3、生成HEX文件

  程序编写完后,编译Arduino程序。点击编译按钮,就可以在D:\Arduino_Hex文件夹中生成目标文件Hex(二进制机器码文件)。

4、Proteus设置

在Proteus ISIS软件模块里绘制电气原理图。打开电气原理图,如图9所示。

图9  ATMEGA328P单片机电气原理图

    双击图中的Proteus ISIS电气原理图中ATMEGA328P单片机,在弹出的对话框中点击“Program File”参数项的“文件夹”按钮,选择上面生成的Hex文件。修改菜单中的三个参数项,将“CLKDIV8(Divide clock by 8)”参数项修改为“Unprogrammed”;将“CKSEL Fuses”参数项修改为“(1111)Ext. Crystal 8.0-MHz”;将Advanced Properties的Clock Frequency参数项设为16Mhz。具体设置如图10所示。最后点击编辑对话框中的“确定”按钮即可。

图10 ATMEGA328P单片机的Hex文件加载和参数设置

    此外,还需要对RS232串口进行必要的配置。双击图9中的COMPIM,即可打开元件P1的“编辑元件”菜单,在该菜单中,可以对元件COMPIM(P1)的串口、波特率、字节数和停止位等参数进行设置。按图11所示对其参数进行设置即可。

图11 COMPIM(P1)元件参数设置

    L298N Motor Shield扩展模块可实现了对两个电机的控制,Proteus用于仿真的实物L298N扩展模块的电气原理图如图12所示。配合图9可以看出,用于控制两台电机运转的四根控制线DIRA(M1)、PWMA(E1)、DIRB(M2)和PWMB(E2),分别接到了ATMEGA328P单片机的数字I/O引脚PD4、PD5、PD7和PD6。与实物连线方式是一样。

图12 L298N Motor Shield扩展模块的电气原理图

5、联合仿真

    在LabVIEW中选择串口COM8(可在设备管理器中查看相应的串口号,本次实验创建了一对虚拟串口COM7和COM8,COM7已分配给Proteus软件中的P1元件),运行LabVIEW和Proteus程序,就可以观察到仿真动画。点击LabVIEW中的控件,就可以在Proteus中观察到电机的转向和转速的变化。

基于Proteus和LabVIEW的小车双轮电机控制仿真演示视频:http://www.tudou.com/v/gkybeIO2SU0/&rpid=91074573&resourceId=91074573_04_05_99/v.swf

    通过仿真验证,说明方案是可行的,就可以进行实物的调试。其方法与虚拟仿真的过程大同小异。设置好配对的串口,就可以通过在LabVIEW软件前面板点击各种控件,来控制小车电机的正反转及调整速度。通过实验中对小车行驶路径的观察测量,找到了两组速度,可以使左右电机的速度相匹配,使小车在前进时不会出现左右电机由于运行参数不匹配而偏离直线轨迹的情况。


 程序请下载:http://yunpan.cn/QGFQbRaIr3PVG


五、总结

    在这一节中,探究了通过上位机LabVIEW对下位机Arduino的控制,实现智能小车两个电机转向和转速的控制。设置并配对了虚拟串口,尝试了联合LabVIEW,通过Proteus对Arduino单片机的进行仿真。该方法对后续的实验也有着重要的指导意义。