大学毕业论文---基于自由摆的平板控制系统设计论文.doc
设计(论文)报告 基于自由摆的平板控制系统(日 期)2摘 要摘 要:本自由摆的平板控制系统采用STC12C5A60S2单片机作为主控系统,L298N作为电机驱动模块,STC12C5A60S2单片机通过L298N驱动模块驱PK545-NAC-C29步进机,使步进机上的平板随着摆杆的摆动而旋转。硬件部分主要包括STC12C5A60S2单片机最小系统,L298N电机驱动电路,N1000060倾角传感器,电源模块等。本设计主要运用STC12C5A60S2单片机控制4相6线步进电机,由单片机产生脉冲信号精确控制步进机的转速和角度,使步进电机上的平板能够随着摆杆摆动而保持水平平衡。关键词:STC单片机;L298N电机驱动芯片;传感器目 录目 录摘 要1目 录I1设计任务与要求11.1设计任务11.2设计要求12方案比较与论证22.1主控器的选择与论证22.2电机的选择与论证22.3驱动模块的选择与论证33系统硬件设计33.1总体电路框图33.2单元电路设计43.3整体电路图74系统软件设计74.1总体软件框图74.2各模块软件设计84.3总程序105系统调试与测试105.1测试仪器105.2测试指标105.3测试结果分析116设计总结11参考文献11附录12附录A:电路图12附录B:电路板图13附录C:元器件清单13附录D:总程序14i正 文设计题目1 设计任务与要求1.1 设计任务1、设计并制作一个自由摆上的平板系统,其结构如图1-1所示。摆杆的一端通过转轴固定在一支架上,另一端固定安装一台电机,平板固在电机转轴上;当摆杆如图1-2所示摆动时,驱动电机可以控制平板转动。图1-1 图1-21.2 设计要求1、控制电机使平板可以随着摆杆的摆动而旋转(35周) ,摆杆摆一个周期,平板旋转一周(360º) ,偏差绝对值不大于 45°。2、在平板上粘贴一张画有一组间距为1cm平行线的打印纸。用手推动摆杆至一个角度(在 30º45º间) ,调整平板角度,在平板中心稳定放置一枚 1 元硬币(人民币) ;启动后放开摆杆让其自由摆动。在摆杆摆动过程中,要求控制平板状态,使硬币在 5 个摆动周期中不从平板上滑落,并尽量少滑离平板的中心位置。3、用手推动摆杆至一个角度(在 45º60º间) ,调整平板角度,在平板中心稳定叠放 8 枚 1 元硬币,见图 1-2;启动后放开摆杆让其自由摆动。在摆杆摆动过程中,要求控制平板状态使硬币在摆杆的 5 个摆动周期中不从平板上滑落,并保持叠放状态。根据平板上非保持叠放状态及滑落的硬币数计算成绩。2 方案比较与论证2.1 主控器的选择与论证方案一:采用STC12C5A60S2方案二:采用STC89C52方案三:采用AT89C52方案论证:方案一,STC12C5A60S2芯片价格便宜,应用范围广,功能强大,高速运转,低功耗,强抗静电,强抗干扰,内部集成双串口、8路10bitADC和两路八位PWM;方案二,STC89C52芯片价格便宜,应用范围广,运转速度慢,抗静电抗干扰弱,内部无ADC;方案三,AT89C52芯片价格便宜,应用范围广,运转速度慢,抗静电抗干扰弱,内部无ADC。鉴于设计要求,故采用方案一。2.2 电机的选择与论证方案一:采用步进电机方案二:采用直流电机方案三:舵机方案论证:方案一,步进电机价格便宜,容易控制,旋转角度于脉冲成正比,每步的旋转角度精确度高,不会将一步的误差积累到下一步,且具有优秀的起停和反转响应;方案二,直流电机价格低,调速范围广,易于平滑调节,过载、起动、制动转矩大,难于控制转轴的角度和转速;方案三,舵机价格偏高,性能易受电压影响,控制旋转的角度精确度不高。鉴于设计要求,故采用方案一。2.3 驱动模块的选择与论证方案一:采用L298N芯片方案二:采用ULN2803芯片方案三:采用三极管方案论证:方案一,L298N芯片价格便宜,电路设计简单,驱动电流大,足以驱动大功率的步进电机;方案二,ULN2803芯片价格便宜,电路设计简单,驱动电流小,不能驱动大功率的步进电机;方案三,三极管价格便宜,驱动电路设计复杂,不稳定,出问题难于查询。本设计采用PK545-NAC-C29步进电机,故采用方案一。3 系统硬件设计3.1 总体电路框图为了使系统能够实现各种复杂的控制功能,本设计采用一种功能强大的、高速低功耗性价比高的单片机STC12C5A60S2完成对其他部分控制。本设计采用N1000060倾角传感器对摆杆的倾斜角度的采集数据,通过STC12C5A60S2单片机内部自带的A/D转换将数据送给单片机,单片机通过数据分析控制L298N驱动电路,使步进机旋转保持平板的水平平衡,用1602液晶显示A/D的数据。总体框图如图3-1所示。电 源单片机驱动模块步进机液 晶 显 示传感器AD模块图3-1 总体框图3.2 单元电路设计1、 STC12C5A60S2单片机最小系统STC12C5A60S2单片机最小系统P11口、P12口、P13、P14口接L298驱动电流的输入口,单片机通过对L298N的控制,使L298发出脉冲控制步进机;P23口、P24口、P25口接1602液晶,控制液晶显示A/D采集N1000060倾角传感器的数据,A/D转换是用STC12C5A60S2内部自带的A/D。单片机最小系统如图3-2、3-3所示。图3-2 最小系统图3-3 串口部分2、L298N电机驱动L298N是一种二相四相步电机的专用驱动器,内含两个H-Bridge的高电压、大电流双桥式驱动器,接收标准;OUT1、OUT2、OUT3、OUT4之间分别接两个步进机;INPUT1、INPUT2、INPUT3、INPUT4接单片机I/O,接收输入控制电位来控制电机旋转。L298N驱动电路如图3-4所示。图3-4 L298N驱动3、供电电源供电电源采用集成稳压器7805,电路图中,稳压器7805输入端的电容为输入端滤波电容,输出端的电容为输出端滤波电容;家用电220V经过变压器接入供电电源模块,能输出直流电压-12V、-5V、5V、12V。供电电源如图3-5所示。图3-5供电电源3.3 整体电路图见附录A4 系统软件设计4.1 总体软件框图 1、总体软件框图如图4-1所示。 初始化读倾角传感器电压A/D转换单片机处理读到的A/D数据控制驱动电机转动平板是否水平否结束是图4-1 总体软件框图4.2 各模块软件设计1、步进电机右转函数void l_turn(uint i)/步进电机右转函数AA;delay_ms(i);AB;delay_ms(i);BB;delay_ms(i);BC;delay_ms(i);CC;delay_ms(i);CD;delay_ms(i);DD;delay_ms(i);DA;delay_ms(i);2、步进电机左转函数void r_turn(uint i)/步进电机左转函数DA;delay_ms(i);DD;delay_ms(i);CD;delay_ms(i);CC;delay_ms(i);BC;delay_ms(i);BB;delay_ms(i);AB;delay_ms(i);AA;delay_ms(i);3、STC12C5A60S2内部AD BYTE get_ad0()/AD读取传感器1的值ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch0|ADC_START;_nop_();_nop_();_nop_(); _nop_(); while(!(ADC_CONTR&ADC_FLAG);return ADC_RES;BYTE get_ad5()/AD读取传感器2的值ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch5|ADC_START;_nop_();_nop_();_nop_(); _nop_(); while(!(ADC_CONTR&ADC_FLAG);return ADC_RES;4.3 总程序 见附录D5 系统调试与测试5.1 测试仪器1、 数字万用表2、 量角器 5.2 测试指标当N100060倾角传感器与水平方向有角度时,N100060倾角传感器会产生一个一压,STC12C5A60S2单片机通过内部自带AD转换采集N100060反馈的电压值。每个电压值对应一个角度,通过量角器测出角度,列出表格。如表格5-1所示。表 5-1 角度-90-60-45-30030456090AD值102.4239.0307.2377.5512648.6716.8784.9921.6倾角传感器0.5V1.167V1.5V1.843V2.5V3.167V3.5V3.833V4.5V5.3 测试结果分析从表格5-1可得:倾角传感器与水平方向平行时,输出电压是2.5V;向左右与水平方向倾斜90度时,其电压的变化量为2V。由此可得(误差允许范围内)倾角传感器与水平方向的角度a与倾角传感器的电压变化量v的数学关系为:v=a(1/45)本设计采用4相5线PK545-NAC-C29步进电机,4相8拍运行方式A-AB-B-BC-C-CD-D-DA-A,对应一个脉冲信号,步距角为=360度/(50*8)=0.9度(俗称半步)。本设计把N100060倾角传感器固定在步进电机上,与水平方向平行,当摆杆有一个角度时,STC12C5A60S2单片机内部自带AD读取N1000060倾角传感器电压值,就能精确控制步进电机的转动角度,使步进电机上的平板保持平衡。如:当STC12C5A60S2单片机内部自带AD读取N1000060倾角传感器电压值为3.5V时,其N1000060倾角传感器电压变化量为v=1V,通过上式计算得N100060倾角传感器与水平方向的角度a为45度,从而就能控制步进电机旋转45度,使步进电机上的平板保持平衡。6 设计总结经过四天三夜的辛勤努力,本设计实现了题目的全部要求。但由于时间紧,任务重,系统还存在许多可以改进的地方,比如电路布局、抗干扰性等方面还有很大的提升空间,经过改进,相信性能还会有进一步的提升。在软件编程方面,成功的通过软件编程消除了步进电机的抖动问题,采用的方法是:通过A/D转换采集倾角传感器的数据,10个数据一组,然后取平均值。本次竞赛极大的锻炼了我们各方面的能力,虽然我们遇到了很多困难和障碍,但总体上成功与挫折交替,困难与希望并存,我们将继续努力争取更大的进步。参考文献1 毛礼锐,沈灌群.中国教育通史M.济南:山东教育出版社,1988.20-22.2 王英杰,高益民.高等教育的国际化J.清华大学教育研究,2000(2):13-16.3 中华人民共和国国务院.计算机软件保护条例J/0L.东方网,2001.12.28附录附录A:电路图附录A-1附录A-2附录B:电路板图附录B-1附录C:元器件清单电阻6个瓷片电容12个电解电容4个键盘6个单片机1个开关2个L298N1个稳压78051个稳压78121个N10000602个步进电机1个MS2321个串口1个电位器1个整流桥1个变压器1个发光二极管4个二极管8个 附录D:总程序#include <reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned chartypedef unsigned char BYTE;typedef unsigned int WORD;sfr ADC_CONTR=0xBC;sfr ADC_RES=0xBD;sfr ADC_RESL=0xBE;sfr ADC_LOW2=0xBE;sfr P1ASF=0x9D;#define ADC_POWER 0x80#defineADC_FLAG 0x10#defineADC_START 0x08#defineADC_SPEEDLL 0x00#defineADC_SPEEDL 0x20#defineADC_SPEEDH 0x40#defineADC_SPEEDHH 0x60sbit en=P25;/使能sbit rs=P23;/数据命令sbit rw=P24;/读写/定义步进电机连接端口sbit A1=P11;/转三周sbit B1=P12;/转四周sbit C1=P13;/转五周sbit D1=P14;/来回摆动/定义要用到按键的管脚sbit k1=P34;sbit k2=P35;sbit k3=P36;sbit k4=P37;/定义全局变量uint su=20;/8最大uint j=0;uint jian_zhi=0;uint temp1=0;uchar shu='0','1','2','3','4','5','6','7','8','9','-',':',' 'uint i=6;uint chong1=0;uint su1=20;/8最大uint su2=20;uint m=0;uint ad=0;uint ad0=0;uint j1=0;uint j2=0;uint ad5=0;BYTE ch0=0; /模拟通道选择BYTE ch5=5;uint er_flag=0;/使用1-2相驱动#define AA A1=1;B1=0;C1=0;D1=0;#define BB A1=0;B1=1;C1=0;D1=0;#define CC A1=0;B1=0;C1=1;D1=0;#define DD A1=0;B1=0;C1=0;D1=1;#define AB A1=1;B1=1;C1=0;D1=0;#define BC A1=0;B1=1;C1=1;D1=0;#define CD A1=0;B1=0;C1=1;D1=1;#define DA A1=1;B1=0;C1=0;D1=1;/函数声明void delay_ms(uint x);void r_turn(uint i);void l_turn(uint i);void delay(WORD n)WORD x;while(n-)x=110;while(x-);void delay_ms(uint x)/延时函数uint y,z;for(y=x;y>0;y-)for(z=130;z>0;z-);void l_turn(uint i)/步进电机右转函数AA;delay_ms(i);AB;delay_ms(i);BB;delay_ms(i);BC;delay_ms(i);CC;delay_ms(i);CD;delay_ms(i);DD;delay_ms(i);DA;delay_ms(i);void r_turn(uint i)/步进电机左转函数DA;delay_ms(i);DD;delay_ms(i);CD;delay_ms(i);CC;delay_ms(i);BC;delay_ms(i);BB;delay_ms(i);AB;delay_ms(i);AA;delay_ms(i);void l_dan()switch(m)case 0:AA;m+;break;case 1:AB;m+;break;case 2:BB;m+;break;case 3:BC;m+;break;case 4:CC;m+;break;case 5:CD;m+;break;case 6:DD;m+;break;case 7:DA;m+;break;case 8:m=0;break;default :break;void r_dan()switch(m)case 0:DA;m+;break;case 1:DD;m+;break;case 2:CD;m+;break;case 3:CC;m+;break;case 4:BC;m+;break;case 5:BB;m+;break;case 6:AB;m+;break;case 7:AA;m+;break;case 8:m=0;break;default :break;void ting_zhi()A1=0;B1=0;C1=0;D1=0;/LCD1602初始化void write_com(uchar com)rs=0;P0=com;delay(1);en=1;delay(1);en=0;void write_data(uchar datae)rs=1;P0=datae;delay(5);en=1;delay(5);en=0;void display_shu(uchar hang,uchar add,uchar num)/在1602显示数据的函数,hang为第几行,add为位置,num为数据uchar shi;shi=num;if(hang=1)write_com(0x80+add);write_data(0x30+shi);if(hang=2)write_com(0x80+0x40+add);write_data(0x30+num);void init_LCD()/初始化en=0;rw=0;write_com(0x38);/显示模式控制write_com(0x0c);/显示开关及光标控制write_com(0x06);/数据指针设置write_com(0x01);/清零write_com(0x80);void InitADC()P1ASF=0x21;/输入通道选择与CH相配合使用,选择P12ADC_RES=0; /转化的数据存储所在,高八位ADC_CONTR=ADC_POWER|ADC_SPEEDLL; /内部AD主要的控制寄存器ADC_CONTR,选择P12;delay(100);BYTE get_ad0()/AD读取传感器1的值ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch0|ADC_START;_nop_();_nop_();_nop_(); _nop_(); while(!(ADC_CONTR&ADC_FLAG);return ADC_RES;BYTE get_ad5()/AD读取传感器2的值ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch5|ADC_START;_nop_();_nop_();_nop_(); _nop_(); while(!(ADC_CONTR&ADC_FLAG);return ADC_RES;void keyscan()if(k1=0)delay(5);if(k1=0)while(!k1);display_shu(1,1,1);su=32;j=150;while(j-)r_turn(su);/8最快su=0;if(k2=0)delay(5);if(k2=0)while(!k2);display_shu(1,1,2);su=32;j=200;while(j-)l_turn(su);/8最快su=0;if(k3=0)delay(5);if(k3=0)while(!k3);display_shu(1,1,3);su=32;j=250;while(j-)l_turn(su);/8最快su=0;if(k4=0)delay(5);if(k4=0)while(!k4);display_shu(1,1,4);er_flag=1;void main()uint shu1=0,shu2=0;init_LCD();InitADC();ting_zhi();su=32;su1=32;su2=32;j1=20;j2=30;delay_ms(1000);while(1)keyscan();ad=get_ad0();ad<<=2;ad+=ADC_RESL;delay_ms(1);ad5=get_ad5();ad5<<=2;ad5+=ADC_RESL;/display_shu(1,1,ad/1000);/display_shu(1,2,ad%1000/100);/display_shu(1,3,ad%100/10);/display_shu(1,4,ad%10);/display_shu(2,1,ad5/1000);/display_shu(2,2,ad5%1000/100);/display_shu(2,3,ad5%100/10);/display_shu(2,4,ad5%10);if(er_flag=1)if(ad5<ad)shu1=ad-ad5;if(shu1>30)j1=18;while(j1-)r_dan();delay_ms(60);shu1=0;delay_ms(60);if(ad5>ad)shu2=ad5-ad;if(shu2>30)j1=18;while(j1-)l_dan();delay_ms(60);shu2=0;delay_ms(100);28