基于VC++串行通信的无刷直流电机监控系统

时间:2020-11-14 14:53:18 自动化毕业论文 我要投稿

基于VC++串行通信的无刷直流电机监控系统

  摘要:本文重点介绍了基于PC机和MSP430单片机串行通信的具体实现过程。硬件部分解决了通信电平不一致的问题,软件部分给出了PC机和单片机的通信程序,解决了通信过程中数据传输的格式问题。实验结果表明,该方案操作性强,能成功运用于电机的监控系统。

  关键词:无刷直流电机 VC++ MSP430 串行通信

  1、引言

  [1]无刷直流电机调速性能好,利用单片机MSP430专门的PWM功能、丰富的I/O口、快速运算等优点,实现对无刷直流电机的逻辑控制,由于作为下位机的人机交互性不强,难以对电机运行时的关键信息有效处理,本文通过编写VC++上位机程序,采用PC机和单片机串行通信的主从式结构,实现了对电机的监控。

  2、电机原理及系统硬件组成

  2.1 无刷直流电机运行原理

  无刷直流电机的电力电子开关代替有刷电机的换向片,减少了机械磨损及因换向产生的一些危险,系统由电动机本体、位置检测器、逆变器和控制器组成[2]。

  电机本体同轴上的位置传感器,根据转子的不同位置,发出逻辑信号,根据实验所得的逻辑表,控制输出回路发出的信号,经MOSFET驱动放大,控制电机电枢电流的导通,以实现“换向”。

  2.2 下位机控制系统硬件构成

  下位机以MSP430系列的F2274单片机为控制核心,通过检测电机转子信号,单片机I/O口发出相应逻辑信号,与控制转速的PWM信号相“与”,经信号隔离,到电机专用驱动芯片IR2130中,继而导通桥式电路,实现MOSFET的导通。

  同时, MSP430单片机的捕获比较模块,捕获三相传感器信号输入的时间,本文试验采用的无刷直流电机为一个机械周期(20个电周期),通过计算得到电机的转速公式为[3]:

  ;

  表示检测到第一次位置信号时的时钟数,表示检测到第二次位置信号时的时钟数,为定时器的时钟主频,*3则表示转过一个电周期所用的时间。通过串行通信,可将转速、电压、电流这些参数传至上位机。

  2.3 串行通信的硬件实现

  本文采用异步通信模式[4],设定好波特率及数据位和停止位的个数;将PC机的RXD脚与下位机的TXD相连,并共地;利用MAX232芯片实现电压转换,即通过串口线连到PC机上,加上5个1的电容把RS232电平转化为标准TTL电平,再用两个电阻分压,以达到MSP430单片机的电压标准。

  3、串行通信软件设计

  3.1 上位机串行通信设计

  [5]本文上位机通信模块采用MFC的编程方式,界面如图1所示。加入MSComm控件,自动生成CMSComm的类,访问其内部函数,可对PC机串行通信进行控制。

  在上位机进行通信之前,在MSComm中,设置通信参数,程序在界面上采用可视化的串口设置方式,提高了软件的通用性和移植性。[论文网]

  setting=m_botelv+",";

  if (m_testbit == "None")

  parity = "n";

  else if (m_testbit == "Odd")

  parity = "o";

  else if (m_testbit == "Even")

  parity = "e";

  else if (m_testbit == "Mark")

  parity = "m";

  else if (m_testbit == "Space")

  parity = "s";

  setting += parity + ",";

  setting += m_sbitbit + ",";

  setting += m_stopbit;

  if (m_comkou == "COM1")

  m_com.SetCommPort(1);

  else if (m_comkou == "COM2")

  m_com.SetCommPort(2);

  m_com.SetSettings(setting);

  m_com.SetInputMode(1); //1:表示以二进制方式检取数据

  m_com.SetRThreshold(1); //为1表示有一个字符引发一个事件

  m_com.SetSThreshold(1); //参数1表示每当串口接收缓冲区中有

  //多于或等于1个字符时将引发一个接收数据的OnComm事件

  m_com.SetInputLen(0); //设置当前接收区数据长度为0

  在查询到CommEvent的值等于2时,表明接收缓存里有了数据。数据是VARIANT型的,首先转化为ColeSafeArray形式,然后再将数组元素分离转化为BYTE型数组,最后再将BYTE里的字符转化为数字。当上位机按下按钮发送数据时,也应通过函数COleVariant()进行强制类型转换,以VARINT的形式传送出去。

  当下位机将电机转速的数据上传后,本软件加入了图形显示和数据存储功能。在绘图子对话框中,首先通过GetParent函数调用父对话框指针,将父对话框中的数值传进子对话框,然后通过定时器,以一定频率绘制网格线并将传进来的数据点在图上显示。再次更新时,则重新绘制新曲线,覆盖原有图形,并将新点和旧点以直线相连,从而实现图2所示的速度曲线。

  在数据传到子对话框时,基于VC++的操作,本文采取二进制格式存储数据。首先定义一个fstream的`类对象,该类支持从本流类所对应的磁盘文件中读入和写入数据的双向操作。当主对话框设置为“采集数据”时,对定义的二进制文件进行“写”操作;当设置“显示数据”时,则不断调用二进制文件里的数据,并传递给图像控件,显示存储的数据。关键代码如下:

  fstream iobin("ob.bin",ios::binary|ios::out |ios::in);//定义类对象,ob为目标数据文件

  …

  if(((CQuxian1Dlg*)GetParent())->showmode==0)//0表示采集1表示显示已有数据

  {

  data=((CQuxian1Dlg*)GetParent())->data;//取得父对话框的速度数据

  iobin.write((char*)(&data),sizeof(data));//写人二进制文件

  }

  else

  iobin.read((char*)(&data),sizeof(data));//显示已有数据

  …

  iobin.close();//关闭二进制文件