武汉工程大学毕业设计(论文)说明书
tt1=tt0; end
handles.g.TimerPeriod=tt0; guidata(hObject,handles);
handles.g.TimerFcn={@myTimerCallback,handles};%指定定时事件的回调函数为myTimerCallback
guidata(hObject, handles);
%---------定义字节数据事件----------- handles.g.BytesAvailableFcnMode='byte';
handles.g.BytesAvailableFcnCount=5; %输入缓冲区存在5个字节触发回调函数
handles.g.BytesAvailableFcn={@EveBytesAvailableCall back,handles}; %字节事件回调函数的指定
guidata(hObject, handles);
%===================打开串口=================== %----------检验打开串口操作是否成功-------- try
fopen(handles.g); catch %进行出错处理
set(handles.open_close_serial,'Value',0);
errordlg([Cannot Open Serial Port : ',handles.g.Name, char(10),' Please choose another Port!'],'Serial Port Open Error');
end
② 编myTimerCallback( hObject,event,handles)EveBytesAvailable Callback (hObject,event,handles)回调函数,对所发生的串口通信事件进行处理。
33
武汉工程大学毕业设计(论文)说明书
myTimerCallback回调函数可完成的主要任务是:
定时向下位机发送15字节数据包。
EveBytesAvailableCallback回调函数可完成的主要任务是:
每当接受缓冲区数据字节数5时,读取缓冲
区中的5字节实时数据;握手信号为0XFF时,分离出转速数据,用以保存和显示; 握手信号不为0XFF时,则向单片机重发15字节数据包。
3.5.3单片机实现串行通信的程序设计 1. 单片机串行通信的原理
在中断和查询两种通信机制中本系统采用中断的方式接受和发送数据。 2. 单片机串行通信的程序软件实现
单片机串行通信的软件流程图如图4-4所示,单片机通信软件完全遵行前面制订的串行通信协议,它由两大串口初始化函数和串口中断服务子函数部分组成。
串口初始化完成串口通信波特率设定和开启串口中断,本系统使用定时器T1作波特率发生器,T1工作在方式2,定时器溢出频率为57600,打开定时器T1即可进行串口通信。具体程序如下所示:
void UART_initiate(void) { 式2
TL1=0xff;//串口波特率设为57600bps
TMOD=0x21;//T1做串口波特率发生器,工作方式1;计数器T0,工作方式方
TH1=0xff;
PCON=0x80; EA=1;//开启总中断 ET1=0;//开启T1中断
TR1=1;//开启T1即串口波特率发生器
SCON=0x50;//URAR为mode1,初始设为允许接收方式
34
武汉工程大学毕业设计(论文)说明书
ES=1;//开启串口中断 }
开始 串口初始化 等待串口接收中断 接收上位机发送的15字节数据包 检测握手信号 通信 错误 通信 正确 握手信号 =255并 处理接收的数据 握手信号 =0并 丢弃接收到的数据 发送握手信号和实时转速 返回 图4-4 单片机串行通信程序流程图
串口中断服务子函数完成数据的接受、存储和发送。
当单片机检测到上位机有数据发送过来时,单片机串口接受中断标志RI=0,表示单片机可以从接收数据缓冲区读取数据,此时,单片机连续接收15个字节的数据即上位机发送来的一包数据;此时将单片机串口中断改为“允许串口发送”的方式;单片机根据握手信号向串口发送数据缓冲区写入5字节的数据,从而将实时转速信号上传到上位机;数据发完后再将单片机串口通信改为“允许串口接受”方式,从而为下一周期的通信做准备。
本系统所有功能都是在单片机各个中断服务子程序里完成。需要由单片机中
35
武汉工程大学毕业设计(论文)说明书
断系统实现的功能主要有:测量电机转速、串行通信、周期性的PID调节、输出PWM波。
4 试验测试及分析
4.1测试方法
测量电机转速:利用定时器/计数器配合光电编码器的输出脉冲信号可测量电机的转速,具体的测速方法有M法、T法和M/T法3种,本系统采用T法测速,需要由外部中断0接收脉冲信号,需要计数器Couter0对计数时钟计数,因此,测速将用到INT0和Couter0两中断。
串行通信:显然要用到串口接受和发送两中断,此外还要用定时器T1做波特率发生器。
周期性的PID调节:由于PID调节需要定时进行采样和运算,所以也需要定时器,单片机T0、T1两中断已经占用,故选择SST单片机的PCA模块0扩展一个16位定时器,因此将是用SST单片机的PCA模块0中断。
Pwm波输出:选用单片机的PCA模块1的PWM功能产生占空比可变的分辨率为8位的PWM波,这里将用到SST单片机的PCA模块1中断。
综上所述,本系统的下位机将使用单片机的T0、T1、INT0、PCA0、PCA1五个中断资源,由此构成本系统的单片机中断系统。
4.1.1T法测速
工作原理:在编码器两个相邻输出脉冲的间隔时间内,用一个计数器对已知频率为f的高频时钟脉冲进行计数,由此来计算转速,称作T法测速。测速时间源于编码器输出脉冲的周期,故又称周期法。工作过程如下:
计数器记录来自CPU的高频计数脉冲f;
自制的光电编码器每输出一个脉冲,中断电路向CPU发出一次中断请求; CPU 响应INTn中断,从计数器中读出计数值 M,并立即清零,重新计数。 转速计算公式:
36
武汉工程大学毕业设计(论文)说明书
6060f0Mn??,Tt?ZTtZMf0 (4-1) 为了提高本系统测速精度,决定在编码器的每10个相邻输出脉冲的间隔时间内,用计数器Couter0对计数器的内部高频时钟脉冲f进行计数,CPU 连续响应了11次 INT0中断后,才从计数器1中读出计数值M,并立即清零,重新计数。编码器线数为60,f=11.073753MHz/12,故本系统的实际转速计算公式为:
9228127n?M (4-2) T法转速测量程序流程图如4-5所示。
用外部中断0捕捉编码器脉冲的上升沿,当检测到第一个上升沿时计数器开始计数,当检测到第11个上升沿时停止计算,此时,计数器计数的时间为连续的10个脉冲周期,读出计数器的计数值即可由转速计算公式计算转速值。 测速的过程中会遇到16位计数器计数溢出的问题,实际上本系统16位计数器最大计数值65535所对应的计数时间约为65ms,当连续的10个脉冲周期时间大于65ms时计数器即溢出,为此,在实际应用中定义一个记录计 数器溢出次数的变量count,然后将count也加入计数次数运算即可。
此外,检测的转速信号中,会混入干扰信号,因此需要用数字滤波的方法滤除。本系统采用“滑动滤波”的方案:即每当检测到一个新的转速时,都将前面测定的连续的N-1次转速值同本次测得的新实际转速值一起加入速度计算的过程中来,取这N个转速值的平均值作为本次转速测量的最终结果。这样相当于在每个速度采样周期内都对N个速度值取平均,即达到了和算术平均值滤波相同的滤波效果又加快了测速的响应频率,实时性较好。
4.1.2 PI调节
NO
37