单片机实验完整指导书 - 图文

更新时间:2024-07-06 02:19:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第一章 AVR单片机开发工具

1.1 概述

典型单片机应用系统框图

单片机应用系统开发包括硬件(电路)系统开发和软件系统开发,硬件系统的开发一般包括电路原理设计,PCB(印刷电路板)设计制作两个部分,使用Protel等软件实现。由于现在单片机系统的一个未来的发展趋势就是外围电路最简化,最终实现单片系统,某些高档单片机已经集成了很多的外部设备的功能,如AVR单片机集成了ROM、RAM、RC震荡电路、PWM波输出功能、AD转换器功能、模拟比较器功能等,如Atmega64单片机,所以单片机的外围电路变得非常的简单,简单的单片机系统只要一片单片机便足够了,所以对单片机的硬件系统开发,我们在此不在进行详细的讲解。

1.2 单片机软件系统开发流程

开发单片机软件系统,一般来说都要经历以下的过程:

编写代码—〉编译器编译—〉仿真器仿真—〉烧写器烧写/在线下载

对于AVR系列单片机,可以使用汇编编程,也可以使用C语言和BASIC语言开发,我们选择C语言编程开发,Atmel公司和它的合作伙伴提供了一整套开发工具:

C语言编写: ICCAVR (仿真软件: AVR Studio) 下载软件: Progisp

开发流程大致如下(括号中所注为所使用的软件名):

编写指令代码(ICCAVR)编译器编译(ICCAVR)仿真器仿真(AVRStudio)烧写器烧写器件/在线下载(Progisp)反复修改直至符合要求工作不正常上电单片机开始工作 单片机系统开发流程

1.3 编程:C语言编程环境

1.3.1 AVR单片机编译软件ICCAVR简介

(1) ImageCraft 的ICCAVR 介绍

ImageCraft 的ICCAVR 是一种使用符合ANSI 标准的C 语言来开发微控制器MCU 程序的一个工具。它有以下几个主要特点:

ICCAVR 是一个综合了编辑器和工程管理器的集成工作环境IDE,其可在以下系统 WINDOWS9X/NT中应用,源文件全部被组织到工程之中。文件的编辑和工程的构筑也在这个环境中完成,编译错误显示在状态窗口中,并且当你用鼠标单击编译错误时,光标会自动跳转到编辑窗口中引起错误的那一行。

(2) ICCAVR 中的主要文件类型及其扩展名

文件类型是由它们的扩展名决定的。IDE 和编译器可以使用以下几种类型的文件:

.c 扩展名----表示是C 语言源文件

.h 扩展名----表示是C 语言的头文件

.prj 扩展名----工程文件,这个文件保存由IDE 所创建和修改的一个工程的有关信息;

.hex扩展名----INTEL HEX 格式文件,器件目标文件,这个文件可被大多数的编程器所支持,用于下载程序到芯片中去使得单片机上电开始执行。

.cof扩展名----AVRStudio仿真文件格式,在AVRStudio的仿真时使用;

1.3.2 ICCAVR使用方法

打开ICCAVR主界面,在主窗口中选择打开、编辑、查找、视图、工程、RCS、工具、终端、帮助等菜单,进入相应的子菜单:

其中保存、打开、关闭文件等的操作都在打开菜单中。 (1)打开工程或者新建工程。在工程中创建文件:

新建工程

(2)建立源文件:

建立源文件可以用两种方式,一种是自己编写全部代码,另外一种是使用应用程序向导建立初始化代码,而后添加自己的代码,这样可以省去查阅寄存器的麻烦,而且格式比较好。下面介绍第二种方式:点击

(应用程序向导)打开器件初始设置窗口,这里包括CPU设置,I/O端口初始设置,Timer0、Timer1、

Timer2、Timer3设置窗口,UART设置窗口以及同步串行口SPI和模拟比较器设置窗口。

在这里填写11.0592晶振频率 在这里选择M64 在这里修改IO口数据方向和数值

芯片功能初始化设置

(3)向工程中添加文件:

向工程中增添文件

