题目:单片机智能遥控小车
班 级:
班内序号:
实验组号:
学生姓名:
学 号:
指导教师:
单片机智能遥控小车
――班
实验摘要
本次我们制作的基于pic单片机的智能遥控小车是一辆能够用焊制的遥控器遥控小车进行全速前进、低速后退以及左右转弯的智能小车。小车使用编解码芯片(pt2262-ir/pt2272-M4)焊制的无线遥控系统控制小车。
整个系统中,微控制器采用了Microchip公司的PIC16F877,软件设计中涉及PORTB用作普通数字I/O脚和PORTC端口的CCP模块的PWM脉宽调制输出功能。本实验用单片机PORTB(1-4)接收来遥控解码芯片解码的数字电位信号,遥控小车的走向,在pic单片机的处理下做出不同的反应,单片机通过PORTC输出pwm信号,控制小车车速,通过RC4-RC7控制小车前进后退。 概括来说,本实验就是用遥控器接收控制信号,用单片机控制直流电机输出相应的电平控制车辆的前行或者后退,用PWM输出端口控制小车的转向,进而实现小车的智能遥控功能。
Abstract
Inthis experiment, we made a vehicle base on infrared detectable technology. Youcan remote control it under you will.. We use pt2262-ir/pt2272-M4 chip.
Thesystem uses the produc
tion of the Microchip cord--PIC16F877 as themicrocontroller. The design includes the drive of PORTA and PORTC as generaldigital ports , the drive of PORTC as PWM(pulse width modulation) function.
Inconclusion, this experiment uses PIC16F877 cord to control volts d.c. andaccomplish controlling’s condition of the vehile, and PWM function to controlits turn. And this is so called safe car.
关键字
单片机——microcontroller 芯片——CMOSchip 遥控——remotecontrol
脉宽调制——pulse width modulation
一.实验论证与比较
1.车体的选择
车体是实现智能功能的载体,是实际工作的底层硬件,它的选择直接关系到实验的成功与否。经过第一周的资料收集以及向同学的请教,我们发现,两个电机分别控制左右轮子的车体便于实现拐弯的效果,而四轮的又优于两轮的车体,一是外形更加美观,二是轮子的增加会增大转弯时的扭力。在我们的审慎讨论之后,决定选择四轮越野型车体(如下图所示),它由两个电机提供动力,采用铝合金作为车架,车体轻便坚固;它有四个越野型轮胎,在碎石路、沙地,草地或斜坡路面等,都能畅行无阻。
驱动电路是电机和微控制器联系的纽带,负责对底层硬件的直接控制。如何恰当选取驱动电路也是我们第一周工作的重心。为此我们查阅了大量资料,最终发现用L298N驱动芯片效果比较好。应用集成芯片免去了自搭H桥的工作,并且与单片机
通信方便,L298N的驱动能力又很强,用它驱动两个直流电机也避免了驱动力不足的潜在问题。
L298N为15个管角的单块集成电路,高电压,高电流,四通道驱动,设计用L298N来接收DTL或者TTL逻辑电平,驱动感性负载(比如继电器,直流和步进马达)和开关
电源晶体管。内部包含4通道逻辑驱动电路,其额定工作电流为 1 A,最大可达 1.5 A,Vss 电压最小 4.5 V,最大可达 36 V;Vs 电压最大值也是 36 V。L298N可直接对电机进行控制,无须隔离电路,可以驱动双电机。根据L298N芯片的特点以及SPCE061A自身的特点,把IOA4~IOA7作为输出口,分别与L298N的IN1~IN4相接,其VS、VSS分别接+12 V、+5 V电源,其输出口OUT1~OUT2接转向电机,OUT3~OUT4接驱动电机
L298N的实物图
3.供电电路的选择
单片机需要5伏稳定工作电压,L298N需要12伏工作电压和5伏的逻辑电压,各传感器需要5伏的工作电压,综合起来考虑,我们起初决定采用6节南孚电池,提供9V总电压至L298N,然后经L7805稳压芯片输出5伏稳压,送至各个需要5伏电压的地方。最后觉得电池用久后导致电压下降,于是决定用学校提供的电源头,事实证明这个选择是正确的。
3.遥控电路的选择
方案一:采用红外发射、接收头,以及编码芯片PT2262、解码芯片PT2272组成红外的遥控模块,但是此红外遥控模块发射和接收之间的距离短,而且不能在有障碍物的情况下实现遥控,遥控性能差。
方案二:采用RF无线发射模块F05V、无线接收模块J04V,以及编码芯片PT2262、解码芯片PT2272组成的无线遥控模块,此遥控模块在开阔地参考距离大于150米,而且能够在有障碍物的情况下实现遥控,能够达到此无线遥控小车的性能要求。
综上所述,选用方案二。
二.系统总体设计
⒈系统模块总体框图如下:
2.设计预期功能
设计一个双直流电机的智能小车。采用pic16f877单片机为控制核心,在最小系统的基础上,通过对遥控控制按键的检测,控制步进电机的转动,使智能小车可以在遥控信号的控制下,实现合理的行走。
(1)智能小车可实现正、反转控制;
(2)智能小车行走速度、位置可控制;
(3)智能小车可实现无线遥控的功能;
三.系统硬件设计
1、电源电路如下图所示:
采用学校提供的电源头以及L7805芯片。
2.遥控模块
发射使用pt2262-ir发射专用芯片,发射模块只有在按键按下的时候才供电,因此耗电量极低,适合用电池。
接收使用的是pt2272(sc2272为功能相同的替代品)用irm38b(只要是中心频率为38kHZ的就行)接收信号。
在通常使用中,我们一般采用8位地址码和4位数据码,这时编码电路PT2262和解码PT2272的第1~8脚为地址设定脚,有三种状态可供选择:悬空、接正电源、接地三种状态,3的8次方为6561,所以地址编码不重复度为6561组,只有发射端PT2262和接收端PT2272的地址编码完全相同,才能配对使用,遥控模块的生产厂家为了便于生产管理,出厂时遥控模块的PT2262和PT2272的八位地址编码端全部悬空,这样用户可以很方便选择各种编码状态,用户如果想改变地址编码,只要将PT2262和PT2272的1~8脚设置相同即可,例如将发射机的PT2262的第1脚接地第5脚接正电源,其它引脚悬空,那么接收机的PT2272只要也第1脚接地第5脚接正电源,其它引脚悬空就能实现配对接收。当两者地址编码完全一致时,接收机对应的D1~D4端输出约4V互锁高电平控制信号,同时VT端也输出解码有效高电平信号。
无线发射头F05
器件说明
● F05V J05V 工作电压不得超过3.5V,否则将烧坏芯片。
● F05V 无数据输入时休眠电流1μA。但与F05V 接口的电路
不发送数据输入时必须处于低电平状态。
● F05V J05V 最佳的安装是直插在印制板上,也可以将F05V
覆铜面朝下贴在印制板上。天线要朝上。
● F05V 属于微功率发射模块,可以通过FCC 认证,适合短距
离无线数据传输。
● F05V 和J05V 天线匹配是否良好直接影响到收发距离。
无线接收头J04
参数:工作频率: 315MHz 433MHz 灵敏度: 5uV
工作电压: DC+3V(2.6--3.6V) 电路结构: 超再生
工作电流: 0.15--0.3mA 外形尺寸: 10×23×5mm(宽X长X厚)
调制带宽: 10K 工作温度: -40℃--+60℃
输出电平: TTL电平
引脚定义:1--外接天线
2--数据输出端
3--数据反向输出[配F05P+使用]
4--工厂测试端[悬空]
5--地Vss
6--正电源(DC+3V)
发射电路如下:
接收电路如下:
3.单片机最小系统
单片机的晶振为4M有源晶振,复位电路使用按键产生低电位从而使系统复位。
3.电动机模块
电机驱动采用L298驱动芯片,该芯片能驱动两个电机,驱动能力强完全能满足要求。根据L298N的datasheet可知,可通过对该芯片的EnA、EnB、In1、In2、In3、In4端口写高低电平来控制电机的工作、停止和转向,正是电机的这些不同状态实现了小车的直行、倒车及拐弯。
由于在本实验的设计中,只用一路pwm输出控制L298N的两个使能端,所以两个电机的转速相同(转向可能不同),左转向和右转向便按以下的方式实现:
电机驱动电路如下
EN A(B) | IN1(IN3) | IN2(IN4) | 电机运行情况 |
H | H | L | 正转 |
H | L | H | 反转 |
H | 同IN2(IN4) | 同IN1(IN3) | 快速停止 |
L | X | X | 停止 |
控制使能引脚ENA或者ENB就可以实现PWM脉宽速度调整。
说明:
L298N驱动系统
单片机输出PWM使能控制脉冲信号以驱使260电机的转速与扭矩。再通过单片机接收传感信号输出高低变化电平以控制电机的正转,反转及刹停。
4007保护系统
8个4007二极管使电压钳位在正常工作范围下,以防止电压突变而烧损电机及298驱动芯片。
四.系统软件设计
1程序流程图
Y
2.PWM脉宽调制模块
当单片机接受到来自遥控模块和红外避障传感器的信号之后要控制电机进行加速减速等一系列的动作。PWM脉宽调制模块实现了小车转向的车轮调速功能。
模块应用PIC16F877的输入捕捉/输出比较/脉宽调制CCP功能,将CCP1和CCP2设置为PWM模式,用于小车转弯过程中的调速功能。本实验中,应用CCP1调节左轮转速,用CCP2调节右轮转速。
脉宽调制模式的工作原理:当CCP工作于PWM模式时,相应的RC引脚可以输出分辨率高达10位的PWM信号波形。由于CCP引脚与RC端口引脚是复用的,因此必须事先将TRISC清0寄存器的bit1和bit2以设置CCP引脚为输出状态。CCP模块连续产生的PWM信号模型,产生PWM波形得需要确定两个基本参数:一个是周期(高电平和低电平持续时间之和);另一个是脉宽(高电平持续时间)。对于CCP模块,为了得需要一个自由运行的时基定时器和两个可以由用户程序随意改写的参数寄存器(即周期寄存器和脉宽寄存器)。
周期 周期
脉宽
TMR2=周期值时 TMR2=周期值时
TMR2=脉宽值时
图11 pwm示意图
在PIC16系列单片机中,当CCP模块工作于PWM模式时,确定PWM信号周期所用的定时器就是8位宽的时基定时器TMR2,而确定PWM信号脉宽所用到的定时器则是10位宽的时基定时器(由定时器TMR2的8位和其低端扩展的两位共同组成)。
在本实验中,用CCP1模块控制轮子转速,CCPR1L减小时,轮子转速减慢,反之轮子速度加快。合理调节CCPR1L的变化,再加上L298N对电机转向的改变,就可以有效地控制小车实现直行、转弯。
五.硬件连接
⒈全电路图
2、驱动电路的连接
3、时钟和复位电路的连接
六.调试过程
⒈软件调试
在硬件还未最终成型的时候,我们就开始了程序的编写。要检验写出来的程序是不是达到预期的要求,就必须进行程序调试。随着对教材的不断学习,我掌握了多种调试的方法,并把它们全部应用到对智能小车程序的调试之中。现把用到的调试方法列举如下:
① 模拟端口激励调试
模拟portB端口的传感器信号输入,作为中断源
②调出观察窗观察寄存器里的内容
这是做任何题目的实验都需要用到的,且是最常用的调试方法。在程序执行的进程中,通过观察相关寄存器里的内容,可以知道程序执行的结果是否与预期相符,若不符的话,也可看出是哪里的问题,以及应该怎样修改。
③step、animate、run相结合运用
在程序调试中有的地方需要仔细观察,有的地方需要一下子执行过去,灵活使用这些命令将会使调试工作更加得心应手。
step:步进执行。
animate:自动的步进执行,可以看到寄存器内容的实时变化。
run:自动执行,有点像后台运行的方式,看不到寄存器内容的实时变化,stop之后才能观察到变化。
step over:自动执行过某语句块(比如子程序等)。
④我们还将程序做了小的修改,然后用键盘模拟RB端口的电平变化以产生中断,同时单步执行程序,经过不断修改使程序最终完善。
⒉硬件调试
这一部分的工作主要是面包板的搭建、电路的焊接和参数测试、车体的组装、整体线路布局的设计。其中电路的焊接和参数测试占用的时间最多(我们用了将近一周的时间)。首次接触电路的焊接,着手焊之前的电路布局设计和焊之中的细心尤为重要。
在测试的过程中我们遇到了许多问题:
1) 最先遇到的问题就是遥控器。刚开始我们用的时红外收发,结果总是出不来,我们以为是电路连接有问题,不断的进行测试,却毫无进展,停滞了快一个星期后,我们决定改用无线收发头。换为无线收发后遥控器立马有了反应,当时非常高兴,也是一个星期以来第一次尝到了成功的喜悦。
2) 接下来遇到了一个最大的问题,就是中断的产生问题。我们决定用的是int中断,刚开始想把2272的10到13四个输出口直接接到单片机的33(RB0/int)口,结果失败了。然后我们问了张老师,她告诉我们应该是电平不够,于是我们想了一个办法。将四个输出口接到一个四口或门电路,然后再通过一个三极管开关电路,将输出连到单片机的33口,这样的话,一旦有按键按下33口就会产生一个下降沿,形成一个中断。这一块也算是我们的创新。
3) 当电路全连好后,我们发现遥控器不灵敏,我们向孙老师请教,他告诉我们可能是收发芯片的振荡电阻不匹配,于是我们便不断的调整阻值大小,最终达到了不错的效果。
电路搭好并测试成功后,我们便着手电路板的焊接。我们将电路分成三块焊接,电源模块和遥控器的发射模块焊接在一块板上,遥控器的接收部分焊接在一块板上,单片机和电动机模块在一块板上。这样做也是为了减少遥控器信号的干扰和单片机的影响,也便于分块测试。焊接完成后我们便进行了各个模块的测试,测试基本没问题后我们便连接了小车,连上后发现有一边的电动机不转,已经接近成功了却出了这个小问题,我们有点着急。我的搭档让我冷静下来,慢慢测试,最终找到了那个问题,原来是一个焊接点没连上,真是细节决定成败。最终我们成功了!
七.成品展示
遥控器发射端图 遥控器接收端图
单片机和电动机图 小车车体图
八.参考资料:
PIC单片机实用教程——基础篇
李学海
北京航空航天大学出版社
使用说明:想要入门单片机实验,就必须认真看这本教材。它能让你明白单片机的工作原理和基于PIC单片机的汇编语言的编写方法,对本实验的指导意义在于:PIC工作原理、PIC汇编语言的编写、延时子程序、中断、tmr0、输入输出端口等。
PIC单片机实用教程——提高篇
李学海
北京航空航天大学出版社
使用说明:是PIC应用的进阶教材,想要给实验加入高级应用的元素就要研读这本教材。对于本实验的指导意义在于:TMR2的使用、CCP模块的PWM脉宽调制等。
另外还有:
① 网站:百度文库、CSDN网站资料下载分栏以及各种转载网页、
论坛和私人博客上关于智能小车制作的网上资料。内容纷杂,需要耐心整理和筛选,将可取之处吸纳进本实验。
②同学的指点:本次实验的成功,要特别感谢其他班的同学的交流与指导。
九.实验心得体会
这次小学期的单片机实验对我而言可真是大学期间的一次关键性突破点,这次试验可以说很大程度上解决了我一直以来对大学生活及所学知识的迷茫与惶恐,尤其是在整个实验过程中让我充分享受到了学以致用、学科渗透的甜头,摆脱了“基础学科无用论”和“死读书无活用”的束缚,坚定了自己要在大学学习生活中脚踏实地、进取学习的决心,大大提高了自己的自信心。
本次实验我们组的战略安排的比较合理,充分发挥个体所长的分工合作,相辅相承的团队配合以及各种创造性的实践突破。我们没有具体的分工,基本上软、硬件都一起做,我认为这也有个好处,遇到困难我们可以一起解决,这样就比较容易。刚知道题目后我们就决定做遥控小车,因为我们都对小车比较感兴趣,兴趣是最好的老师,我认为只有感兴趣才能全身心的投入。
确定了题目后我们就开始了调研工作,从各个方面收集信息,在这个过程中我们学会了如何从大量的信息中找到有价值的信息,在如今信息爆炸的社会里,这也是一项很重要的能力。做好了准备工作后我们就开始实施计划了。首先就是要买器材,各种芯片和其他东西,买器材的过程也增强了我们的沟通能力。
买来器材后,我们一边搭电路一边看书,我们对于单片机和汇编语言的认识都为零,从一开始我们就知道这是一场恶战,所以我们基本上没缺勤。经过一个星期左右的学习,我们对于单片机和汇编都有了一定理解,电路也搭的差不多了,接下来我们就开始编程和调试电路。调试电路是最艰难的过程,幸而我们上学期有过电路实验,也有了一定的基本功。调试虽是艰难却也让我们收获不小,我们用自己学的数电知识解决了中断无法产生的问题,这也让我坚信理论知识的学习是必须的,而实践则是检验真理的唯一标准。终于功夫不负有心人,我的努力还是带来了不小的收获的。面对各种硬件问题,基本上都是靠自己和队友理论性的分析和创造性的假设得以解决。
不过我们在合理、充分的利用资源上的能力还有些欠缺,由于没有用万用表,而不得不用发光二极管测各个端口有没有输出,导致进度有些慢,不过我们还是及时借来了万用表,为我们的工作带来了极大方便。可惜我们没有去借可调电阻,导致遥控器的振荡电阻匹配的不够好,进而造成遥控信号不灵敏及遥控距离短。俗话说“吃一堑长一智”,这件事也让我们学会了在以后的学习中要合理利用身边的资源。
最后再次真心的感谢各位老师,一直以来对我的鼓励与指导。首先感谢张老师对我们硬件上的指导,让我们在硬件方面能有所创新;还有周老师,每次焊电路板的时候,总能听到她的嘱咐,让我们要小心,不要烫到自己,每每这时总能感到心头一暖;还有我们的孙老师,曾经的数电老师,也给了我们很大的帮助。感谢各位老师的默默奉献与无私付出;感谢这次单片机实验给我带来的无比收获;感谢北邮为我创造的自我成长的良好竞争环境。
十.附录程序
;-------------------------------单片机的寄存器
tmr0 equ 01h ;定时器/计数器地址
pcl equ 02h ;定义程序计数器低字节寄存器地址(体一)
status equ 03h ;状态寄存器地址,用于选体
option_reg equ 81h ;选项寄存器地址,用于分频
intcon equ 0bh ;定义中断控制寄存器地址
portb equ 06h ;端口b的地址,用于接收解码信号控制c口的输出
tri*** equ 86h ;端口b的方向寄存器
portc equ 07h ;端口c地址/c端口输出ccp1与ccp2
trisc equ 87h ;端口c的方向寄存器
tmr2 equ 11h ;tmr2地址
t2con equ 12h ;定义tmr2控制寄存器
pr2 equ 92h ;定义周期寄存器
ccpr1l equ 15h ;脉宽设置位
t1con equ 10h ;tmr1控制寄存器t1con
ccpr2l equ 1bh
ccp2con equ 1dh
porta equ 5h
ccp1con equ 17h
ccp2con equ 1dh
;--------------------------------自定义寄存器
inte equ 4 ;定义外部中断使能位的地址
intf equ 1 ;定义外部中断标志位地址
tmr2on equ 2h ;定义tmr2开启位的地址
tmr2if equ 1h ;定义tmr2中断标志位地址
tmr2ie equ 1h ;定义tmr2中断使能位地址
pr2_b equ 0ff ;确定pr2值,确定pwm信号周期
tmr0b equ 0ffh
w_temp1 equ 7fh ;体0定义一个备份寄存器
w_temp2 equ 0ffh ;体1定义一个备份寄存器
status_temp equ 23h ;为status定义一个备份寄存器
option_temp equ 0a6h
count3 equ 27h
data1 equ 20h
data2 equ 21h
n1 equ d’13’
n2 equ 0ffh
;-------------------------------------复位向量和中断向量
org 000h ;程序存放区域的起始地址
nop ;设置一条icd必须的空操作指令
goto main ;跳转到主程序
org 004h ;定义中断向量
goto serv ;跳转到中断服务的子程序
;----------------------------------------主程序初始化
main
bsf status,5 ;选择体1
movlw 0ffh ;设置端口b的状态位输入
movwf tri*** ;
movlw 00h ;设置端口c的状态位输出
movwf trisc ;
movlw b'00000111' ;设置分频比1:256
movwf option_reg
bcf status,5 ;选择体0
movlw pr2_b ;pr2值为200
movwf pr2
movlw b'00001100' ;脉宽最低两位设置为0
movwf ccp1con ;选择脉宽调制pwm模式
movlw 0ch
movwf ccp2con
movlw b'00000101' ;启用tmr2,预分频比1:4,确定PWM周期所用定时器
movwf t2con
movlw b'10010000' ;开放外部int引脚中断
movwf intcon ;开放全局中断使能位
clrf ccpr1l ;脉宽清零
clrf ccpr2l ;脉宽清零
clrf portc ;输出清零
movf portb,1 ;通过读操作锁定此时rb端口电平作为基准电平
bcf intcon,0 ;清除rb端口电平变化中断标志位
loop0 nop
goto loop0
;-------------------------------------------中断服务子程序
serv
btfsc intcon,1 ;检查是不是外部int引脚中断,跳一步
goto intserv ;是则跳转到int中断处理部分
goto retfie0
;-------------------------------------------int中断处理部分
intserv
call delay10ms ;防抖动延时
movf portb,1 ;检测b端口是否为0
btfsc status,2 ;z的值检测
goto retfie0 ;是抖动,恢复现场
btfsc portb,1 ;检测rb1的状态
goto lowpwmback
btfsc portb,2 ;检测rb2的状态
goto highpwmahead
btfsc portb,3 ;检测rb3的状态
goto left
btfsc portb,4 ;检测rb4的状态
goto right
goto retfie0
;--------------------------------
lowpwmback
movlw b'10011010'
movwf ccpr1l
movlw b'10011010'
movwf ccpr2l
bcf portc,4
bsf portc,5
bcf portc,6
bsf portc,7
goto retfie0
highpwmahead
movlw 0ffh ;100%脉宽
movwf ccpr1l
movlw 0ffh ;100%脉宽
movwf ccpr2l
bsf portc,4
bcf portc,5
bsf portc,6
bcf portc,7
goto retfie0
left
movlw b'10011010'
movwf ccpr1l
movlw b'10011010'
movwf ccpr2l
bcf portc,4
bcf portc,5
bsf portc,6
bcf portc,7
goto retfie0
right
movlw b'10011010'
movwf ccpr1l
movlw b'10011010'
movwf ccpr2l
bsf portc,4
bcf portc,5
bcf portc,6
bcf portc,7
goto retfie0
;--------------------------------------------恢复现场部分
retfie0
bcf intcon,1
btfsc portb,0
clrf portc
retfie ;中断返回
;--------------------------------------------延时子程序10ms
delay10ms
movlw n1;将外层循环参数n1经过w送入用作外循环变量的data1单元
movwf data1;
lp0 movlw n2;
movwf data2;
lp1 decfsz data2,1 ; 变量data2内容递减,若为0跳跃
goto lp1
decfsz data1,1;变量data1内容递减,若为0跳跃
goto lp0
return;返回子程序
end;源程序结束