跷跷板小车cdio报告解读11040

上传人:痛*** 文档编号:193223476 上传时间:2023-03-09 格式:PDF 页数:36 大小:1.56MB
收藏 版权申诉 举报 下载
跷跷板小车cdio报告解读11040_第1页
第1页 / 共36页
跷跷板小车cdio报告解读11040_第2页
第2页 / 共36页
跷跷板小车cdio报告解读11040_第3页
第3页 / 共36页
资源描述:

《跷跷板小车cdio报告解读11040》由会员分享,可在线阅读,更多相关《跷跷板小车cdio报告解读11040(36页珍藏版)》请在装配图网上搜索。

1、 CDIO 二级项目报告书 控制系统设计(2015/2016 学年第一学期)题 目 跷跷板平衡小车 学 院 机 电 工 程 学 院 班 级 组 长 项目组成员 2016 年 1 月 一、控制系统总体方案设计 1.系统总体设计 根据题目的基本要求,设计任务主要完成电动车在规定时间内按规定路径稳定行驶,并能具有保持平衡功能,同时对行程中的有关数据进行处理显示。为完成相应功能,系统可以划分为以下几个基本模块:电动机驱动模块、寻迹线探测模块、平衡状态检测模块、信息显示模块。系统框图如图一所示:系统框图 单片机按一定的控制算法对采集的数据进行处理,得到控制量产生 PWM 波,通过驱动电路实现小车的控制,

2、使跷跷板平衡。二,控制元器件选型 (1)核心控制模块的选择 方案一:采用 ATMEL 公司的 AT89C51。51 单片机价格便宜,应用广泛,控制简单,能够满足本系统的设计要求与精度,其性价比高。方案二:采用凌阳公司的 SPCE061A 单片机作为控制器的方案。该单片机 I/O 资源丰富,并集成了语音功能。芯片内置 JTAG 电路,可在线仿真调试,大大简化了系统开发调试的复杂度。根据本题的要求,以及性价比我们选择第一种方案。(2)电机模块 方案一:采用单片机 PWM 波控制直流减速电机。这种方法的优点在于,能够对电机转速的上升与下降进行平滑调节,保证调节过程本身对跷跷板的影响最低,其价格便宜,

3、应用广泛,性价比高。方案二:用单片机控制步进电机。由于步进电机是采用脉冲驱动,调速反应 慢,不易于控制小车的行驶,价格相对直流电机比较贵。根据本题的要求,以及性价比我们选择第一种方案。(3)平衡检测模块 角度检测模块也是系统的重要组成部分,我们需要利用角度传感器来测量跷跷板水平方向倾角,当倾角在某个范围之内的时候即可认为跷跷板达到平衡状态。目前市场上适合的传感器主要有以下两种。方案一:采用深圳市华夏磁电子技术开发有限公司的 AME-B001 角度传感器,0 360 度测量范围,但是安装非常不方便,而且电压输出信号,采集不便。方案二:采用上海朗尚科贸有限公司的单轴低价倾角传感器 SCA60C,测

4、量范围90 到+90 度,单极 5V 供电,电压输出,工作范围宽。价格便宜,安装方便,采集简单,方便。根据本题的要求,以及性价比我们选择第二种方案。(4)寻迹模块 方案一:通过光电开关来实现,它测量距离较远。但是其体积大、成本高、安装起来比较麻烦。方案二:通过红外对管来实现,它测量距离近,但反应灵敏、准确。相比光电传感器而言,其体积较小,价格低,安装较容易。考虑到性价比和简单易行的策略,我们选择方案二。(5)电源模块 方案一:所有器件采用单一电源(5 节五号电池)。这样供电比较简单,但是由于电动机启动瞬间电流很大,会造成电压不稳、有毛刺等干扰,严重时可能会造成单片机系统掉电,使之不能完成预定行

5、程。方案二:双电源供电。电动机驱动电源采用 5 节五号电池,单片机及其外围电路电源采用 5V 钮扣电池供电,两路电源完全分开,这样做虽然不如单电源方便灵活,但可以将电动机驱动所造成的干扰彻底消除,提高了系统稳定性。我们认为本设计的稳定可靠性更为重要,故拟采用方案二。三、控制系统模型 四、系统调试结果(仿真曲线或其它形式的成果演示的照片等)在多次尝试之下,能够勉强找到平衡点,完成停止动作,但具有一点的偶然性。五、设计总结 经过为期一学期的设计,感触颇深的是解决问题的方法、技巧。在这学期中,我们遇到许许多多问题,对待问题要多方法处理,多角度处理。通过这学期的设计,我们不但增强了实践能力和协作精神,