添加完毕

(4)编译工程,生成目标文件:

工程编译设置:

在Project\\Options…中选择器件型号、输出文件类型、保存目录。在显示的主界面中完成程序 编制或者修改,保存所做的工作。

选择器件我们选择ATMega64 库目录 输出文件保存格式选择COF/HEX

ICCAVR软件输出设置

编译:

单击进行仿真。

或者按下图使用菜单执行编译操作。生成的*.hex这种文件可以被PonyProg下载软件识别并通过

少写器或者下载线,在线下载入单片机的程序FLASH ROM中;另外生成的.cof文件可以被AVR Studio打开

[注]:增量编译常常出现奇怪错误,建议每次使用全部重新编译

1.3.3 AVR单片机的C语言编程

AVR单片机的C语法和标准C语言的语法相兼容的。但是单片机的语法中还增加了一些专门针对单片机硬

件的一些关键字,有些还可能针对某些特定种类的单片机有专门的定义,这些定义一般已经在单片机的C编译器中做了相应的定义。像著名的Keil C就集成了几乎是所有的51系列单片机定义,而我们所使用的ICCAVR也是一样集成了AVR单片机的定义。在编译器中选择器件类型实际上就是在做这样的工作,包括定义头文件、库文件、寄存器等等。

下面是简单的ICCAVR C语法的举例:(注释方法和普通的C语言是一样的)

代码及注释 具体解释 #include /* 定义AT90S8515 */ ◎是头文件 void main(void) ◎主函数 {

char c; ◎定义变量

DDRB = 0xFF; /* PortB 输出*/ ◎DDR×表示×IO口的8位方向寄存器,0xFF表示FFH,即8位全

是1时表示8位输出,(反之表示输入)此句可以实现8位IO口PortB全部用于输出

for(;;) /* 死循环*/ ◎单片机特色,无限死循环 {

c = PIND; /* 读Port D */ ◎PIN×是×IO口的8位输入缓冲寄存器,此句可以实现将D口数据

读入存在变量c中

PORTB = c; /* 回写到Port B */ ◎将数据写到B口 } }

访问I/O寄存器:

? 读I/O: temp = PIND;

? 写I/O: PORTC = 0x4F; //转化为十进制数为79 ? I/O 的位设置与清除

?I/O置1,如B口第0位置1,其余不变:

PORTB |= 0x01;

? I/O清0,如D口第3位清零,其余不变:

PORTD &= ~(0x08);或者PORTD &=0xF7; ? I/O取反,如C口第6、7位取反,其余不变:

PORTC =PORTC^0xC0; //(^异或运算符)

计数或者循环:

int count= 5; do{

}while(--count);

延时:

void delay(int time) { }

