基于MEGA16的智能小车

上传人:汽*** 文档编号:465971312 上传时间:2024-01-13 格式:DOC 页数:10 大小:3.17MB
返回 下载 相关 举报
基于MEGA16的智能小车_第1页
第1页 / 共10页
基于MEGA16的智能小车_第2页
第2页 / 共10页
基于MEGA16的智能小车_第3页
第3页 / 共10页
基于MEGA16的智能小车_第4页
第4页 / 共10页
基于MEGA16的智能小车_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《基于MEGA16的智能小车》由会员分享,可在线阅读,更多相关《基于MEGA16的智能小车(10页珍藏版)》请在金锄头文库上搜索。

1、测距及自动变速小车07级物理 小组成员:徐常春 王进光 王栋【摘要】应用M16中的I/O接口、计数器、ADC转换器、外部中断、PWM等功能,在ICCAVR编译环境下,设计制作出可以测距,并且能够根据行驶状态自动调节直流电机输出功率的模型小车。关键词:ATMega16 ICCAVR 测距 调速 【设计目的】:1. 运用ATMega16和其他一些硬件设备,设计出带有距离测量,并可以自动调节速度的小车。2. 在设计和实验中加深对I/O端口、中断、定时(计数)器、ADC转换及PWM波形发生等的学习和了解。3. 通过设计实验进一步学习ICCavr的编译环境,并熟悉AVRStudio4.0平台的使用。4.

2、 在设计的过程中锻炼团队协作能力,培养提高责任感和动手实践能力。 【硬件设备】:Avr单片机实验板,Mega16芯片,LG5641BH,MMa7260,L298N,光电对管,电容电阻及导线若干。ATMega16 是实验教学中常见的AVR单片机,功能强大,本装置主要利用其中24个端口控制外围电路。LG5641BH 是四位共阳七段数码管,我们用它进行距离的显示,显示范围从0.000到9999, 保证了最大的显示精度。L298N 芯片内部集成了两个H桥电路,通过改变使能端口的PWM波形占空比和IN1、IN2端口的点平高低来实现对直流电机的速度调节。实验中我们应用L298N芯片实现了高、中、低三档变速

3、,其占空比分别为100%、75%、50%。MMa7260 芯片是一种低档加速度传感器芯片,可以分别测量三个方向的加速度大小,在零加速度的时候,输出1.65V左右的电压,加速度每增加(减小)一个g,输出电压增加(减小)800mV,基本成线性变化。我们本来想用它,并通过积分的方法实现对位移的测量,但由于精度不高,加速度误差大约在5%左右,导致实验不成功。现在我们改用MMa进行小车状态的判断,并使之做到自动调速。光电对管 的发射极是一个红外线发光二极管,接收级是一个光电三极管,在无遮挡的时候输出高电平,有遮挡的时候输出低电平。通过判断输出的下降沿触发个数计数车轮转过的圈数。【设计方案】:总体来说,该

4、设计要实现两个功能,一是测量功能,二是调速功能。下面对这两个功能分别阐述。1.测量功能的实现测量距离的基本思路是通过计数车轮转过的圈数n,然后乘以车轮的周长C。由于车轮的周长一般在十厘米左右,为了提高测量的精度,需要对车轮进行必要的等分。即在一圈中,系统要计数N次, 然后乘以C/N得到测量结果。这样,测量精度就变成C/N ,提高了N倍。考虑到测量精度和操作上的诸多因素,我们对周长进行了三等分,C/ 3=4.134cm。光电对管安装在被动轮一侧,每一次遮挡将产生一个电平的下降沿,由PB0口读入,产生一次计数。每两次计数引发一次中断,对代表距离的变量自加0.826867(以分米为单位)。当小车停止

5、后,定时器中断被关闭,并将距离值送入显示缓冲区并由数码管显示。一旦小车继续行驶,定时器中断重新打开,距离又开始累加,等到下一次停止时再次显示。我们最初的设计是让数码管即时地显示,但由于显示函数太长、中断太多,显示亮度不可能很高,示数也很不稳定,影响了读数。而且即时显示实用性也不大,所以最终改为让小车停止再后送缓冲区显示。2.调速功能(1)H桥芯片L298N的使用H桥芯片L298N集成了两个H桥电路,共有15个引脚,应用了其中的IN1、IN2、OUT1、OUT2、EnableA、Vcc、Vss和GND八个端口。Vss接6V电压,IN1、IN2分别输入1、0,代表电机正转,OUT1、OUT2给电机

