ATmega16智能遥控小车

AVR-ATmega16智能遥控小车

AVR单片机相信不少的伙伴在大学的电设课中接触过,不像51单片机和32单片机的资料这么多,但是学校又要求去学,还要设计结题项目,这是最头疼的。该项目可以作为AVR单片的学习的参考,同时也是我们的结课题目:智能遥控小车。

智能遥控小车

小车也仅仅只是一个半入门级别的作品。需要实现对功能如下:

  • 使用ATmega系列单片机通过遥控的方式实现小车的前进、后退、左转、右转等操作
  • PWM实现电机的转速控制,编码电机返回转速,编写PID程序实现电机转速的控制,实现定速巡航行驶
  • 实现自动寻黑线行驶功能。
  • 实现自动防碰撞模式行驶。

准备

从题目出发确定以下方向:

  • 采用蓝牙对小车进行遥控,通过手机端的蓝牙调试助手进行遥控
  • 通过电机驱动利用PWM进行基本行驶操作
  • 编码电机实现对速度的采集,并通过PID运算将速度保持在一个稳定值。
  • 利用红外线寻黑线
  • 利用超声波防碰撞

总体而言题目算是比较简单但又考验对单片机的综合应用能力。

硬件

  • 主控采用ATmega16
  • 驱动采用TB6612FNG
  • 蓝牙采用经典的HC-05
  • 编码电机
  • 三路红外检测黑线
  • HC-SR04超声波

实现过程

一、驱动方面无需多言

逻辑如下:
TB6612FNG

二、蓝牙方面

相信熟悉STM32或者51开发的同学对蓝牙不会陌生,对于蓝牙的收发程序也是得心应手。
但对于ATmega16而言值得注意的对芯片晶振的选择

ATmega16默认的是内部的1MHZ的晶振,无法满足蓝牙的波特率需求,因此需要将ATmega16的晶振设置为内部8MHZ的晶振,并在程序中适配蓝牙的波特率。

三、超声波

如果你使用的是HC-SR04,那么恭喜你中奖了,对于该模块的使用我是一言难尽,实际上在较为适合的距离下该模块的精度还是不错的。但是他有一个致命的缺点(当然也可能是我们的实验室的条件不行,具体情况每个地方都有所不同),那就是在超出量程后会间歇性的报给你错误的方波。
一旦你捕捉到了这些错误的方波,那么你的程序就开始失控了。我并没有什么好的解决办法,只能人为调控,使得障碍物在超声波的检测范围内。因此如果你的预算充足的话,可以购入更好的超声波模块。

四、带AB相的编码电机

AB相的编码电机可以检测轮子的转动方向:正转或者反转。因此对正反向的速度有要求的可以选择,虽然我买的也是AB相,的但实际上并没有用到这个功能,仅检测了一个相位,只测量了速度。
具体的逻辑很简单,计算一秒钟内高电平的次数(一秒钟可以根据自己的要求减少),根据每一个轮子的不同,脉冲次数对应的圈数也不同。再根据轮胎半径,

五、红外线检测黑线

对于红外线循迹,市面上大致分为两种,一种为直接返回高低电平,一种为返回电压值。前者在编写程序上极为简单,但是做过的同学的都知道,爬在地上一点点的调节红外的感受。后者再硬件上就省了不少麻烦,你不用调节,也无法调节,位置对好就ok,但是在程序上就需要你耗费一点时间了。两者取舍还要看具体的情况。

代码

代码放在了我的Github账号下,仅供参考,如需自取。随时欢迎来讨论沟通。
点击这里Github网址

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
#include #include #define uchar unsigned char #define uint unsigned int void main() { DDRA=0X00; DDRB=0XFF; DDRD|=0X30; TCCR1A=0x91; //8位相位修正PWM 8000000/(64*2*256)=244.14hz TCCR1B=0x03; //clk/64 OCR1A=250; //初值占空比100% while(1) { if(PINA==0xe7)//加速前进4、5灯 { OCR1A=202;//占空比100% turn();//居中 } if(PINA==0xcf)//速度稍减前进5、6灯 { OCR1A=202;//占空比90% turnL();//左转-15度 } if(PINA==0x9f)//速度再减前进6、7灯 { OCR1A=176;//占空比80% turnLL();//左转-30度 } if(PINA==0x3f)//速度减前进7、8灯 { OCR1A=176;//占空比70% turnLLL();//左转-45度 } if(PINA==0X7f)//速度稍减前进8灯 { OCR1A=176;//占空比70% turnLLL();//右转45度 } if(PINA==0xf3)//速度稍减前进3、4灯 { OCR1A=202;//占空比90% turnR();//右转15度 } if(PINA==0Xf9)//速度再减前进2、3灯 { OCR1A=176;//占空比80% turnRR();//右转30度 } if(PINA==0Xfc)//速度稍减前进1、2灯 { OCR1A=176;//占空比70% turnRRR();//右转45度 } if(PINA==0Xfe)//速度稍减前进1灯 { OCR1A=176;//占空比70% turnRRR();//右转45度 } } } /*-45度*/ void turnLLL() { uchar i; DDRB=0XFF; PORTB=0XFF; for(i=0;i<30;i++) { PORTB&=~BIT(0); delay(18); PORTB|=BIT(0); delay(4); } } /*-30度*/ void turnLL() { uchar i; DDRB=0XFF; PORTB=0XFF; for(i=0;i<30;i++) { PORTB&=~BIT(0); delay(18); PORTB|=BIT(0); delay(6); } } /*-15度*/ void turnL() { uchar i; DDRB=0XFF; PORTB=0XFF; for(i=0;i<30;i++) { PORTB&=~BIT(0); delay(18); PORTB|=BIT(0); delay(8); } } /*0度居中*/ void turn()//居中 { uchar i; DDRB=0XFF; PORTB=0XFF; for(i=0;i<30;i++) { PORTB&=~BIT(0); delay(18); PORTB|=BIT(0); delay(10); } } /*15度*/ void turnR() { uchar i; DDRB=0XFF; PORTB=0XFF; for(i=0;i<30;i++) { PORTB&=~BIT(0); delay(18); PORTB|=BIT(0); delay(12); } } /*30度*/ void turnRR() { uchar i; DDRB=0XFF; PORTB=0XFF; for(i=0;i<30;i++) { PORTB&=~BIT(0); delay(18); PORTB|=BIT(0); delay(14); } } /*45度*/ void turnRRR() { uchar i; DDRB=0XFF; PORTB=0XFF; for(i=0;i<30;i++) { PORTB&=~BIT(0); delay(18); PORTB|=BIT(0); delay(17); } } /*定时0.1MS*/ void delay(uint z) { uint i,j; for(i=0;i<z;i++) for(j=0;j<90;j++); }
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月球蓬蒿人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值