unsigned int i,j; for(i=0;i

for(j=0;j<10000;j++);

带参数的函数调用

? 使用参数将数据传递到函数中去

char add(char number1, char number2) {

return number1+number2;}

循环

? 死循环

for(; ;){ } 或者 while(1){} ? 循环N次

char counter = N; do{

} while(--counter) ;

1.3.4 使用ICCAVR编程时常遇到的错误解析

1. 在编译器中输入代码时,注意输入法问题,不能使用中文输入法编写字母和符号,例如:

句尾的分号在应为“ ; ”,当使用中文输入法时为 “ ;”,此时编译后程序会报错; 2. 源文件编写完成后需要存盘,注意在填写完保存名称后要加“.c”后缀,否则无法编译; 3. 当需要使用某些特殊函数(如abs( )取绝对值函数)时,需要在源文件开始部分添加函数所在

的头文件(如:#include ),同时确保include文件夹中包含此头文件,如果不包含,要手动加入相应的头文件; 4. 注意变量赋值时不能超出所属类型的范围,比如定义

char a; // a的取值为-128~127;

unsigned char a; //a的取值变为0~255;

由于Atmega64是8位单片机,即CPU一次只能处理8位数据(一个字节)。当需要处理

一个int或者unsigned int型 16位数据时,需要进行两次处理,比如:

PA端口要读取一个16字节数据temp,并且把此值赋给无符号整型 pos; unsigned int temp;

unsigned char MB,LB;

PORTA=(unsigned char) ((temp&0xff00)>>8); //读取temp的高八位数据 MB=PORTA; //temp的高八位数据赋给MB;

PORTA=(unsigned char) ((temp&0x00ff)); //读取temp的第八位数据 LB=PORTA; // temp的高八位数据赋给MB;

pos=MB*256+LB;

5. 注意ICCAVR环境下的C语言编程与Turbo C或者VC++编译环境中的C语言在有些方面

有所不同,例如:

unsigned int temp;

PORTA=(unsigned char) ((temp&0xff00)>>8); //读取temp的高八位数据 unsigned char MB;

MB=PORTA; //temp的高八位数据赋给MB;

PORTA=(unsigned char) ((temp&0x00ff)); //读取temp的第八位数据 unsigned char LB;

LB=PORTA; // temp的高八位数据赋给MB;

pos=MB*256+LB;

编译后系统会报错,原因是在ICCAVR中,要使用变量,必须在函数内首先声明变量类型,而上述语法在VC++6.0环境下可以编译运行。

[注]:更为详细的C程序编写语法和技巧请参照相关书籍 [1] C语言程序设计 谭浩强 清华大学出版社

[2] AVR单片机C语言入门指导 沈文 清华大学出版社

1.4 下载:Progisp下载软件

1.4.1 下载前的准备工作:

USB下载线

安装USB下载线驱动:

使用USB下载线下载程序需要事先将驱动程序安装在电脑中。驱动程序见邮箱中所给资源。

在烧入程序之前,须用下载线将单片机和电脑连接起来。 注意:

计算机的USB口通过编程器提供5V电源到开发板上,因此烧写程序的时候不需要接外接电源(如下图电线所示)。

1.4.2 Progisp使用简介

Progisp作为下载软件的操作非常简单,下图是Progisp的软件界面。

Progisp软件界面图

1) 选择“编程器及接口”和“选择芯片”

编程器及接口选择“USBASP”和“USB”,如下图所示。

2) 调入Flash

点击“调入Flash”,将使用ICCAVR生成的*.hex文件调入程序。如下图所示。

3) 点击“自动”烧写程序

最后,点击“自动”将程序烧入单片机,则下载工作完成。如图所示。

如需了解更多的关于Progisp的知识,可以参考所给progisp167文件夹中的progisp.doc文件或上网查找更多信息。

第二章 直线运动单元控制系统硬件设计

现代的运动控制系统五花八门,但主要由三个部分组成:控制器,功率驱动,执行元件。高级的运动控制卡的系统如下图:

典型运动控制系统示意图

这是一个典型的,也是目前运用的较为广泛的控制方式,它的工作分为三个过程: ? 通过PC编程或者操作面板向运动控制器发出指令; ? ?

运动控制器响应并通过D/A的模拟电压或者产生相应的脉冲信号; 驱动器接受模拟电压或者脉冲信号并向电机提供相应的电压。

通过这三个流程,我们便达到了运动控制的目的,同时这三个部分是构成运动控制系统必须的,也是变化多样的。(虽然它们可以构成多种不同的控制系统,但是我们只要研究它们的共性和特点,分析它们的设计方法,那么,我们将为以后进一步学习运动控制系统打下坚实的基础。)

2.1 系统功能说明

本系统的直线运动单元控制器采用两级计算机系统实现。上位机采用通用计算机,下位机采用单片机控制。上位机软件通过PC机串口的发送端发送通信协议给单片机。单片机接收到相关协议后,通过相应的控制算法得到电机驱动信号(PWM),对直流电机进行调速控制。与此同时,单片机通过232串口的发送端将采集的数据上传给上位机PC,上位计算机在应用软件的支持下,对数据进行处理并实时绘制速度、电压和误差响应曲线,显示在屏幕上。

2.2 系统总体设计

2.2.1 应用系统结构设计

