星空综合体育app下载 51智能车入门
当我第一次接触51单片机时,我认为这非常困难。
记录蓝牙小车的制作过程
一、前言
不要认为它像制作玩具一样困难。蓝牙汽车对于初学者来说是一道坎,PWM调速对于很多人来说都是困难的。其实这些并不难。
2、什么是pwm调速?
网上是这样说的:
PWM(Pulse Width Modulation)控制——脉冲宽度调制技术,通过调制一系列脉冲的宽度,等效地获得所需的波形(包括形状和幅度)。
但实际上我们只需要记住两个词:
周期和占空比
从调速的角度来说,控制PWM就相当于控制手动按下按钮的频率和每次按下按钮的时间来控制LED。 pwm的周期是按下按钮的时间间隔,占空比是按下按钮的时间。
如果你把LED换成电机,那么你就完成了速度调节。速度就是亮度。它们都取决于你的 PWM 波的有效值。也可以理解为抵抗。通电时间越长,发热量越大。
换句话说星空·体育中国官方网,你控制的设备输出的功率就是pwm的占空比。如果占空比为50%,则输出为最大功率的1/2。
#include "reg52.h"
#include "intrins.h"
sbit out1=P2^0;
sbit out2=P2^1;
sbit out3=P2^2;
sbit out4=P2^3;//四个输出
int n,speed1,speed2,speed3,speed4;
void InitTimer0(void)//定时器初始化,这里设定了1ms定时
{
TMOD = 0x01;
TH0 = 0x0FC;
TL0 = 0x18;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void main()
{
InitTimer0();
while(1)
{
speed1=20;
speed2=50;
speed3=70;
speed4=90;//设定四个输出的占空比
}
}
void Timer0Interrupt(void) interrupt 1
{
TH0 = 0x0FC;
TL0 = 0x18;
n++;
if(n==100)//设定周期100ms
n=0;
if(n
[外部链接图像传输失败。源站可能有防盗链机制。建议保存图片直接上传(img-97xbzC7G-1591437204971)()]
这里我们可以看到 20%、50%、70%、90% 四种输出 pwm 之间的明显差异。
3. 电机的驱动方式
仅仅依靠单片机io口输出的电流来控制电机是不够的。
51单片机IO口的输入电流被限制在10ma左右,输出电流在10ua左右。加上拉电阻只能达到20ma左右,不足以驱动需要更大电流的电机。
这时候我们就需要用到电机驱动模块。
电机驱动模块的种类也很多。一般驱动小型减速电机可以使用L298N系列驱动模块。如果我们驱动更大的减速电机,就必须使用mos管驱动器。
这是我们最常用的L298N电机驱动模块,使用起来非常简单。
[外部链接图像传输失败。源站可能有防盗链机制。建议保存图片直接上传(img-XF3BP6Xt-1591437204977)()]
还有这种较小的L298N,但它的使用比较严格,电压不能超过10V,安装也不是很方便。不建议初学者使用。
我们先看一下第一个L298N,它的尺寸比较大。
引脚功能
电压控制电路
12V电源接口
接地
地面
5V
12V转5V输出接口,单片机可以使用此5V电源
埃纳、埃纳
调速引脚,不需要调速时短接
IN1-4
电机方向控制
1. 电源和地 2. 方向控制引脚
in1、in2、in3、in4控制两端电机,in1、in2控制其左端输出,in3、in4控制其右端输出。
以左端的控制为例,我们可以将in1和in2理解为电动势。如果in1和in2都为0或1,则没有电位差星空·综合体育官网入口,此时没有电流输出。
如果in1为0且in2为1,则产生电动势。此时输出端子输出电流,可以观察电机的转向。否则,如果in1为1且in2为0,则电机将沿与刚才相反的方向旋转。
右端也是如此,就是控制输出端的电流方向。
3.调速销
如果不需要调速,则无需拔掉短路。此时调速引脚接高电平,为100%占空比信号,电机全速旋转。
如需调节速度,请拔掉短路跳线。与in1-4同一行的引脚是您需要连接到微控制器的引脚。此时可以在ENA或ENB上给出pwm信号,其速度为100%。该数字等于您的工作周期。
4.输出
每个L298N有两个输出,可以控制两侧的电机。如果我们做四轮汽车,我个人建议使用L298N来控制一侧的两个电机。这样可以避免由于L298N的性能问题导致前后轮速度不同。
5、为什么要使用减速电机?
减速电机内部是普通电机。不同的减速电机内部结构不同,但其原理都是相同的:
牺牲距离以增加工作量
内部是减速齿轮组。夸张地说,当电机旋转10圈时,外部可能只旋转一次。这样减速电机的功率就更大了,更重要的是更容易控制速度。我们控制电机旋转一次是比较困难的,但是我们比较容易粗略控制它旋转100次左右,所以我们更容易控制减速电机的速度和距离。
4. 追踪
跟踪是智能汽车的一个主要关注点。如果你在地面的白底上画一条黑线,汽车就可以沿着黑线行驶。这是怎么做到的?
这里我们需要使用跟踪模块。
跟踪模块还需要VCC接5V,GND接地,两个引脚,一个AO,一个DO。我们可以只使用 DO 引脚。 AO为AD输出,暂时不用。
原理:利用不同颜色下红外反射强度的差异。例如,在白色条件下,红外线很容易被反射回来。在黑色条件下,红外线会被黑色吸收而无法返回,从而区分两种颜色。
蓝色电位器用于调节检测的颜色。游戏前调试过程中必须调整电位器,使其能够清晰区分跟踪线和底板。
跟踪模块的数量可以根据实际情况确定。
1. 双向追踪
双向追踪比较简单,有两种编程思想。
第一种:幽灵式纯电路追踪(名字是我自己起的)
如果不常用的话性能不好,不需要芯片控制。
这种循迹只需控制左右转弯或差速转向,即两侧车轮不以相同速度直线行驶。
我制作的第一辆追踪车就是基于这种追踪方法,并且可以通过简单的纯电路来驱动。
它通常适用于两后轮驱动、前轮万向轮的三轮汽车。
**想法**:前面的两个跟踪模块可以通过继电器控制。一旦检测到左侧有黑线,证明车身方向是向右的,需要左转。此时左轮不动,右轮向前移动。一旦检测到右侧出现黑线,则证明车身方向为左,需要右转,不要移动右轮,左轮向前移动。此时我们看到的是,车子左右摇晃,沿着黑线行驶。
第二种:简单双向跟踪
这是我们最常用的双向跟踪,性能不错,适合所有机型。
[外部链接图像传输失败。源站可能有防盗链机制。建议保存图片直接上传(img-3PnzUicw-1591437204987)()]
两个跟踪模块之间的距离可以略大于跟踪线宽度。
2. 三向追踪
三向跟踪比双向跟踪更准确,一般用于直角转弯或精度要求较高的情况。
与双向跟踪一样,两侧的模块用于检测车身是否向左倾斜或向右倾斜。只有当中间模块检测到黑线时它才能开始前进。
[外部链接图像传输失败。源站可能有防盗链机制。建议保存图片直接上传(img-NiY40c4N-1591437204990)()]
直角转弯时星空体育app下载入口,黑线不会在两侧模块内。此时,当黑线接近时,可以利用中间模块来判断车身是否准确对准黑线。
3. 直角弯曲跟踪
有时我们需要直角转弯。这时候我们就需要在车身两侧安装跟踪模块。
[外部链接图像传输失败。源站可能有防盗链机制。建议保存图片直接上传(img-u2cQryQl-1591437204993)()]
两侧的模块用于检测是否达到直角弯曲。一旦检测到黑线,它就会就地转动。
4.差速驱动
在跟踪过程中,如果要保持速度或进行S转弯,则需要使用差速。
差速是指两侧轮子旋转方向相同但速度不同。这个效果是实现汽车的S形运动,也可以用来在高速行驶时微调方向。
5.PID算法
更高级的跟踪可以使用PID算法并使用差速来校准方向,但这种方法使用起来比较困难。
struct _pid
{
float ExpectedValue;//定义设定值
float ActualValue;//定义实际值
float err;//定义偏差值
float err_last;//定义上一个偏差值
float err_prev;//定义前一个的偏差值
float Kp, Ki, Kd;//定义比例、积分、微分系数
}pid;
void PID_Init()
{
pid.ExpectedValue = 0.0;
pid.ActualValue = 0.0;
pid.err = 0.0;
pid.err_prev = 0.0;
pid.err_last = 0.0;
pid.Kp = 0.4;
pid.Ki = 0.2;
pid.Kd = 0.0;
}
float PID_Realize(float speed) {
float index;
pid.ExpectedValue = speed;
pid.err = pid.ExpectedValue - pid.ActualValue;
//增量式pid公式
float incrementValue = pid.Kp*(pid.err - pid.err_last) + pid.Ki*pid.err + pid.Kd*(pid.err - 2 * pid.err_last + pid.err_prev);
pid.ActualValue += incrementValue;
pid.err_prev = pid.err_last;
pid.err_last = pid.err;
return pid.ActualValue;
}
五、扩展功能 1、远程控制
远程控制有多种选择:
如果使用51单片机,可以使用蓝牙和JDY-40。
蓝牙模块可以通过手机控制。在手机上下载蓝牙串口调试软件,并与蓝牙模块配对。
JDY-40,可以使用另一个51芯片来控制。
注:JDY-40电源电压严格要求3.3V,可以使用稳压芯片进行电压转换。
[外部链接图像传输失败。源站可能有防盗链机制。建议保存图片直接上传(img-abMLf5Fv-1591437204996)()]
使用串口远程控制时,单片机要注意更换11.0592M晶振,并尽量使用9600或115200的波特率。例如JDY-40的初始波特率为9600。
如果调试时出现乱码,首先要确认两个设备的波特率是否相同,RXD和TXD是否连接正确。
发送的数据可以是十六进制格式,如0x01。
2、舵机
舵机可配备超声波、摄像头等。车辆上可内置两轴云台并进行控制。
[外部链接图像传输失败。源站可能有防盗链机制。建议保存图片直接上传(img-yx9w5Jne-1591437205000)()]
我们常用的SG90相对于金属舵机来说肯定是微不足道的,但是它的性能足够我们做一些小型的开发了。
其控制原理与PWM调速类似,但其周期是固定的。
伺服驱动周期为20ms,占空比为0.5-2.5ms,即0-180度。
时间(毫秒) 角度
0.5
1.0
45
1.5
90
2.0
135
2.5
180
当然,它的角度是线性变化的,并不固定只有5个角度。
3.同时使用串口和定时器
这里需要将TMOD改为0X21
例子:
void TimeInit()//定时器和串口同时初始化
{
SCON=0X50;
TMOD|=0X21;
PCON=0X80;
TH1 = 0xF3;
TL1 = TH1;
TR1=1;
TH0 = 0x0FF;
TL0 = 0x9C;
ET0 = 1;
TR0 = 1;
ES=1;
EA=1;
}
4、超声波避障等。
通过计时编写的驱动程序是懒惰的,不使用计时器。
超声波可以实现避障和倒车自停功能。
五、常见故障及问题的解决 1、执行某些操作(如停车或启动)时出现重新启动**
这是因为电机在启动或停止的瞬间消耗电流过大,导致单片机因电流不足而失电,导致重启。
解决办法:只需在单片机的VCC和GND之间加一个电容即可。电容越大,效果越好。
2、伺服运行中重启
同样的原因是功耗。舵机的功耗高于电机,因此建议单独给舵机供电。
解决办法:额外增加一块3.7V电池给舵机供电,并注意公共地。
6. 结束
暂时就这些,希望对大家有帮助!
我要评论