智能小车.docx
- 文档编号:7020784
- 上传时间:2023-01-16
- 格式:DOCX
- 页数:59
- 大小:195.98KB
智能小车.docx
《智能小车.docx》由会员分享,可在线阅读,更多相关《智能小车.docx(59页珍藏版)》请在冰豆网上搜索。
智能小车
盛方跟我学做智能车第一节电机驱动原理
时间:
2009-9-25来源:
WWW.SFMCU.COM作者:
SFMCU点击:
112次
盛方单片机 sf-51单片机超级学习板(基础套餐)
第一节智能小车电机驱动原理
一、驱动板概述
驱动板由大功率驱动芯片L298为主,加上L1117稳压芯片为整个电路板提供稳定的5V电压。
驱动板能同时驱动两个直流电机。
通过对六个口的控制就可以分别实现对电机正反转、加减速的控制。
完成向前、向后、左转和右转等各种组合运动。
每个电机用三个口控制,一个使能端(EN)或PWM输入端,控制电机的转动与停止,也能用于PWM控制调速。
也就说,对这个输入端输入一定频率的脉冲,当为高电平时,电机转动,为低电平时,电机停止转动。
一定频率的脉冲,电机一段时间内转动一段时间内停止转动,但由于直流电机的惯性特性,它不会立即停下来,只要频率高于某个值,就不会感觉到电机的停滞现象,反而是一种很连续的运动。
只要改变一个周期内高低电平的时间比例,就可以改变电机的速度。
另外两个输入端是为了控制方向,分别为In1和In2。
In1为高电平,In2为低电平,电机按一个方向转,In1为低电平,In2为高电平,电机向相反方向转,如果他们同时为高电平或低电平,那么电机不转。
二、驱动板电路原理
那我们首先分析一下L298驱动板,L298驱动板原理图如图1。
该驱动板需要用7.2V电源供电,但L298N的逻辑参考电平为典型的TTL电平。
用了一个L1117稳压芯片提供稳定的5V输出电压和逻辑参考电压,D9、D10、D11和D12是发光二极管,指示运动方向,与它们连接的电阻都是限流电阻。
R5和R8都是下拉电阻,让EnA和EnB口要么是高电平,要么是低电平,避免出现电平混乱,提高对输入信号的抗干扰能力。
输出端都接有0.1uF电容,加上二极管平衡电路。
他们都是为了保护L298N,电机是感性负载,当给电机突然通电与断电,因为电流的瞬变,电机两端会产生瞬时高压和大电流。
如果没有保护措施,L298N就可能会被烧毁。
三、恒压恒流桥式2A驱动芯片L298N
L298N驱动芯片是由SGS公司的产品,比较常见的15脚Multiwatt封装,内部有4通道逻辑驱动电路。
它的内部结构如图1。
从内部结构图可知,用三极管组成H型平衡桥,驱动功率大,驱动能力强。
同时H型PWM电路工作在晶体管的饱和状态与截止状态,具有非常高的效率。
从图2看出该驱动芯片有两路H型PWM电路,上面已谈到用PWM控制直流电机调速的基本原理,现在来看电路的具体实现。
In1为高电平,In2为低电平,EnA为高电平时,U1、U4输出为高电平,U2、U3输出为低电平。
在OUT1、OUT2接上电机后,T1、T4管导通,T2、T3管截止,电机向一个方向转。
In1为低电平,In2为高电平,EnA仍旧为高电平,T1、T4管截止,T2、T3管导通,电机向相反方向转。
In1、In2同时为高电平或低电平,T1与T3同时导通或截止,T2与T4也是同时导通与截止,但与前者相反,也就是OUT1与OUT2电压相同。
电机会快速停转。
如果EnA端为低电平,整个H型PWM电路关闭。
电机当然也就不会转。
四、驱动板连线:
驱动板与单片机和驱动板与直流电机的接线如图3,整个系统的总电源由L298驱动板的供电电源提供。
L298驱动板的5V电源输出给单片机。
L298驱动板的输入控制端与P0口相连,具体各管脚的连接的情况如图3。
L298驱动板的输出直接与直流电机连接,参照图3。
L298驱动板的有一个VCC和GND不用。
他们是使用步进电机时,作为公共端的。
要实现对电机的前后控制,只要P0^0和P0^1逻辑电平相反。
假设P0^0为高,P0^1为低时是正转。
那么在颠倒送数,即P0^0为低,P0^1为高,车轮就会反转。
调速,控制P0^2口的高电平保持时间相对总周期长点,速度就大,短点,速度就小。
图3 驱动板连线图
盛方跟我学做智能车第二节基本行进控制
时间:
2009-9-25来源:
WWW.SFMCU.COM作者:
SFMCU点击:
63次
盛方单片机 sf-51单片机超级学习板(基础套餐)
第二节小车前进、后退、转弯、变速实验
一、实验原理:
电机驱动板的控制端与P0口相连,注意P0口必须接上拉电阻,1k比较合适。
按照驱动板原理,只要控制与方向控制连接的I/O口,就能实现小车方向的控制,控制与使能端连接的I/O口,就能实现小车速度的控制。
小车直线前进,每个轮的速度受使能端控制,当使能端输入相同占空比时,两轮速度相同,实现小车直线前进。
直线后退,每个轮的速度控制与直线前进一样,改变两轮的运动方向,方向控制信号与直线前进相反即可。
小车左转,方向控制保持和前进一样,左轮速度慢,右轮速度快,就可以让小车左转。
小车右转,和左转原理一样,左轮速度快,右轮速度慢,就可以了。
直线变速前进,方向不变,逐渐改变输出PWM的占空比。
占空比逐渐增加,就是加速,占空比逐渐减小,就是减速。
二、实验任务:
1. 编写小车直线前进的程序,小车速度可调,改变小车速度。
小车速度共25档,也就是说,PWM周期共分为25等份。
调节速度就是控制高电平的占有时间即等份数。
2. 改变小车的运动方向,让小车后退,改变占空比,体验小车不同速度后退。
3. 控制小车左轮占空比小于右轮,下载程序,小车可以完成左转弯功能。
改变左右轮占空比的差距,观察小车的转弯幅度也会随之变化。
4. 控制小车右轮占空比小于左轮,重复任务3的步骤,小车就可以右转弯了。
接着重复任务3的实验内容。
5. 通过前面的4个任务,我们基本上已经具有控制小车完成基本工作的能力了,现在让我们来做点有挑战性的实验吧。
题目,小车实现变速功能,每1-2秒小车速度变化一次。
从速度零加速到最大速度,然后从最大速度逐渐减速到零,如此反复。
速度共分为25档。
三、实验源程序:
任务1源程序:
/*******************************************************************
公司名称:
盛方单片机
公司网址:
模块名称:
001.c
功能:
直行前进。
说明:
通过定时器0产生PWM调速。
程序设计:
tongwei
设计时间:
2009.09.13
版本号:
*********************************************************************/
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineMOTOR_CP0//P0口作为电机的控制口。
#definePERCENT3//占空比常量定义。
#defineSHELVES25//速度总档数。
sbitPWM_R=P0^7;//右电机PWM输入口
sbitPWM_L=P0^2;//左电机PWM输入口
#defineBACK0xC6//后退
#defineFORWARD0xA5//前进
voidtimer_init(void);//定时器初始化函数。
voidforward(void);//前进函数。
/********************************************************************
函数名:
timer_init()
功能:
初始化定时器0
说明:
无
入口参数:
无
返回值:
无
设计:
tongwei日期:
2009.09.13
修改:
日期:
***********************************************************************/
voidtimer_init(void)
{
TMOD=0x02;//定时器0工作在方式2,定时值自动重载,启动仅受TR0的控制。
TH0=256-200;//定时周期为200us*SHELVES
TL0=256-200;
EA=1;//开总中断。
ET0=1;//开定时器0中断。
TR0=1;//启动定时器0。
}
/********************************************************************
函数名:
forward()
功能:
小车直行函数。
说明:
无
入口参数:
无
返回值:
无
设计:
tongwei日期:
2009.09.12
修改:
日期:
***********************************************************************/
voidforward(void)
{
timer_init();//定时器0初始化。
MOTOR_C=FORWARD;//设置方向,前进
while
(1);
}
/********************************************************************
函数名:
timer_zero()
功能:
定时器0中断服务函数
说明:
无
入口参数:
无
返回值:
无
设计:
tongwei日期:
2009.09.12
修改:
日期:
***********************************************************************/
voidtimer_zero(void)interrupt1
{
staticuchartemp=0;//中断次数计数,
EA=0;//关总中断,屏蔽其他中断。
if(temp { PWM_L=1;//PWM高电平,11000110B PWM_R=1; temp++;//实现计数 } else { if(temp { PWM_L=0;//PWM低电平,01000010B PWM_R=0; temp++;//实现计数 } else//一个PWM周期结束,计数清零。 { temp=0; } } EA=1;//开总中断。 } /******************************************************************** 函数名: main() 功能: 主函数 说明: 无 入口参数: 无 返回值: 无 设计: tongwei日期: 2009.09.12 修改: 日期: ***********************************************************************/ voidmain() { forward(); } 任务2源程序: /******************************************************************* 公司名称: 盛方单片机 公司网址: 模块名称: 002.c 功能: 直行后退。 说明: 通过定时器0产生PWM调速。 程序设计: tongwei 设计时间: 2009.09.13 版本号: *********************************************************************/ #include #defineucharunsignedchar #defineuintunsignedint #defineMOTOR_CP0//P0口作为电机的控制口。 #definePERCENT3//占空比常量定义。 #defineSHELVES25//速度总档数。 sbitPWM_R=P0^7;//右电机PWM输入口 sbitPWM_L=P0^2;//左电机PWM输入口 #defineBACK0xC6//后退 #defineFORWARD0xA5//前进 voidtimer_init(void);//定时器初始化函数。 voidback(void);//后退函数。 /******************************************************************** 函数名: timer_init() 功能: 初始化定时器0 说明: 无 入口参数: 无 返回值: 无 设计: tongwei日期: 2009.09.13 修改: 日期: ***********************************************************************/ voidtimer_init(void) { TMOD=0x02;//定时器0工作在方式2,定时值自动重载,启动仅受TR0的控制。 TH0=256-200;//定时周期为200us*SHELVES TL0=256-200; EA=1;//开总中断。 ET0=1;//开定时器0中断。 TR0=1;//启动定时器0。 } /******************************************************************** 函数名: back() 功能: 小车直行函数。 说明: 无 入口参数: 无 返回值: 无 设计: tongwei日期: 2009.09.13 修改: 日期: ***********************************************************************/ voidback(void) { timer_init();//定时器0初始化 MOTOR_C=BACK;//设置方向,后退 while (1); } /******************************************************************** 函数名: timer_zero() 功能: 定时器0中断服务函数 说明: 无 入口参数: 无 返回值: 无 设计: tongwei日期: 2009.09.12 修改: 日期: ***********************************************************************/ voidtimer_zero(void)interrupt1 { staticuchartemp=0;//中断次数计数, EA=0;//关总中断,屏蔽其他中断。 if(temp { PWM_L=1;//PWM高电平,11000110B PWM_R=1; temp++;//实现计数 } else { if(temp { PWM_L=0;//PWM低电平,01000010B PWM_R=0; temp++;//实现计数 } else//一个PWM周期结束,计数清零。 { temp=0; } } EA=1;//开总中断。 } /******************************************************************** 函数名: main() 功能: 主函数 说明: 无 入口参数: 无 返回值: 无 设计: tongwei日期: 2009.09.12 修改: 日期: ***********************************************************************/ voidmain() { back(); } 任务3源程序: /******************************************************************* 公司名称: 盛方单片机 公司网址: 模块名称: 003.c 功能: 小车左转弯。 说明: 通过定时器0产生PWM调速。 程序设计: tongwei 设计时间: 2009.09.13 版本号: *********************************************************************/ #include #defineucharunsignedchar #defineuintunsignedint #defineMOTOR_CP0//P0口作为电机的控制口。 #defineSHELVES25//速度总档数。 sbitPWM_R=P0^7;//右电机PWM输入口 sbitPWM_L=P0^2;//左电机PWM输入口 #defineBACK0xC6//后退 #defineFORWARD0xA5//前进 voidtimer_init(void);//定时器初始化函数。 voidleft(void);//左转弯函数。 ucharpercent_l=0;//左轮占空比 ucharpercent_r=0;//右轮占空比 /******************************************************************** 函数名: timer_init() 功能: 初始化定时器0 说明: 无 入口参数: 无 返回值: 无 设计: tongwei日期: 2009.09.13 修改: 日期: ***********************************************************************/ voidtimer_init(void) { TMOD=0x02;//定时器0工作在方式2,定时值自动重载,启动仅受TR0的控制。 TH0=256-200;//定时周期为200us*SHELVES TL0=256-200; EA=1;//开总中断。 ET0=1;//开定时器0中断。 TR0=1;//启动定时器0。 } /******************************************************************** 函数名: left() 功能: 小车左转 说明: 通过控制左右轮不同的占空比,实现左右转。 入口参数: 无 返回值: 无 设计: tongwei日期: 2009.09.13 修改: 日期: ***********************************************************************/ voidleft(void) { timer_init();//初始化定时器0。 MOTOR_C=FORWARD;//方向向前 percent_r=8;//右轮速度快。 percent_l=5;//左轮速度慢。 while (1); } /******************************************************************** 函数名: timer_zero() 功能: 定时器0中断服务函数 说明: 无 入口参数: 无 返回值: 无 设计: tongwei日期: 2009.09.12 修改: 日期: ***********************************************************************/ voidtimer_zero(void)interrupt1 { staticuchartemp=0;//中断次数计数, EA=0;//关总中断,屏蔽其他中断。 if(temp { if(temp { PWM_L=1;//左电机高电平 } else { PWM_L=0;//左电机低电平 } if(temp { PWM_R=1;//右电机高电平 } else { PWM_R=0;//右电机低电平 } temp++;//实现计数 } else//一个PWM周期结束,计数清零。 { temp=0; } EA=1;//开总中断。 } /*****************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 智能 小车