6、供电。使能口EnableA输入一个占空比可调的方波,以调节电机的工作电压。使用T/C1定时器产生占空比可调的PWM方波,占空比取三个值100%、50%、25%,分别对应高速、中速、低速,可以用按键调节档速。(2)MMa7260集成加速度传感器芯片另外,我们还应用Mma集成传感器芯片,设计了一种可以让小车根据行驶的状态而自动变速的功能。使用了Mma7260传感器的Y轴作为工作轴,固定于平行于小车行驶的方向。由于小车行驶的过程中的水平加速度很小,可以忽略。但是当小车上坡或下坡的时候,Y轴向加速度会有较大变化,例如,在30斜面上,Y轴向会附加0.5g的加速度,这么大的加速度是可以被测量的。所以,可以

7、根据Y轴向传感器的输出电压大小来判断上下坡的变化,进而调节电机的转速,使之适合在不同情况下的行驶状态:上坡时高速,下坡时低速,水平时中速。(3)按键利用实验板上的Key5-8四个按键,并时能了INT0外部中断,有按键按下时,唤醒按键扫描程序。Key6-8三个按键分别修改OCR1L寄存器的数值,以调节PWM的占空比,分别对应低、中、高三档速度,为强制调速按钮。Key5按下时,使能或禁止ADC转换,以进行自动变速,为自由模式切换按钮。【程序说明】1.端口说明PORTA06 数码管段选PORTA7 ADC输入PORTC 数码管位选PORTB1 数码管小数点控制PORTB47 按键(上拉)PORTD5

8、 OC1A,PWM输出PORTB0 外部T/C0引脚(下降沿)PORTD2 INT0外部中断(上拉)2.主函数部分主函数主要执行端口和寄存器初始化功能。void main(void) CLI(); /disable all interrupts port_init(); timer_init(); /timer interrupt sources timer1_init(); adc_init(); MCUCR&=0xF0; MCUCR|=0x02; /INT0下降沿 响应中断 GICR&=0x0F; GICR|=0x40; freq=0; shift=0; SEI(); /re-enable

9、 interrupts /all peripherals are now label:while(freq6000); while(1) TIMSK&= 0x7F; to_disbuffer(); display(); if(freq6000时,表示经过60000.5ms=3s仍没有增加距离值,此时会执行显示函数,并关闭Timer2中断服务;此时一旦Timer0中断清零freq,将重新使能Timer2中断,显示结束。void timer_init(void) /T2初始化 TCCR2=0x0A;/8分频,ctc模式 TCNT2=0x00; OCR2=0xF9;/定时周期0.5ms /T0初始化

10、 TCCR0=0x0E; TCNT0=0x00; OCR0=0x01; TIMSK=0x82;/使能T/C0,T/C2比较匹配中断/T/C0计时中断服务程序#pragma interrupt_handler timer0_com_isr:20void timer0_com_isr(void) SEI(); time2_new=TCNT2; TCNT2=0x00; TIFR=0x80; freq_temp=freq; freq=0; freq_temp=freq_temp*250+time2_new; freq_temp=125000/freq_temp; speed=freq_temp*10;

11、 shift+=0.8063421144;/T/C2计时中断服务程序#pragma interrupt_handler timer2_com_isr:4void timer2_com_isr(void)freq+;if(freq%4=0)&adc_enable=1) /每2毫秒ADC转换一次ADCSR|=0x40;adc_data=ADCH;adc_in=adc_data*10-1650.000;if(adc_in400) OCR1AL=0x80; /downelse if(adc_in(-400) OCR1AL=0x01; /upelse OCR1AL=0x40; /flatADCSR&=0

12、xBF;4.送缓冲区函数to_disbuffer和显示函数displayto_disbuffer 函数将shift值送与缓冲区,缓冲区dis_buff5含5个元素,容纳四位有效数字和一个小数点p。如果是大于等于1的数,程序自动将第一个位有效数字付给dis_buff4,然后依次存放第二、第三、第四位有效数字或小数点p;如果是小于1的数值,将0和小数点p分别付给dis_buff4和dis_buff3,然后依次存放小数部分。显示时,display函数依次将缓存区中的数值读出,显示范围从0.000到9999,保证了最大的显示精度。比如,当shift=0.8063421144时,显示“0.806”;而当

13、shift=806.3421144时,则显示“806.3”。void to_disbuffer(void)int i,int_shift;float temp_shift;temp_shift=shift;if(shift=1000)for(i=3;i=0;i-) int_shift=temp_shift;dis_buff4-i=int_shift%10;int_shift/=10;dis_buff0=p;else if(shift=100&shift=0;i-) dis_buff4-i=int_shift%10;int_shift/=10;dis_buff0=dis_buff1;dis_buff1=p;else if(shift=10&shift=0;i-) dis_buff4-i=int_shift%10;int_shift/=10;dis_buff0=dis_buff1;dis_buff1=dis_buff2;dis_buff2=p;else if(shift=1&shift=0;i-) dis_buff3-i=int_shift%10;int_shift/=10;dis

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 论文指导/设计

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号