根据直线运动单元的运动和控制特点,控制器需要完成串行数据通信、信号采集、功率驱动和开关控制等任务。该直线运动单元控制系统的结构如下图所示:

直线运动单元控制系统的结构

2.2.2 设备选型

本设计使用Atmel公司的高性能单片机Atmega64作为核心控制器。按照上述设计的系统结构,需要实现数据采集、电机功率驱动和串行通信单元的元器件来构建系统。 1、 传感器

传感器电路用于实现将电机输出的模拟信号转化为数字信号,并反馈给单片机及上位计算机进行处理。为了实现对速度等信号的采样,本例采用了电机控制常用的光电编码器来实现对转速的编码。光电式旋转编码器是一种广泛使用的数字传感器,可以将测到的角位移转换为脉冲形式的数字信号输出。一般光电编码器分为绝对式光电编码器和增量式光电编码器两种。本例采用增量式光电编码器来采样转速信号。

2、 电机功率驱动

为了实现对电机转向的控制功能,本系统采用驱动芯片L298来驱动。L298是支持标准TTL逻辑电平的双H桥驱动芯片,可驱动继电器、电磁铁、直流电机、步进电机等电感负载。最大工作电源电压46V,驱动每路直流电机的最大输出电流为2A,具有低饱和电压和过稳保护。其电机控制的电路原理如下图所示:

L298芯片原理图

L298有单极性、双极性2种工作方式。单极性工作方式指的是在一个PWM周期内电机的电枢只承受单极性的电压;双极性工作方式是指在一个PWM周期内电机电枢两端的电压呈正负交替变化。

单极性方式:

使能控制端EnA接单片机的PX口,电平相反的输入端控制电机的正反转,PWM信号的占空比来控制转速。

当EnA口为高电平时,输入端In1为PWM信号,输入端In2为低电平,电动机正转,且占空比为0%时制动,为100%时达到最高速;输入端In2为PWM信号,输入端In1为低电平,电动机反转,占空比为0%时制动,为100%时达到反向最高速。

当EnA为低电平时,驱动桥路上的4个晶体管全部截止,使正在运行的电动机电枢电流反向,电动机自由停止。

双极性方式:

EnA接PWM信号,In1输入正反控制信号,In2是In1经过反相以后的信号。假如In1为高电平时电机正转,那么低电平时就是反转,PWM信号控制电机的转速。

若In1与In2接反相的PWM信号,则当占空比为50%的时候,电机制动;大于50%时,电机向一个方向转动;小于50%的时候,向另外一个方向转动。且电机的转速基本上和(占空比-50%)成一定比例关系。

在L298中电机“急停”,即电机的“闸动”,需要这样做:EnA保持高电平,In1和In2同为高电平或同为低电平就可实现“急停”。上面的接法是一种简单的方法,不能实现“急停”,若要有此功能必须改动电路或由单片机输出相应的信号。

3、 串行通信

单片机与上位计算机之间以标准的RS-232C接口进行异步串行数据通信。串口由阴阳两种接口组成。最常使用的信号引脚是TD、RD和SG,因此最简单的串口调试只需要包含3条引线就可以了。在RS232(一种串行工业总线标准)标准中,利用RD、TD作为接收、发送信号线,加入地线,约定好通讯的波特率,实现串行信号传输。

串口管脚示意图

由于RS-232C采用负逻辑,即-3V—-15V表示“1”,而+3V—+15V表示“0”,同时PC的串口工作TTL信号是±12V的,而在我们一般使用的电路板上,电源信号和TTL电平是±5V的(在低功耗电路中是±3.3V的)。为了实现电平的转换以实现串口的功能,我们选用相关的芯片来实现。例如MAXIM公司的MAX232芯片,就能够方便地将单片机系统的TTL电平转换为计算机串行通信用的RS-232C电平。

2.3 硬件设计

直流电机驱动器系统硬件电路如下图所示。下面针对各部分分别予以介绍。

通信 模块 电源 模块 2.3.1 电源模块

进行电平转换,给芯片提供5V的工作电压。

单片机 模块 输入输出模块 系统电路原理图

