智能小车.docx

上传人:b****5 文档编号:7020784 上传时间:2023-01-16 格式:DOCX 页数:59 大小:195.98KB
下载 相关 举报
智能小车.docx_第1页
第1页 / 共59页
智能小车.docx_第2页
第2页 / 共59页
智能小车.docx_第3页
第3页 / 共59页
智能小车.docx_第4页
第4页 / 共59页
智能小车.docx_第5页
第5页 / 共59页
点击查看更多>>
下载资源
资源描述

智能小车.docx

《智能小车.docx》由会员分享,可在线阅读,更多相关《智能小车.docx(59页珍藏版)》请在冰豆网上搜索。

智能小车.docx

智能小车

盛方跟我学做智能车第一节电机驱动原理

时间:

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;//开总中断。

}

 

/*****************

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1