版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、CDIO二级项目报告书控制系统设计(2015/2016学年第一学期)题 目 跷跷板平衡小车 学 院 机 电 工 程 学 院 班级 组 长 项目组成员 2016年 1 月一、控制系统总体方案设计1.系统总体设计 根据题目的基本要求,设计任务主要完成电动车在规定时间内按规定路径稳定行驶,并能具有保持平衡功能,同时对行程中的有关数据进行处理显示。为完成相应功能,系统可以划分为以下几个基本模块:电动机驱动模块、寻迹线探测模块、平衡状态检测模块、信息显示模块。系统框图如图一所示:系统框图 单片机按一定的控制算法对采集的数据进行处理,得到控制量产生 PWM 波,通过驱动电路实现小车的控制,使跷跷板平衡。二
2、,控制元器件选型(1)核心控制模块的选择方案一:采用 ATMEL 公司的 AT89C51。51 单片机价格便宜,应用广泛,控制简单,能够满足本系统的设计要求与精度,其性价比高。 方案二:采用凌阳公司的 SPCE061A 单片机作为控制器的方案。该单片机 I/O资源丰富,并集成了语音功能。芯片内置 JTAG 电路,可在线仿真调试,大大简化了系统开发调试的复杂度。 根据本题的要求,以及性价比我们选择第一种方案。(2)电机模块 方案一:采用单片机 PWM 波控制直流减速电机。这种方法的优点在于,能够对电机转速的上升与下降进行平滑调节,保证调节过程本身对跷跷板的影响最低,其价格便宜,应用广泛,性价比高
3、。 方案二:用单片机控制步进电机。由于步进电机是采用脉冲驱动,调速反应慢,不易于控制小车的行驶,价格相对直流电机比较贵。 根据本题的要求,以及性价比我们选择第一种方案。(3)平衡检测模块 角度检测模块也是系统的重要组成部分,我们需要利用角度传感器来测量跷跷板水平方向倾角,当倾角在某个范围之内的时候即可认为跷跷板达到平衡状态。目前市场上适合的传感器主要有以下两种。 方案一:采用深圳市华夏磁电子技术开发有限公司的 AME-B001 角度传感器,0360 度测量范围,但是安装非常不方便,而且电压输出信号,采集不便。方案二:采用上海朗尚科贸有限公司的单轴低价倾角传感器 SCA60C,测量范围90 到+
4、90 度,单极 5V 供电,电压输出,工作范围宽。价格便宜,安装方便,采集简单,方便。根据本题的要求,以及性价比我们选择第二种方案。(4)寻迹模块方案一:通过光电开关来实现,它测量距离较远。但是其体积大、成本高、安装起来比较麻烦。方案二:通过红外对管来实现,它测量距离近,但反应灵敏、准确。相比光电传感器而言,其体积较小,价格低,安装较容易。考虑到性价比和简单易行的策略,我们选择方案二。(5)电源模块方案一:所有器件采用单一电源(5 节五号电池)。这样供电比较简单,但是由于电动机启动瞬间电流很大,会造成电压不稳、有毛刺等干扰,严重时可能会造成单片机系统掉电,使之不能完成预定行程。方案二:双电源供
5、电。电动机驱动电源采用 5 节五号电池,单片机及其外围电路电源采用 5V 钮扣电池供电,两路电源完全分开,这样做虽然不如单电源方便灵活,但可以将电动机驱动所造成的干扰彻底消除,提高了系统稳定性。我们认为本设计的稳定可靠性更为重要,故拟采用方案二。三、控制系统模型四、系统调试结果(仿真曲线或其它形式的成果演示的照片等)在多次尝试之下,能够勉强找到平衡点,完成停止动作,但具有一点的偶然性。五、设计总结 经过为期一学期的设计,感触颇深的是解决问题的方法、技巧。在这学期中,我们遇到许许多多问题,对待问题要多方法处理,多角度处理。通过这学期的设计,我们不但增强了实践能力和协作精神,而且懂得了联系实际的重
6、要性,这对我们以后的学习和工作不无裨益。当然,我们的设计还存在着一些缺陷,有待于在将来设计中进一步提高,在此恳请各位老师批评指正。附录1:电路图AD模块倾角传感器模块循迹传感器模块电源供电系统电动机驱动模块单片机最小系统附录2:程序流程图附录3:程序清单#include<reg52.H> /包含51单片机头文件,内部有各种寄存器定义#include<HJ-4WD_PWM.H>/包含HL-1蓝牙智能小车驱动IO口定义等函数 /主函数void main(void) / P1=0X00; /关电机/本实验学习的按键启动知识 EA = 1; /开总中断 ConfigTimer0
7、(10); /配置T0定时10msbefore=GetADCValue(0); while(1) ;while(time=300)time=0;after=GetADCValue(0); change=after-before; before=after;if(change>=-2&&change<=2)if(before<127)b=8;xunji();if(before>131)b=8;back();if(before>=127&&before<=131)stop(); if(change<-2) change=-c
8、hange; b=change/10+6; xunji(); if(change>3) b=change/10+6; back(); #ifndef _LED_H_#define _LED_H_unsigned char val; int b;int flag;int change;int after;int before; /定义小车驱动模块输入IO口 sbit IN1=P12;sbit IN2=P13;sbit IN3=P16;sbit IN4=P17;sbit EN1=P14;sbit EN2=P15;sbit P1_0 = 0x90;sbit P1_1 = 0x91;sbit P
9、1_2 = 0x92;sbit P1_3 = 0x93;sbit P1_4 = 0x94;sbit P1_5 = 0x95;sbit P1_6 = 0x96;sbit P1_7 = 0x97;sbit P2_6 = 0xA6;sbit P2_7 = 0xA7;sbit P3_0 = 0xB0;sbit P3_1 = 0xB1;sbit P3_2 = 0xB2;sbit P3_3 = 0xB3;sbit P3_4 = 0xB4;sbit P3_5 = 0xB5;sbit P3_6 = 0xB6;sbit P3_7 = 0xB7;/*蜂鸣器接线定义*/ sbit BUZZ=P23; #define
10、 Left_1_led P3_3 / 左传感器 #define Right_1_led P3_2 /右传感器 #define Left_2_led P2_6 / 左传感器 #define Right_2_led P2_7#define Left_moto_pwm P1_5 /PWM信号端#define Right_moto_pwm P1_4 /PWM信号端#define Left_moto_go P1_2=0,P1_3=1; /左电机向前走#define Left_moto_back P1_2=1,P1_3=0; /左边电机向后转#define Left_moto_Stop P1_5=0; /
11、左边电机停转 #define Right_moto_go P1_6=1,P1_7=0;/右边电机向前走#define Right_moto_back P1_6=0,P1_7=1;/右边电机向后走#define Right_moto_Stop P1_4=0;/右边电机停转 unsigned char GetADCValue(unsigned char chn); extern void I2CStart();extern void I2CStop();extern unsigned char I2CReadACK();extern unsigned char I2CReadNAK();exter
12、n bit I2CWrite(unsigned char dat);unsigned char pwm_val_left =0;/变量定义unsigned char push_val_left =0;/ 左电机占空比N/20unsigned char pwm_val_right =0;unsigned char push_val_right=0;/ 右电机占空比N/20bit Right_moto_stop=1;bit Left_moto_stop =1;unsigned int time=0; unsigned char T0RH = 0; /T0重载值的高字节unsigned char T
13、0RL = 0; /T0重载值的低字节 void ConfigTimer0(unsigned int ms) unsigned long tmp; /临时变量 tmp = 11059200 / 12; /定时器计数频率 tmp = (tmp * ms) / 1000; /计算所需的计数值 tmp = 65536 - tmp; /计算定时器重载值 tmp = tmp + 32; /补偿中断响应延时造成的误差 T0RH = (unsigned char)(tmp>>8); /定时器重载值拆分为高低字节 T0RL = (unsigned char)tmp; TMOD =0x01; /配置
14、T0为模式1 TH0 = T0RH; /加载T0重载值 TL0 = T0RL; ET0 = 1; /使能T0中断 TR0 = 1; /启动T0 /*/延时函数 void delay(unsigned int k) unsigned int x,y; for(x=0;x<k;x+) for(y=0;y<2000;y+);/停止函数 void stop(void) push_val_left=0; /速度调节变量 0-20。0最小,20最大 push_val_right=0; Left_moto_Stop ; Right_moto_Stop ;void goback(void) pus
15、h_val_left=b-3; /速度调节变量 0-20。0最小,20最大 push_val_right=b-3; Left_moto_back ; /左电机往前走 Right_moto_back ; /右电机往前走/左后转 void leftback(void) push_val_left=0; push_val_right=b-3; Right_moto_back ; /右电机往前走 Left_moto_Stop ; /左电机停止/右后转 void rightback(void) push_val_left=b-3; push_val_right=0; Left_moto_back ; /
16、左电机往前走 Right_moto_Stop ; /右电机往前走/*/后速后退/前速前进 void run(void) push_val_left=b; /速度调节变量 0-20。0最小,20最大 push_val_right=b; Left_moto_go ; /左电机往前走 Right_moto_go ; /右电机往前走/左前转 void leftrun(void) push_val_left=0; push_val_right=b; Right_moto_go ; /右电机往前走 Left_moto_Stop ; /左电机停止/右前转 void rightrun(void) push_v
17、al_left=b; push_val_right=0; Left_moto_go ; /左电机往前走 Right_moto_Stop ; /右电机往前走/后退函数 void back(void) if(Left_2_led=0&&Right_2_led=0) goback(); /调用前进函数 delay(10); if(Right_2_led=1&&Left_2_led=0)/右边检测到黑线 rightback(); /调用小车右转函数 delay(10); if(Left_2_led=1&&Right_2_led=0) /左边检测到黑线 l
18、eftback(); /调用小车左转 函数 delay(10); void xunji(void) if(Left_1_led=0&&Right_1_led=0) run(); /调用前进函数 delay(10); if(Left_1_led=1&&Right_1_led=0) /左边检测到黑线 leftrun(); delay(10); /调用小车左转 函数 if(Right_1_led=1&&Left_1_led=0)/右边检测到黑线 rightrun(); /调用小车右转函数 delay(10); /*/获取ADC通道的转换值unsigne
19、d char GetADCValue(unsigned char chn)I2CStart();if(!I2CWrite(0x48<<1)I2CStop();return 0;I2CWrite(0x40 | chn);I2CStart();I2CWrite(0x48<<1 | 0x01);I2CReadACK();val = I2CReadNAK();I2CStop();return val;/*/* PWM调制电机转速 */*/* 左电机调速 */*调节push_val_left的值改变电机转速,占空比 */void pwm_out_left_moto(void) i
20、f(Left_moto_stop) if(pwm_val_left<=push_val_left) Left_moto_pwm=1; else Left_moto_pwm=0; if(pwm_val_left>=20) pwm_val_left=0; else Left_moto_pwm=0; /*/* 右电机调速 */ void pwm_out_right_moto(void) if(Right_moto_stop) if(pwm_val_right<=push_val_right) Right_moto_pwm=1; else Right_moto_pwm=0; if(p
21、wm_val_right>=20) pwm_val_right=0; else Right_moto_pwm=0; /*/*TIMER0中断服务子函数产生PWM信号*/ void timer0()interrupt 1 using 2 TH0=0XFc; /1Ms定时 TL0=0X18; time+; pwm_val_left+; pwm_val_right+; pwm_out_left_moto(); pwm_out_right_moto(); /*/#endif#include <reg52.h>#include <intrins.h>#define I2CD
22、elay() _nop_();_nop_();_nop_();_nop_();sbit I2C_SCL = P37;sbit I2C_SDA = P36;/* 产生总线起始信号 */void I2CStart() I2C_SDA = 1; /首先确保SDA、SCL都是高电平 I2C_SCL = 1; I2CDelay(); I2C_SDA = 0; /先拉低SDA I2CDelay(); I2C_SCL = 0; /再拉低SCL/* 产生总线停止信号 */void I2CStop() I2C_SCL = 0; /首先确保SDA、SCL都是低电平 I2C_SDA = 0; I2CDelay();
23、 I2C_SCL = 1; /先拉高SCL I2CDelay(); I2C_SDA = 1; /再拉高SDA I2CDelay();/* I2C总线写操作,dat-待写入字节,返回值-从机应答位的值 */bit I2CWrite(unsigned char dat) bit ack; /用于暂存应答位的值 unsigned char mask; /用于探测字节内某一位值的掩码变量 for (mask=0x80; mask!=0; mask>>=1) /从高位到低位依次进行 if (mask&dat) = 0) /该位的值输出到SDA上 I2C_SDA = 0; else I
24、2C_SDA = 1; I2CDelay(); I2C_SCL = 1; /拉高SCL I2CDelay(); I2C_SCL = 0; /再拉低SCL,完成一个位周期 I2C_SDA = 1; /8位数据发送完后,主机释放SDA,以检测从机应答 I2CDelay(); I2C_SCL = 1; /拉高SCL ack = I2C_SDA; /读取此时的SDA值,即为从机的应答值 I2CDelay(); I2C_SCL = 0; /再拉低SCL完成应答位,并保持住总线 return (ack); /应答值取反以符合通常的逻辑: /0=不存在或忙或写入失败,1=存在且空闲或写入成功/* I2C总线
25、读操作,并发送非应答信号,返回值-读到的字节 */unsigned char I2CReadNAK() unsigned char mask; unsigned char dat; I2C_SDA = 1; /首先确保主机释放SDA for (mask=0x80; mask!=0; mask>>=1) /从高位到低位依次进行 I2CDelay(); I2C_SCL = 1; /拉高SCL if(I2C_SDA = 0) /读取SDA的值 dat &= mask; /为0时,dat中对应位清零 else dat |= mask; /为1时,dat中对应位置1 I2CDelay
26、(); I2C_SCL = 0; /再拉低SCL,以使从机发送出下一位 I2C_SDA = 1; /8位数据发送完后,拉高SDA,发送非应答信号 I2CDelay(); I2C_SCL = 1; /拉高SCL I2CDelay(); I2C_SCL = 0; /再拉低SCL完成非应答位,并保持住总线 return dat;/* I2C总线读操作,并发送应答信号,返回值-读到的字节 */unsigned char I2CReadACK() unsigned char mask; unsigned char dat; I2C_SDA = 1; /首先确保主机释放SDA for (mask=0x80; mask!=0; mask>>=1) /从高位到低位依次进行 I2CDelay(); I2C_SCL = 1; /拉高SCL if(I2C_SDA = 0) /读取SDA的值 dat &= mask; /为0时,dat中对应位清零 else dat |= ma
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 临床路径模拟教学在肿瘤放射治疗教学中的实践
- 临床路径虚拟仿真与医疗技术协同
- 2025年江苏省盐城市中考作文猜题附范文分析
- 指导老师评语200字
- 毕业设计(论文)模板
- 开题报告导师评语5
- 略论先秦儒家的德治思想
- 2025年研究生学位论文导师评语
- 会计本科自考毕业论文参考题目
- 浅析红色经典音乐在高校的传承
- 高中语文中职语文《廉颇蔺相如列传》课件-完美版
- 氢农业行业分析
- 办公耗材投标书简洁范本
- 光伏电站继电保护运行规程
- 曲线运动 全国优质课一等奖
- 《观潮》语文教学PPT课件(3篇)
- 煤矿电工学第四章资料课件
- 建筑施工安全检查评分汇总表及评分表2011版自动计算
- 病区药品管理(药学部)1课件
- 24点题目大全二十四点题目大全(答案)
- 社会体育指导员培训ppt
评论
0/150
提交评论