相关功能模块

电机 驱动 模块

使用7.5V以上电源才可以得到5V的稳压输出,采用12V稳压电源;同时使用芯片LM7805

2.3.2 单片机模块

晶振电路

电源模块

复位电路原理图

下载接口

单片机最小系统

单片机模块和电源模块构成了单片机的最小系统,包括:电源、单片机、晶振、复位、下载。

2.3.3 输入输出模块

按钮部分原理图

INT4、INT5:输入开关检测用,上升沿触发。中间接异或门,目的是为了节省中断口。

LED灯原理图

PA0-3分别外接LED灯,LED灯共阳极,单片机端口低电平有效。

2.3.4 电机驱动、编码器模块

这个电路模块是整个控制系统的核心,用来对直流电机的输出量进行采样,以实现闭环控制。该电路采集的信号为电机的转速,转速信号通过与直流电机同轴连接的增量式光电编码盘输出的相差90度相角的两路方波信号获取。

光电编码盘

光电编码盘分为绝对式光电编码盘和增量式光电编码盘。我们在本系统中采用的是增量式光电编码器。该码盘用来检测直流伺服电机角位移,传递反馈信号,构成闭环控制,实现直流伺服电机闭环控制。增量式码盘把角位移增量转换为脉冲信号输出,由计数器对脉冲进行计数,从而确定角位移。增量式码盘结构简单,价格较低,因而受到较为广泛的应用。

光电编码器原理图

其工作原理如上图中所示:两对发射接收的对管成90度夹角安装,这样经过整形后的得到的A,B两相的波形为相位相差90度的脉冲序列。而下图是对于一路信号(A或B)没有整形后的更为一般的情况,理论上是一个随着光线的强弱变化而形成的正弦波,这里可以经过带斯密特的门电路处理后得到较好的方波。

编码器的脉冲序列

增量式编码器是直接利用光电转换原理输出三组方波脉冲A、B和Z相;A、B两组脉冲相位差90o,从而可方便地判断出旋转方向,而Z相为每转一个脉冲,用于基准点定位。

光电编码器接口

线序 信号定义 1 2 3 4 5 6 7 8 9 10 A NC NC NC NC GND NC B +5V Z 说明:NC为悬空,表示什么都不接,Z是0位信号,电机轴每转一周而输出的一个脉冲。 编码器数据采集与辨向电路

编码器数据采集

采样接口电路原理图

增量式编码器输出的是连续的脉冲信号,通过得到一秒钟内的脉冲个数,利用已知的编码器线数(如2MC-H-500-582912为500)可得到电机转速,或者在直接以每秒的脉冲数作为速度,具体以计算方便为准。对此有两种较为常见的做法:测频率和测脉宽法。

我们采用测频率法(或测周期法),该方法是设定一个固定的采样时间T,比如1秒,采样一次得到的脉冲个数N,那么速度为:

V=N/T(pulse/sec)

由电路可以知道,编码器输出的A向脉冲由16位定时/计数器T3采集,得到电机的相对位移,定时采集该位移(相当于对位移微分)可以得到电机的转速。 辨向电路

74LS74是D触发器,注意是上升沿触发。假定电机正转时,A相超前B相90度,那么在A相每个脉冲的上升沿,Q端输出为低,反之,电机反转时,B相超前A相90度,那么在A相每个脉冲的上升沿,Q端输出为高。通过两个与门,形成正、反转脉冲输出,这样就实现了辨向电

路。

脉冲编码器输出波形 开发板编码器辨向部分原理图

1、 电机驱动模块

电机、编码器接口 电机 驱动 模块 电机模块 开发板上的电机、编码器接口 使能开关

电路图中编码器接口

一共有六个管脚,其顺序由电机决定,其中:

? ? ?

M+,M-是电机的输入;

VCC,GND是电机的编码器电源;

A、B是编码器A、B两相的信号输出,这两相相差90°的相位差,其中,A与单片机的定时/计数器3(TC3)管脚相连,以此测出脉冲数,从而达到记录电机转动的角位移的目的。 电机的驱动采用L298集成电动机驱动芯片实现电机的PWM调速,芯片原理前面已经介绍。

