本文主要是介绍基于51的智能小车(蓝牙、循迹),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
-
- 基本概述
- 硬件组成
- 功能概述
- 原理图
- 模块介绍
- 单片机控制模块
- L298N电机驱动模块
- 红外循迹模块
- 蓝牙模块
- 电源和小车车体
- 小车功能实现及代码介绍
- 基本概述
一、基本概述
硬件组成:整个系统包括单片机控制模块,L298N电机驱动模块、循迹模块、蓝牙模块、电源和小车车体
功能介绍:小车的拥有两种功能模式,小车循迹模式和蓝牙控制模式,通过拨动开关给给选择小车的两种模式
原理图:
pcb:
二、模块介绍
1.单片机控制模块
该小车使用STC89C52芯片作为驱动,利用了该单片机内部的三个定时器,一个UART串口通信还有若干个I/O口等。
2.L298N电机驱动模块
L298N就是L298的立式封装,源自意法半导体集团旗下品牌产品,是一款可接受高电压、大电流双路全桥式电机驱动芯片,工作电压可达46V,输出电流最高可至4A,采用Multiwatt 15脚封装,接受标准TTL逻辑电平信号,具有两个使能控制端,在不受输入信号影响的情况下通过板载跳帽插拔的方式,动态调整电路运作方式,有一个逻辑电源输入端,通过内置的稳压芯片78MO5,使内部逻辑电路部分在低电压下工作,也可以对外输出逻辑电压5V,为了避免稳压芯片损坏,当使用大于12V驱动电压时,务必使用外置的5V接口独立供电。
L298N通过控制主控芯片上的I/O输入端,直接通过电源来调节输出电压,即可实现电机的正转、反转、停止,由于电路简单,使用方便,通常情况下L298N可直接驱动继电器(四路)、螺线管、电磁阀、直流电机(两台)以及步进电机(一台两相或四相)。
使用:右上角输入12,34分别接入单片机I\O口,通过I/O口给予不同高低电平驱动电机转向,A、B使能端控制输通过A、B端的开关,通道A、B分别接入两个电机的各自两条引线。
使用A、B使能时,需要插入跳线帽。
PWM:
频率 = 1 / TS 占空比 = TON / TS 精度 = 占空比变化步距
PWM原理
以STM32单片机为例,其IO口只能输出高电平和低电平。
假设高电平为5V、低电平则为0V,那么要输出不同的模拟电压就要用到PWM。通过改变IO口输出的方波的占空比,从而获得使用数字信号模拟成的模拟电压信号。
电压是以一种脉冲序列被加到模拟负载上去的,接通时是高电平1,断开时是低电平0。接通时直流供电输出,断开时直流供电断开。通过对接通和断开时间的控制,理论上来讲,可以输出任意不大于最大电压值5V的模拟电压。
比方说,占空比为50%那就是高电平时间一半,低电平时间一半。在一定的频率下,就可以得到模拟的2.5V输出电压。那么75%的占空比,得到的电压就是3.75V,如下图所示。
也就是说,在一定的频率下,通过不同的占空比即可得到不同大小的输出模拟电压,PWM就是通过这种原理实现数字模拟信号转换的。
PWM对电机转速的控制
调节占空比可以实现不同电压的输出,实现对电机转速的调节。
对于直流电机来讲,电机输出端引脚是高电平电机就可以转动,当输出端高电平时,电机会转动,但是是一点一点的提速,在高电平突然转向低电平时,电机由于电感有防止电流突变的作用是不会停止的,会保持这原有的转速,以此往复,电机的转速就是周期内输出的平均电压值,所以实质上我们调速是将电机处于一种,似停非停,似全速转动又非全速转动的状态,那么在一个周期的平均速度就是我们占空比调出来的速度了。
在电机控制中,电压越大,电机转速越快,而通过PWM输出不同的模拟电压,便可以使电机达到不同的输出转速。
当然,在电机控制中,不同的电机都有其适应的频率 频率太低会导致运动不稳定,如果频率刚好在人耳听觉范围,有时还会听到呼啸声。频率太高时,电机可能反应不过来,正常的电机频率在 6-16kHZ之间为好。
3.红外循迹
TCRT5000传感器的红外发射二极管不断发射红外线,当发射出的红外线没有被反射回来或被反射回来但强度不够大时,红外接收管一直处于关断状态,此时模块的输出端为高电平,指示二极管一直处于熄灭状态;总结就是:
没反射——D0输出高电平——灭灯
反射——D0输出低电平——点亮
接线
1、VCC:接电源正极(3-5V)
2、GND:接电源负极
3、D0:TTL开关信号输出
4、A0:模拟信号输出
AI和AO的讲解
(1)AI信号:模拟量输入
所谓模拟量即4-20mA或0-10V的电流或电压信号,输入到DCS中,经过变换,还原出原来的值,比如电流值到DCS中显示出来;电流互感器二次值(5A)经过电流变送器转换成4-20mA信号(5A对应20mA),输入到DCS机柜,经过转换,在DCS中显示实际的电流值。
(2)AO信号:模拟量输出
和AI相反,AO是DCS输出4-20mA或0-10V信号,去控制设备的运行参数;比如,变频器的速度控制过程,以40HZ为例,通过远程DCS控制,认为给定参数值:40HZ,DCS同样发出一个对应的模拟量电流值,在4-20mA范围内(20mA对应50HZ),信号传入到变频器的控制器,变频器按照要求运行在40HZ。
4.蓝牙模块
蓝牙通信:蓝牙小车通过蓝牙模块与控制设备——手机,进行无线通信。
控制信号传输:蓝牙模块接入51单片机的TX和RX口,手机通过蓝牙串口连接发送指令数字给蓝牙小车。
数据解析与处理:蓝牙接收到控制设备发送的指令后,会通过蓝牙模块接收并解析这些数据。然后,根据指令的内容进行相应的动作,控制电机驱动轮子前进或后退。
电机驱动:小车接收到指令后控制,电机和驱动电路,用于控制车轮的转动。根据接收到的指令,电机驱动电路会控制电机的转速和方向,从而实现小车的运动。
*RXD: 接收端
*TXD: 发送端
*VCC: 模块供电正极(5V)
*GND: 模块供电负极
AT 、EN:在配置蓝牙模块时接上蓝牙下载口
5.小车车体及电源
该小车使用的二驱的车体,使用两组电池给小车整体供电,一组电池用于给L298N电机驱动来对电机进行驱动,另一组用于其他vcc、gnd供电,两组电池均为12v
三、小车功能实现及代码介绍
代码中P0_4口的为1还是为0由接入的vcc或gnd决定。
//#Car.h
#ifndef __CAR_H__
#define __CAR_H__
void Timer0Init(void);
//void Timer1Init(void) ;
void Timer2Init(void);
void goLeftForward();
void goLeftStop();
void goRightForward();
void goRightStop();
void goForward();
void goStop();
void goLeft();
void goRight();#endif//#Car.c 小车车轮转动#include <REGX52.H>
sfr AUXR = 0x8E;
sbit left_con1A = P1^1;
sbit left_con2A = P1^2;
sbit right_con1A = P1^4;
sbit right_con2A = P1^3;char leftSpeed;
char rightSpeed;
int cntLeft = 0;
int cntRight = 0;void Timer0Init(void) //@11.0592MHz
{AUXR &= 0x7F; TMOD &= 0xF0; TMOD |= 0x01; TL0 = 0x66; TH0 = 0xFC; TF0 = 0; TR0 = 1; ET0 = 1;EA = 1;
}void Timer2Init(void) //1毫秒@11.0592MHz
{T2MOD = 0; //初始化模式寄存器T2CON = 0; //初始化控制寄存器TL2 = 0x66; //设置定时初值TH2 = 0xFC; //设置定时初值RCAP2L = 0x66; //设置定时重载值RCAP2H = 0xFC; //设置定时重载值TR2 = 1; //定时器2开始计时ET2=1;EA=1;
}void goLeftForward()//左边前进
{left_con1A = 1;left_con2A = 0;
}void goLeftStop()//左边停止
{left_con1A = 0;left_con2A = 0;
}//?????
void goRightForward()//右边前进
{right_con1A = 1; right_con2A = 0;
}//?????
void goRightStop()//右边停止
{right_con1A = 0; right_con2A = 0;
}//??
void goForward()//前进
{leftSpeed = 18;rightSpeed = 19;
}//??
void goStop()//停止
{leftSpeed = 0;rightSpeed = 0;
}//??
void goLeft()//左转
{leftSpeed = 5;rightSpeed = 18;
}//??
void goRight()//右转
{leftSpeed = 18;rightSpeed = 5;
}void Time0Handler() interrupt 1//左边电机调速
{cntLeft++;TL0 = 0x66; TH0 = 0xFC;if(cntLeft == 20){cntLeft = 0;}//左边占空比if(cntLeft < leftSpeed){goLeftForward();}else{goLeftStop();}}void Timer2_Routine() interrupt 5 //右边电机调速
{cntRight++;if(cntRight < rightSpeed){goRightForward();}else{goRightStop();}if(cntRight == 20){cntRight = 0;}
}//#Uath.h#ifndef __UART_H__
#define __UART_H__
void Uart_Init();
void receive();
#endif//#Uath.c 蓝牙模式#include <REGX52.H>
#include "car.h"
unsigned char receiveData;void Uart_Init(){/*波特率设置*/TMOD = 0x20;//设置定时器T1的工作方式-2,即8位自动装填定时器TH1 = 0xFD;//波特率为9600TL1 = 0xFD; TR1 = 1;//打开定时器T1/*串口设置*/SM0 = 0;//设置串口工作方式1SM1 = 1;REN = 1;//使能串口接收允许位ES = 1;//使能串行中断允许位EA = 1;//使能中断允许位}void receive()//执行蓝牙控制函数
{Uart_Init();while(1){ switch(receiveData){case '2':goForward();break;case '4':goLeft();break;case '6':goRight();break;case '8':goStop();}}
}void Uart_Routine() interrupt 4
{if(RI==1){ goStop();RI=0;receiveData=SBUF;}SBUF=receiveData;while(!TI);TI=0;}//#main.c#include <REGX52.H>
#include "car.h"
#include "Uart.h"
sbit tracingLeft = P1^5;
sbit tracingRight = P1^6;unsigned char keynum;
void tracingMode()//红外循迹模式
{ if(tracingLeft == 0 && tracingRight == 0){goForward(); }if(tracingLeft == 0 && tracingRight == 1){goRight();}if(tracingLeft == 1 && tracingRight == 0){goLeft();}if(tracingLeft == 1 && tracingRight == 1){goStop();}
}void main()
{Timer0Init();Timer2Init();while(1){if(P0_4==1) //手机遥控模式 {receive();}else if(P0_4==0)//红外循迹模式{tracingMode();} }
}
这篇关于基于51的智能小车(蓝牙、循迹)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!