天大自动化智能课程设计报告.docx
《天大自动化智能课程设计报告.docx》由会员分享,可在线阅读,更多相关《天大自动化智能课程设计报告.docx(30页珍藏版)》请在冰豆网上搜索。
天大自动化智能课程设计报告
智能装置课程设计
题目:
智能电机测速仪
姓名:
晁平复
班级:
自动化4班
学号:
3008203263
同组人:
王平
一、课程设计目的:
a)深入了解PIC16F877单片机的工作原理,熟练掌握汇编语言程序设计方法,熟练使用MPLAB-ICD仿真器及MPLAB-IDE仿真调试软件。
b)通过该课程设计使学生初步掌握以单片机为核心的智能装置设计的简单原则、步骤和方法。
c)熟悉智能装置设计中有关的硬件设计调试,如人机界面等。
d)熟悉智能装置设计中相关软件的设计、编程和调试。
二、课程设计内容:
a)以16F877单片机为核心,结合给出的其他原器件和智能装置实验系统原有的内容设计智能电机测速显示仪硬件电路。
b)利用试验板提供的光电耦合器采集电机速度。
c)将采集的速度值通过液晶显示器显示出来。
d)将转速内容上传至计算机界面。
e)利用SPI总线与D/A转换器,操控电机进行调速,使电机能够达到范围内的任何要求转速。
三、课程设计要求:
a)根据实验指导书的设计内容及所给出的元件,设计智能电机测速显示仪硬件原理图。
b)按照设计好的硬件原理图在实验板上用导线搭建硬件电路。
c)用万用表检查硬件电路连接是否正确,检查无误后上电并编制简单的测试程序分步调试各部分功能。
d)在各部分功能实现后,编制完整的智能电机速度测试系统软件与调速软件,并进行软硬件联调,直到达到设计要求。
e)按照设计内容要求测试仪表误差并做分析,给出仪表精度,完成后由教师进行验收检查。
四、课程设计设备
a)仪器
i.MPLAB-ICD模块与仿真头
ii.智能装置实验系统
iii.安装了MPLAB-IDE开发软件的计算机
iv.数字万用表
v.导线若干
b)元器件
i.PIC16F877芯片(6MHz晶振)
ii.LCD显示屏(双行液晶单色显示,可显示汉字与字符)
iii.测速电机(转速范围约在0~2500转,自带红外线光电开关测速,测速结果以脉冲形式从电机的1口输出,电机转速由dianji1与dianji2两个端口的电位差决定)
iv.RS-232串行总线接口(支持异步传输,波特率自定,11与12两个端口分别为发送和接收数据口)
v.MAX515芯片(12位D/A转换器,输出电压对应0~5V)
vi.可调电位器(用于纯测速程序的电机手动调速,调速电压0~5V)
五、课程设计硬件原理图:
六、课程设计硬件设计思路:
电机测速与调速,首先测速部分需要对电机测速脉冲引入PIC芯片,并进行定时计数,测定在一段时间内电机转了多少圈,以此推算电机的转速。
固需要用到定时器与计数器,其中使用timer0做计数器,timer1做定时器,因此电机的1端引脚需要接RA4。
此外转速计算结束后需要显示到LCD屏以及通过SCI通讯传送至电脑,其中LCD屏控制需要三条线,由于不计划使用SPI总线传输(后面调速会占用)而采用手动时钟完成,所以使用任意三条I/O端口线即可,但SCI需要固定的RC6与RC7,所以RC6需要接RS-232通讯模块的11端口,RC7接12端口,LCD则选用RD0~RD2控制,其中RD0接CS端,RD1接CLK,RD2接SID。
最后,根据原理图要求,电机7端口接dianji1端口,dianji2端口接地,此外dianji1端口还需要接上电位器,以实现与dianji2端口存在电位差且可调,再将所有元件的电源和地接上,至此电机测速部分的接线完成。
电机调速部分的电路与测速部分的差别在于电机的接线,由于之前使用电位器手动调速,现在需要改用MAX515输出的电压来调速,所以拔掉电位器,电机的dianji1端口接MAX515的vout(即7端口)。
MAX515的数据来源是PIC芯片,此处我使用SPI总线传输方式来对MAX515进行数据传送,因此MAX515的两个时钟、数据输入端(SCLK、DIN)需要接SPI总线传输的特殊端口RC3与RC5,其中RC3接SCLK(即2端口),RC5接DIN(即1端口),CS片选端则接任意I/O端口即可,我选择了RC0接CS(即3端口),再将515的芯片电源和地接好,至此调速系统的接线完成。
七、调试步骤以及各步骤调试过程中出现的问题与解决方法:
a)计数与定时调试:
最初计数器计数结果一直为0,我将电机的脉冲输出端1端口接在LED灯上,先确定脉冲输出正常,然后检测控制字是否有错误。
最后确定是控制字写错了。
b)LCD屏显调试:
最初接线完成之后没有显示,先确定了一遍接线没有问题,由于是手写时钟输入,所以不涉及端口使用错误的状况,因此检查了一遍程序编写时是否有端口写错的情况。
核对之后还不行,于是我尝试着查看是否有一些指令正确的写入了LCD屏,尝试方法就是将显示状态开/关的控制字设置成显示光标,并且光标闪烁,如果这句控制字能够成功写入,屏幕上将有一个光标闪烁,则至少时钟书写程序是正确的,不能正常显示应该是数据书写或者是指令书写顺序有误。
但实验证明单纯设置光标也不能正常显示,则手写时钟部分存在问题,经过询问老师最后找到问题症结:
1、片选信号应当先置零,然后置一,写完指令后重新置零才算成功写入,之前一直保持高电平没有电平变化所以写入失败。
2、每写完一条指令后需要加一段短延时,大致在20ms左右,这样才能保证屏幕完成指令接收,并保证下一条指令可以正确写入。
更改程序之后问题解决。
c)RS-232串口通信调试:
最初遇到的问题是电脑接收的信息与发送端信息完全不一致,但如果发送端保持发送的数据是稳定的,接收端接收的数据就也是稳定的,但接收地数据与发送数据差距很大,且没有直接的数学对应关系。
于是考虑应该是发送方式导致的问题,检查发现错误使用了同步传输方式(实验板的RS-232接口只允许异步方式)于是更改为异步,将波特率设置在9600,接收恢复正常。
但为什么同步方式可以成功接收数据,而且接收的数据还是稳定的,到最后也没有搞明白,留着问题以后等知识丰富了再解决吧!
d)测速精度测试与调试:
首先要说明一点,由于课程设计要求有测速与调速两部分,但由于两部分需要的测速精度不尽相同,调速部分为了追求调速的效率,需要在较短的时间内完成调速,所以调速过程中每一步测速都需要时间尽可能短,但时间短的代价就是测速精度大大下降(此部分原理会在误差分析部分进行解释),但如果抛开调速,而单纯测速的话,便可以通过延长测速时间来达到更高的测速精度。
鉴于如下原因,本人将测速与调速分成两个程序书写,调速程序中包含课程设计的全部环节(包括测速),可以作为最终的课设成果上交,但测速时间为1.2s,测速精度较低。
另一个为单独的测速程序,包含除调速环节外其他的程序部分,测速时间为6s,测速精度大幅提升,作为补充。
此处只介绍测速程序的精度测试与调节,调速程序的测速部分相近,不予介绍。
测速精度测试运用到了万用表的频率功能,将万用表的两个表笔分别放置在电机的1端口与地,测试电机测速的脉冲频率,考虑到电机有两个扇叶,并且转速单位为转/分钟,因此万用表的显示频率需要除以2再乘以60,得到的即为转速结果,与屏显的转速结果进行比对。
测速程序使用的是6s测速,虽然为两个扇叶的累计结果,但在设置timer0计数器时使用了内置的1:
2分频器,因此得到的转速数值便为6s的真实转速,将这个转速乘以10便为一分钟的转速,显示在屏幕上。
因此测速程序的转速误差应该在±10转/分钟。
经过测试,满足误差范围要求,测试过程一次成功,没遇到什么困难,测试通过。
e)调速部分调试:
截止到上一阶段,必选内容(测速部分)已全部调试完成,在此基础上完成调速的调试可以避免前一段出现问题干扰调速调试过程。
由于在前面的测速阶段已经完成了用电位器调节电机的转速,所以在使用MAX515调速时主要调试重点就在于D/A转换器的使用和SPI通信上,只要D/A能够正常工作,提供给电机电压,电机一定可以正常运转。
而D/A转换器自身不存在什么问题,其信号输入依靠的是PIC芯片的SPI通信,因此是否能够正常运行主要看SPI通信是否能够成功完成对D/A转换器的信息录入。
调试过程中最初发生的问题是无论SPI通信写入的数值是多少,电机都会维持在800转/分。
由于不是0转/分,所以起初以为D/A已经成功的输出了一个电压,说明程序里第一次给定的数值已经成功的通过SPI通信传送给D/A,并且成功地进行了转换并输出,问题出在第二次第三次的SPI通信,也就是说一旦程序进行了一次循环,就再也无法正常使用SPI通信功能了。
然而在这样的思路下经过了一段时间的更改和调试,问题仍然没有解决,调试工作也一度陷入困境,这里要感谢叶浩然、张瑞小组,叶浩然在调试时也遇到了类似的问题,无论他往D/A转换器里写入什么数值,转速都是800转/分,这个提醒把我从之前的思维定势里拉了出来,我尝试着往D/A里写入00H,发现转速还是800转/分,说明D/A驱动电机时,电机的最低转速就是800转/分,到不了0,因此我的程序SPI通信部分其实是存在问题的。
由于MAX515是一个12位D/A转换器,而SPI每次只能发送8位数据,因此我此前的操作方式是连续往SPI通信寄存器里写入两组8位数据并顺序发送,以满足12位的需求,但这样的发送方式经过实验证明不成功,因此我改为使用SPI通信功能发送高8位数据,然后关闭SPI通信,使用手写时钟继续完成低四位的书写,从而完成12位的传送要求。
程序更改之后D/A正常运转,整个系统顺利运行,调试完成。
八、软件设计流程图:
a)软件设计流程框图(带调速部分的总程序框图):
程序开始
I/O端口、timer0计数器、timer1定时器、SCI通信、SPI通信模块初始化
将初始给定电压通过SPI通信发送
TMR0清零,开始计数
初始化电压变动变量,并将最终要求转速数值存入寄存器
保存TMR0计数结果
开启Timer1定时,定时1.2s
将计数结果进行二进制转十进制,并将结果的十位与个位分别保存
将十位与个位作为转速的千位与百位,十位与个位置零即为转速结果,添加其他汉字说明并将全部内容输出屏幕显示
将转速通过SCI传输至计算机
将测得转速与要求转速比较
给定电压减去电压变动变量
给定电压加上电压变动变量
将新的给定电压通过SPI通信发送输
将电压变动变量减为原来的一半
判定电压变动变量是否为0
程序结束
大于
小于
否
是
等于
b)程序设计思路概述:
i.测速程序:
测速程序为了追求测速精度,因此需要延长测速时间,由于前期通过测试了解到电机转速范围在0~2500转之间,因此选择了6秒作为一个定时周期,这样6秒的转数乘以10便是转速,具体操作起来就是用测速得到的结果转换成10进制数之后,输出时在结尾加一个0即可。
选择6秒的优点是只需要进行8位二进制转十进制,不用16位的转换,程序简单不少。
而6秒的转数在0~250之间,没有超出timer0计数器计数范围。
因此只需要将timer0置零,timer1定时6秒(24*250ms),计数结果进行数制转换后按位输出(最后一位加0)至LCD屏以及通信接口即可。
ii.调速程序:
调速程序需要在精度可以接受的条件下,尽可能的缩短调速时间,而且调速方法的不同直接决定调速时间长短。
我所采用的是闭环调速,根据每次反馈的速度与要求速度的偏差情况改变给定的电压数字量,最终使其满足转速要求。
即可以在不了解电机机械特性曲线以及D/A误差的情况下,实现最终速度的吻合。
D/A转换器的数字量输入范围为000H~FFFH,对应0~5V,由于12位数据的高八位我使用的是SPI通信传输,低四位为手写时钟,不易更改,因此为了程序简便,默认设置低四位数据为0,只通过调节高8位数据来更改转速,这样产生的误差可以接受,但程序能简便许多,这样一来,调速范围就为00H~FFH了。
在这样的条件下,我设计了一种可以在7步之内完成调速的调速方法,具体思路为向D/A传送一个初始的电压给定:
80H(00H~FFH的最中间的值),然后设置一个电压变动变量,初始值为40H,第一次测速结果与要求速度进行比较,若高于要求速度,则用电压给定减去电压变动变量(若低于则相加),得到的结果成为新的电压给定输出给D/A转换器,随后将电压变动变量除以二(循环右移一位),再进行新一轮测速,比较,运算,输出,除二,这样操作7个循环之后(电压变动变量从40H——20H——10H——08H——04H——02H——01H最后变为00H)转速将一定可以调节到要求的转数(忽略测速误差)。
具体原理可以用一个例子说明:
假设系统要求转速为1600转,而要想达到1600转需要PIC芯片给D/A转换器的电压给定为73H,那么此种方法的调速过程则为80H-40H+20H+10H+08H-04H-02H+01H=73H,即7步之后电压给定可以调节到73H,最终达到1600转。
使用这种方法是可以遍历00H~FFH中间所有的数值的,并且最多只需要7步就可达到,在这样的条件下,我选择了1.2s定时测速,加上程序运行以及其他延时之下,大致调速时间能在20s之内完成。
另一方面,使用1.2s定时的误差是±50转/分,大大超过了测速程序的误差,这也是为什么我要将两个程序分开来写的原因。
iii.程序特点说明:
本程序主要特点是没有使用中断功能,所有需要判断的地方都选择使用不同长短的延时程序来完成(定时结束延时,数据发送延时),这样的优点是可以节省大量系统资源,减少程序逻辑错误的几率,简化程序。
但同样也存在着风险,一旦某一个延时环节设置的延时不好或是出现无法用延时规避的情况,整个程序的调试将进入死区,不易找到错误,也不易修改。
但由于此程序比较简单,硬件稳定性较高,实验证明延时完全满足要求。
九、软件程序清单:
LISTP=16F877
#INCLUDE
SPTEMEQU20H
BINTEMEQU21H
LED_TEMEQU22H
GENE1EQU23H
GENE2EQU24H
LEHEQU25H
LEMEQU26H
LELEQU27H
COUNT1EQU28H
COUNT2EQU29H
COUNT3EQU30H
SPEEDEQU31H
VOLTEQU32H
GENE3EQU33H
GENE4EQU34H
GENE5EQU35H
SPEEDTEMEQU36H
ORDSPEEQUD'12';调速要求最终转速(以百转/秒为单位)
ORG0040H
START;主程序
BSFSTATUS,RP0
BCFSTATUS,RP1
MOVLW10H;RA4输入,其他不用。
MOVWFTRISA
MOVLW80H;RC0、RC3、RC5输出。
MOVWFTRISC
MOVLW00H
MOVWFTRISD;RD0、RD1、RD2输出。
MOVLW40H
MOVWFSSPSTAT
MOVLW20H
MOVWFOPTION_REG
MOVLW00H
MOVWFINTCON;Timer0作计数器,初始化
MOVLW04H
MOVWFTXSTA
MOVLW26H
MOVWFSPBRG;RS-232串口通信,异步模式,波特率9600
BCFSTATUS,RP0
BSFRCSTA,SPEN
BSFPORTC,0
MOVLW31H
MOVWFT1CON;Timer1作定时器,定时1.2s,初始化
MOVLW30H
MOVWFSSPCON;SPI总线通信初始化
MOVLW80H
MOVWFVOLT;初始电机转速给定值(16进制数字量)
BCFPORTC,0
MOVLW80H
MOVWFSSPBUF;将给定值传送给D/A转换器
CALLDELAY1
CALLLOWFOUR;传送低四位,默认均为0
CALLDELAY1
MOVLW40H
MOVWFCOUNT3;电压变动值变量
MOVLWORDSPE
MOVWFSPEED
BCFSTATUS,C
RLFSPEED,1
BCFSTATUS,C;将调速要求转速放入speed寄存器
CALLDELAY3
LOOP
MOVLW00H
MOVWFTMR0;开始计数
CALLDELAY2;1.2s定时
MOVFTMR0,0
MOVWFSPTEM
MOVWFSPEEDTEM;计数结果放入sptem和speedtem中分别做2-10进制转换和速度比较
BCFSTATUS,C
RRFSPTEM,1
CALLBINTOBCD;2-10进制转换子程序
MOVLW30H
ADDWFLEH,1;十进制结果百位加三十变为ASCII码(在调速中百位必为0,用不上)
MOVLW0FH
ANDWFBINTEM,0
ADDLW30H
MOVWFLEL;十进制结果个位加三十变为ASCII码
MOVLW0F0H
ANDWFBINTEM,0
ADDLW03H
MOVWFLEM
SWAPFLEM,1;十进制结果十位加三十变为ASCII码
SCITX;RS-232串口通信部分
MOVFLEH,0
MOVWFTXREG;将发送内容放入txreg寄存器等待发送
BSFSTATUS,RP0
BSFTXSTA,TXEN;使能发送功能
BCFSTATUS,RP0
CALLDELAY1;调用小延时使其能在下一步操作前完成上一步发送(所有步骤下同)
MOVFLEM,0
MOVWFTXREG
BSFSTATUS,RP0
BSFTXSTA,TXEN
BCFSTATUS,RP0
CALLDELAY1
MOVFLEL,0
MOVWFTXREG
BSFSTATUS,RP0
BSFTXSTA,TXEN
BCFSTATUS,RP0
CALLDELAY1
MOVLW30H
MOVWFTXREG
BSFSTATUS,RP0
BSFTXSTA,TXEN
BCFSTATUS,RP0
CALLDELAY1
LEDOUT;LCD屏显示部分
MOVLW00H
MOVWFPORTD;准备传输
MOVLW01H
MOVWFLED_TEM;清除显示
CALLLEDORD
MOVLW20H;功能设定
MOVWFLED_TEM
CALLLEDORD
MOVLW02H;地址归位
MOVWFLED_TEM
CALLLEDORD
MOVLW06H;进入点设定
MOVWFLED_TEM
CALLLEDORD
MOVLW0CH;显示状态开,无光标
MOVWFLED_TEM
CALLLEDORD
MOVLW01H;清除显示
MOVWFLED_TEM
CALLLEDORD
MOVLW80H;DDRAM地址复位至80H
MOVWFLED_TEM
CALLLEDORD
MOVLW0CBH
MOVWFLED_TEM
CALLLEDDAT
MOVLW0D9H;速
MOVWFLED_TEM
CALLLEDDAT
MOVLW0B6H
MOVWFLED_TEM
CALLLEDDAT
MOVLW0C8H;度
MOVWFLED_TEM
CALLLEDDAT
MOVLW3AH;:
MOVWFLED_TEM
CALLLEDDAT
MOVLW90H;DDRAM地址置90H
MOVWFLED_TEM
CALLLEDORD
MOVFLEM,0
MOVWFLED_TEM
CALLLEDDAT
MOVFLEL,0;转速千位与百位
MOVWFLED_TEM
CALLLEDDAT
MOVLW30H;0
MOVWFLED_TEM
CALLLEDDAT
MOVLW30H;0
MOVWFLED_TEM
CALLLEDDAT
MOVLW0D7H
MOVWFLED_TEM
CALLLEDDAT
MOVLW0AAH;转
MOVWFLED_TEM
CALLLEDDAT
MOVLW2FH;/
MOVWFLED_TEM
CALLLEDDAT
MOVLW20H;空格
MOVWFLED_TEM
CALLLEDDAT
MOVLW0B7H
MOVWFLED_TEM
CALLLEDDAT
MOVLW0D6H;分
MOVWFLED_TEM
CALLLEDDAT
MOVLW0D6H
MOVWFLED_TEM
CALLLEDDAT
MOVLW0D3H;钟
MOVWFLED_TEM
CALLLEDDAT
ADJEND;电压比较与运算部分
BSFSTATUS,C
MOVFSPEED,0
SUBWFSPEEDTEM,0;用测得转速与给定转速比较
BTFSCSTATUS,C
GOTOMI
MOVFCOUNT3,0;小于给定转速,输送到D/A转换器的给定volt就加上电压变动量count3
ADDWFVOLT,1
GOTOSPIEND
MI;大于给定转速,输送到D/A转换器的给定volt就减去电压变动量count3
MOVFCOUNT3,0
SUBWFVOLT,1
SPIEND;程序结束段循环判定部分
BSFPORTC,0
BCFPORTC,0
MOVFVOLT,0
MOVWFSSPBUF;将新的电压给定值发送给D/A转换器
CALLDELAY1
CALLLOWFOUR;低四位发送
CALLDELAY1
CALLDELAY3
BCFSTATUS,C
RRFCOUNT3,1
BSFSTATUS,C;电压变动量原值除二
MOVLW01H
SUBWFCOUNT3,0
BTFSCSTATUS,C;判定电压变动量是否已为0,为0则程序结束,否则继续循环程序
GOTOLOOP
GOTOPROEND
;******************************************************************************
;子程序名称:
LEDORD
;入口参数:
LED_TEM
;出口参数:
无
;子程序任务:
通过手写时钟,按照LCD屏时序图逻辑,将LED_TEM中的内容以写指令方式写入LCD中。
;******************************************************************************
LEDORD
BSFPORTD,0
BSFPORTD,2
BSFPORTD