直流电机通过PB4和PB5来控制,利用单片机的比较匹配输出功能可实现单极性或双极性的PWM调速,电路图如下面所示。

电机编码器部分原理图

整个电路的工作过程是直流电机上的增量式光电编码器,输出两路正交的脉冲信号,通过D触发器(74LS74)构成的辨向电路可以获得直流电机的转向。编码器输出的A向脉冲由16位定时/计数器T3采集,得到电机的相对位移,定时采集该位移(相当于对位移微分)可以得到电机的转速。由于AVR单片机的定时/计数器为定向增计数,故D触发器的输出端分别连接到外部中断INT0和INT1,使用上升沿触发,则在电机换向时会触发相应的外部中断。在中断服务程序中可以根据电机的方向标志,修改编码器的累计脉冲值,从而获得直流电机相对于初始位置的角位移。

2.3.5 串口通信模块

本系统使用MAXIM公司的MAX232来进行单片机TTL电平和标准RS232电平的转换。单片机和上位计算机之间的串行通信电路如下图所示。

串口通信模块

板间通信 端口 下载 端口 限位开关 输入端口 板间通信 选择开关 复位按钮 直流伺服电机接口 步进电机接口 舵机接口 串口 电源 开关 电源 插座 外接电源插座

控制按钮 信号灯 电路开发板说明

电机模块使能开关

第三章 直线运动单元控制系统软件设计

直流电机驱动器的软件包括单片机程序和在上位机上运行的应用程序。本系统仅对单片机程序设计做一些介绍。

3.1 软件结构设计

直流电机驱动器的单片机控制软件采用模块化程序结构。从结构上看,系统程序主要包括一个主循环体程序、PID控制程序、中断服务程序和其他一些控制程序。在该系统中软件中所使用到的单片机的功能,如下图所示(红笔标明)。

USART TWI SPI FLASH SRAM EEPROM 内部时钟振荡 看门狗 TIMER0~TIMER3 ADC 模拟比较器 外部中断 JTAG I/O口 (PA~PG) ALU PC 指令寄存器 通用寄存器

资源应用示意图

3.1.1 主程序

主程序完成系统初始化、中断判断、数据检测及电机的PID调节等工作。

其工作流程是单片机使用中断方式接收电机的控制指令,在每个伺服周期中更新直流电机的速度/位置值、完成一次速度/位置PID运算,同时根据计算结果修改PWM波占空比以调节直流电机转速或修改电机的转向。最后,单片机将当前控制状态参数返回给上位机。下位机实现直线运动模块闭环控制的框图如下图所示。上位机将运动轴反馈回的信息按照规定的协议打包后等待PC机读取。PC机从上位机接收到反馈信息后,完成图形的绘制和状态参数的显示。

指令(速度)实际速度PID控制功率放大直流伺服电机减速器、丝杠、滑块光电编码器

系统控制框图

初始化接收到新指令?NY更新控制指令NPID调节周期到?Y更新速度/位置反馈(编码器脉冲)速度/位置PID运算改变电机转速/方向反馈当前控制状态

单片机软件流程图

3.1.2 PID调节程序

控制理论的发展经历了古典控制理论、现代控制理论和智能控制理论三个阶段。智能控制的典型实例是模糊全自动洗衣机等。自动控制系统可分为开环控制系统和闭环控制系统。一个控制系统包括控制器﹑传感器﹑变送器﹑执行机构﹑输入输出接口。控制器的输出经过输出接口﹑执

行机构﹐加到被控系统上﹔控制系统的被控量﹐经过传感器﹐变送器﹐通过输入接口送到控制器。不同的控制系统﹐其传感器﹑变送器﹑执行机构是不一样的。比如压力控制系统要采用压力传感器。电加热控制系统的传感器是温度传感器。目前,PID控制及其控制器或智能PID控制器(仪表)已经很多,产品已在工程实际中得到了广泛的应用,有各种各样的PID控制器产品。