6、而且懂得了联系实际的重要性,这对我们以后的学习和工作不无裨益。当然,我们的设计还存在着一些缺陷,有待于在将来设计中进一步提高,在此恳请各位老师批评指正。附录 1:电路图 AD 模块 倾角传感器模块 循迹传感器模块 电源供电系统 电动机驱动模块 单片机最小系统 附录 2:程序流程图 附录 3:程序清单#include /包含 51 单片机头文件,内部有各种寄存器定义#include /包含 HL-1 蓝牙智能小车驱动 IO 口定义等函数 /主函数 void main(void)/P1=0X00;/关电机 /本实验学习的按键启动知识 EA=1;/开总中断 ConfigTimer0(10);/配置

7、T0 定时 10ms before=GetADCValue(0);while(1);while(time=300)time=0;after=GetADCValue(0);change=after-before;before=after;if(change=-2&change=2)if(before131)b=8;back();if(before=127&before=131)stop();if(change3)b=change/10+6;back();#ifndef _LED_H_#define _LED_H_ unsigned char val;int b;int flag;int chan

8、ge;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=0 x90;sbit P1_1=0 x91;sbit P1_2=0 x92;sbit P1_3=0 x93;sbit P1_4=0 x94;sbit P1_5=0 x95;sbit P1_6=0 x96;sbit P1_7=0 x97;sbit P2_6=0 xA6;sbit P2_7=0 xA7;sbit P3_0=0 xB0;sbit

9、P3_1=0 xB1;sbit P3_2=0 xB2;sbit P3_3=0 xB3;sbit P3_4=0 xB4;sbit P3_5=0 xB5;sbit P3_6=0 xB6;sbit P3_7=0 xB7;/*蜂鸣器接线定义*/sbit BUZZ=P23;#define 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_pw

10、m 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;/左边电机停转#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(unsign

11、ed char chn);extern void I2CStart();extern void I2CStop();extern unsigned char I2CReadACK();extern unsigned char I2CReadNAK();extern bit I2CWrite(unsigned char dat);unsigned char pwm_val_left =0;/变量定义 unsigned char push_val_left=0;/左电机占空比 N/20 unsigned char pwm_val_right=0;unsigned char push_val_rig

12、ht=0;/右电机占空比 N/20 bit Right_moto_stop=1;bit Left_moto_stop=1;unsigned int time=0;unsigned char T0RH=0;/T0 重载值的高字节 unsigned char T0RL=0;/T0 重载值的低字节 void ConfigTimer0(unsigned int ms)unsigned long tmp;/临时变量 tmp=11059200/12;/定时器计数频率 tmp=(tmp*ms)/1000;/计算所需的计数值 tmp=65536-tmp;/计算定时器重载值 tmp=tmp+32;/补偿中断响应

13、延时造成的误差 T0RH=(unsigned char)(tmp8);/定时器重载值拆分为高低字节 T0RL=(unsigned char)tmp;TMOD=0 x01;/配置 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;xk;x+)for(y=0;y2000;y+);/停止函数 void stop(void)push_val_left=0;/速度调节变量 0-20。0 最小,20 最大

14、push_val_right=0;Left_moto_Stop;Right_moto_Stop ;void goback(void)push_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(vo

15、id)push_val_left=b-3;push_val_right=0;Left_moto_back ;/左电机往前走 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_mo

16、to_Stop;/左电机停止 /右前转 void rightrun(void)push_val_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)/