比例十积分十微分(PID)控制器:

PID控制的理想阶跃输入输出如下:

0 KP KD e(t) 0 e(t)ty∞ KP K1 e(t)KP e(t)t比例十积分十微分控制输出响应

式中 : KP——比例放大系数;TI——积分时间; TD——微分时间。

连续-时间PID控制系统

PID控制算法分为模拟PID算法和数字式PID算法,其中数字式PID算法可以简单的分为位置式PID和增量式PID两种算法。

位置式PID算法每次输出与整个过去状态有关,计算式中要用到过去误差的累加值,因此,容易产生较大的累积计算误差。而增量式PID只需计算增量,计算误差或精度不足时对控制量的计算影响较小。

在直线运动单元上,我们运用单片机处理数字PID算法,并采用增量式PID算法。 根据公式可以推导出:(推导过程大量教材都有讲述)

uk?uk?1?Aek?Bek?1?Cek?2;

其中:

A=K(1?PTTI?TDTTD);

B??KP(1?2T);

C=KP增量式PID的控制算法流程图如下所示

开始 TDT;

计算AEk?BEk?1?CEk?2 计算Ek 更新Ek-1,Ek-2 计算AEk 计算BEk?1 计算uk 计算AEk+BEk?1 返回

计算CEk?2 增量式PID算法流程图

3.1.3 串行数据传输

单片机与上位计算机之间采用RS232的串行数据传输方式,单片机采用中断方式接受数据,利用Timer0的20ms的溢出中断来更新数据并发送数据到上位机。

从上位机(PC)到单片机,每发送一次数据称为一帧数据,一帧数据规定由10个字节构成。

PC向单片机发送的协议: 序号 字节数 0 1 2、3 1 1 2 字节内容 0xAA (0~1) (0~600) 字节意义 备注 字头(固定) 表示协议帧的开始 电机方向 0表示正向,1表示反向 电机速度 对应为参考的电机20ms内编码器脉冲数 4、5 6 7 8 9

2 1 1 1 1 0x0000~0xFFFF 电机角位移 对应为编码器目标脉冲数 0x00~0xFF 0x00~0xFF 0x00~0xFF 0x55 Kp Ki Kd 比例系数 积分系数 微分系数 字尾(固定) 协议帧结束 3.1.4 整个系统程序流程

定时/计数器3定时/计数器020ms溢出中断主函数串口接收中断初始化编码器脉冲计数更新编码器脉冲N接收一字节数据PID运算开始发送标志位为1?Y接收完一帧?NY置接收完成标志位为1改变PWM脉冲宽度向PC发送控制结果更新向PC发送的数据清零开始发送标志位更新控制指令置开始发送标志位为1串口接收中断结束 单片机总体程序流程

3.2 上位机软件介绍

3.2.1 上位机界面介绍

上位机软件界面

1、串口操作

? 选择通信端口和波特率(端口号为1,波特率为9600) 2、电机控制

? 当前状态显示(电机的电压、转速和运转方向) ? 手动控制电机的加减速和正反转动 3、工作台控制

? 速度(给定预设值)

? 当前速度(电机的实际速度) ? PID参数设置(Kp,Ki,Kd) ? 启动和停止工作台的运动 4、绘图区

? 速度&驱动电压&速度误差响应曲线绘制

3.2.2 上位机接受协议帧格式

单片机向PC发送的协议:

序号 字节数 0 1 2、3 1 1 2 字节内容 0xAA (0~1) 0x0000~0x0227 字节意义 备注 字头(固定) 表示协议帧的开始 电机方向 0表示正向,1表示反向 PWM脉宽 经PID控制后的PWM波脉宽 4、5 6、7 8

2 2 1 (0~600) 电机速度 对应为参考的电机20ms内编码器脉冲数 0x0000~0xFFFF 电机角位移 对应为编码器目标脉冲数 0x55 字尾(固定) 协议帧结束 上位机通过该协议的内容进行相关响应曲线的绘制。

本文来源:https://www.bwwdw.com/article/8o4.html

Top