17、左边检测到黑线 leftback();/调用小车左转 函数 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 通道的转换值 unsigned char GetADCValue(unsign

18、ed char chn)I2CStart();if(!I2CWrite(0 x481)I2CStop();return 0;I2CWrite(0 x40|chn);I2CStart();I2CWrite(0 x481|0 x01);I2CReadACK();val=I2CReadNAK();I2CStop();return val;/*/*PWM调 制 电 机 转 速 */*/*左 电 机 调 速 */*调节 push_val_left 的值改变电机转速,占空比 */void pwm_out_left_moto(void)if(Left_moto_stop)if(pwm_val_left=20

19、)pwm_val_left=0;else Left_moto_pwm=0;/*/*右 电 机 调 速 */void pwm_out_right_moto(void)if(Right_moto_stop)if(pwm_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(

20、);pwm_out_right_moto();/*/#endif#include#include#define I2CDelay()_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;/首先确保

21、 SDA、SCL 都是低电平 I2C_SDA=0;I2CDelay();I2C_SCL=1;/先拉高 SCL I2CDelay();I2C_SDA=1;/再拉高 SDA I2CDelay();/*I2C 总线写操作,dat-待写入字节,返回值-从机应答位的值*/bit I2CWrite(unsigned char dat)bit ack;/用于暂存应答位的值 unsigned char mask;/用于探测字节内某一位值的掩码变量 for(mask=0 x80;mask!=0;mask=1)/从高位到低位依次进行 if(mask&dat)=0)/该位的值输出到 SDA 上 I2C_SDA=0;

22、else I2C_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 总线读操作,并发送非应答信号

23、,返回值-读到的字节*/unsigned char I2CReadNAK()unsigned char mask;unsigned char dat;I2C_SDA=1;/首先确保主机释放 SDA for(mask=0 x80;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();I2C_SCL=0;/再拉低 SCL,以使从机发送出下一位 I2C

24、_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=0 x80;mask!=0;mask=1)/从高位到低位依次进行 I2CDelay();I2C_SCL=1;/拉

25、高 SCL if(I2C_SDA=0)/读取 SDA 的值 dat&=mask;/为 0 时,dat 中对应位清零 else dat|=mask;/为 1 时,dat 中对应位置 1 I2CDelay();I2C_SCL=0;/再拉低 SCL,以使从机发送出下一位 I2C_SDA=0;/8 位数据发送完后,拉低 SDA,发送应答信号 I2CDelay();I2C_SCL=1;/拉高 SCL I2CDelay();I2C_SCL=0;/再拉低 SCL 完成应答位,并保持住总线 return dat;/*-INTRINS.H Intrinsic functions for C51.Copyrigh

26、t(c)1988-2004 Keil Elektronik GmbH and Keil Software,Inc.All rights reserved.-*/#ifndef _INTRINS_H_#define _INTRINS_H_ extern void _nop_ (void);extern bit _testbit_(bit);extern unsigned char _cror_ (unsigned char,unsigned char);extern unsigned int _iror_ (unsigned int,unsigned char);extern unsigned

27、long _lror_ (unsigned long,unsigned char);extern unsigned char _crol_ (unsigned char,unsigned char);extern unsigned int _irol_ (unsigned int,unsigned char);extern unsigned long _lrol_ (unsigned long,unsigned char);extern unsigned char _chkfloat_(float);extern void _push_ (unsigned char _sfr);extern

28、void _pop_ (unsigned char _sfr);#endif 读书的好处 1、行万里路,读万卷书。2、书山有路勤为径,学海无涯苦作舟。3、读书破万卷,下笔如有神。4、我所学到的任何有价值的知识都是由自学中得来的。达尔文 5、少壮不努力,老大徒悲伤。6、黑发不知勤学早,白首方悔读书迟。颜真卿 7、宝剑锋从磨砺出,梅花香自苦寒来。8、读书要三到:心到、眼到、口到 9、玉不琢、不成器,人不学、不知义。10、一日无书,百事荒废。陈寿 11、书是人类进步的阶梯。12、一日不读口生,一日不写手生。13、我扑在书上,就像饥饿的人扑在面包上。高尔基 14、书到用时方恨少、事非经过不知难。陆游 15、读一本好书,就如同和一个高尚的人在交谈歌德 16、读一切好书,就是和许多高尚的人谈话。笛卡儿 17、学习永远不晚。高尔基 18、少而好学,如日出之阳;壮而好学,如日中之光;志而好学,如炳烛之光。刘向 19、学而不思则惘,思而不学则殆。孔子 20、读书给人以快乐、给人以光彩、给人以才干。培根

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!