智能寻迹避障小车电机控制系统设计教材.docx
- 文档编号:12372096
- 上传时间:2023-04-18
- 格式:DOCX
- 页数:33
- 大小:417.30KB
智能寻迹避障小车电机控制系统设计教材.docx
《智能寻迹避障小车电机控制系统设计教材.docx》由会员分享,可在线阅读,更多相关《智能寻迹避障小车电机控制系统设计教材.docx(33页珍藏版)》请在冰豆网上搜索。
智能寻迹避障小车电机控制系统设计教材
第一章智能寻迹避障小车电机控制系统设计
1.任务
任务一:
产生智能寻迹避障小车电机的基本控制信号;
任务二:
编制智能寻迹避障小车基本巡航动作的控制函数;
2.要求
(1)能控制智能寻迹避障小车电机的旋转方向和速度;
(2)能控制智能寻迹避障小车实现基本巡航动作;
1.1项目描述
本项目的主要内容是:
对C51单片机编程,使之产生控制电机旋转方向和转速的各种基本控制信号,然后在此基础上编制出能够控制智能寻迹避障小车实现前进、后退、左转弯、右转弯等基本巡航动作的控制函数。
控制电机旋转是智能寻迹避障小车实现各种导航控制的重要基础,在本书后续项目模块中都要用到对电机的控制,因此本章所设计出的电机控制函数将作为功能模块被后续设计案例直接调用;通过该项目的学习与实践,可以让读者获得如下知识和技能:
掌握单片机I/O端口的基本应用方法;
学会单片机C语言的基本编程方法;
掌握直流伺服电机的基本工作原理和控制方法;
掌握直流减速电机的基本工作原理和控制方法;
掌握H电桥驱动直流电机的工作原理与控制方法,即直流电机驱动芯片L293工作原理;
能够编制控制轮式教育机器人实现基本巡航动作的控制函数;
1.2必备知识
1.2.1伺服电机
伺服:
一词源于希腊语“奴隶”的意思。
人们想把“伺服机构”当个得心应手的驯服工具,服从控制信号的要求而动作。
在信号来到之前,转子静止不动;信号来到之后,转子立即转动;当信号消失,转子能即时自行停转。
由于它的“伺服”性能,因此而得名。
标准的伺服电机有三条控制线,分别为:
电源、地线及控制线。
电源线与地线用于提供内部的电机及控制线路所需的能源,控制信号要求是一个周期性的正向脉冲信号,这个周期性脉冲信号的高电平时间通常在1ms—2ms之间,而低电平时间应在5ms到20ms之间。
本书向读者介绍的伺服电机是PARALLAX公司生产的连续旋转伺服电机,它的控制信号时序是:
低电平时间固定为20ms,高电平为1.3ms—1.7ms之间。
图1.1为PARALLAX公司生产的直流伺服电机外形图。
图1.1直流伺服电机外形图
1.2.2直流电机
方案二中采用的是直流减速电机,在此只介绍该电机的控制方法,对于其内部结构不作介绍。
该电机外形示意图如图1.2所示,它有红、黑两根控制线,电机状态控制电平如表1-1所示。
表1-1电机控制电平与状态对应表
红线控制端
黑线控制端
电机状态
0
1
顺转
1
0
逆转
1
1
停转
直流电机的控制信号由单片机输出送至电机驱动芯片L293后,经L293内部H电桥电路驱动电机运转。
图1.2直流电机外形图
1.2.3直流电机H桥驱动电路工作原理
本设计中直流电机H桥驱动电路由驱动芯片L293D完成,在L293D内部形成一个H桥型的驱动驱动电路,类似如图1.3所示。
图中用开关模拟电机信号通断,在实际的控制中是采用晶体三极管来完成此功能,可参见图1.4所示的电机控制示意图。
此处只是为简述控制原理,所以用开关模拟电机工作过程。
图1.3H桥驱动直流电机电路
从图中可以看出,其形状类似于字母“H”,而作为负载的直流电机是像“桥”一样架在上面的,所以称之为“H桥驱动”。
4个开关所在位置就称为“桥臂”。
从电路中不难看出,假设开关A、D接通,电机为正向转动,则开关B、C接通时,直流电机将反向转动。
从而实现了电机的正反向驱动。
借助这4个开关还可以产生电机的另外2个工作状态:
(1)刹车——将B、D开关(或A、C)接通,则电机惯性转动产生的电势将被短路,形成阻碍运动的反电势,形成“刹车”作用。
(2)惰行——4个开关全部断开,则电机惯性所产生的电势将无法形成电路,从而也就不会产生阻碍运动的反电势,电机将惯性转动较长时间。
图1.4电机控制示意图电路
1.2.4延时函数
在实际的单片机应用系统开发过程中,由于程序功能的需要,经常编写各种延时程序,延时时间从数微秒到数秒不等。
实现延时通常有两种方法:
一种是硬件延时,要用到单片机的定时器/计数器,这种方法可以提高CPU的工作效率,同时也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行,本项目开发过程中采用的是软件延时的方法,在后续各项目模块中经常作为延时功能调用的几个延时函数原形如下:
voiddelay_nµs(uinti)//延时微秒级函数
{
i=i/10;
while(--i);
}
voiddelay_nms(uintn)//延时毫秒级函数
{
n=n+1;
while(--n)
delay_nµs(900);
}
voiddelayms(uintx)//延时函数12兆晶振1000为一秒;
11.0592兆晶振922为一秒(会有一定误差)
{
uchari;
while(x--)
for(i=0;i<123;i++);
}
上述函数设计的基本原理是通过执行循环体来消耗时间从而达到延时的目的,其中delay_nms()是毫秒级的延时,而delay_nµs()是微秒级的延时。
例如:
如果你想延时1毫秒,可以使用语句delay_nms
(1);延时100微秒则可使用语句delay_nµs(100);来完成。
注意:
上述延时函数是在外部晶振为12MHZ的情况下设计的,如果外部晶振频率不是12MHz,调用这两个函数所产生的真正延时就会发生变化。
对于许多C51开发者特别是初学者编制非常精确的延时函数有一定难度,关于延时函数的编程经验和技巧此处不作详细介绍,读者目前只要会将这两个函数作为功能模块调用就行了
1.3案例设计
1.3.1系统设计方案
本项目向读者详细介绍了两种实现方案,其中学员实操采用方案二进行。
同时该项目设计为本书后续设计案例的基础控制模块,后续的寻迹、避障等功能模块实在该项目上扩展实现的。
方案一:
该设计方案采用CPU对执行机构输出控制,不涉及到对外部数据信息的采集,因此,系统采用“CPU+执行机构”的总体设计方案,其中CPU采用目前性价比较高的STC89C52单片机,并以此为核心构建最小控制系统,执行机构的动力装置采用PARALLAX公司生产的连续旋转伺服电机,其优点是编程控制方便且不需额外增加驱动电路,系统总体框图如图1.5所示。
图1.5方案一系统框图
方案二:
采用“单片机最小系统+电机驱动芯片+直流电机”的设计方案,设计方案中的电机采用直流减速电机,该电机具有控制原理简单、性价比高,易于控制等特点,被广泛应用于各种智能玩具小车设计之中;电机驱动采用集成芯片L293完成,该芯片运用H电桥驱动直流电机的控制原理实现对直流电机旋转方向和速度的控制。
系统总体框图如图1.6所示。
图1.6方案二统框图
1.3.2硬件电路设计
方案一:
该设计方案的硬件电路如图1.7所示:
它是在单片机最小系统的基础上直接?
础_0ol_1连接伺服电机构成的,其中左电机的控制信号由P1_0提供,右电机的控制信号由P1_1提供,直接对该两个端口编程,便可实现对伺服电机旋转方向和速度控制。
图1.7方案一系统原理图
方案二:
该设计方案的硬件电路如图1.8所示:
电机控制信号由单片机的P0.0—P0.3输出送到电机驱动芯片的2脚与7脚以及10脚与15脚,再从芯片的3脚与6脚(左电机控制)以及11脚与14脚(右电机控制)输出驱动电机工作。
图1.8方案二系统原理图
1.3.3系统软件设计
任务一:
产生智能寻迹避障小车电机的基本控制信号
方案一:
本任务是对单片机编程,在指定的单片机引脚P1_0输出伺服电机的各种控制信号。
1、源程序
sfrP1=0x90;//P1口C51定义;
sbitP1_0=P1^0;//特殊功能位定义
#defineuintunsignedint
voiddelay_nµs(uinti)//延时nµs函数
{
i=i/10;
while(--i);
}
voiddelay_nms(uintn)//延时nms函数
{
n=n+1;
while(--n)
delay_nµs(900);
}
intmain(void)//主函数
{
while
(1)
{
P1_0=1;//P1_0输出高电平
delay_nµs(1500);//延时1。
5ms
P1_0=0;//P1_0输出低电平
delay_nms(20);//延时20ms
}
}
2、程序运行及调试
在智能寻迹避障小车控制板上按图1.7连接伺服电机控制电路,编译以上程序,将产生的可执行文件烧写到控制板上的单片机程序存储器,具体操作步骤如下:
步骤1:
启动KeiluVision4IDE,完成对上面程序的编辑,编译和调试,产生可执行的HEX文件。
步骤2:
将ISP下载线一端连接到PC机的并行接口上,另一端(小端)连接到智能寻迹避障小车的程序下载口上。
打开ISP下载软件将步骤1获得的HEX文件下载到智能寻迹避障小车的单片机内部程序存储器,开启电源,运行程序,用示波器测量P1_0引脚,可测出使伺服电机转速为零的控制信号,其波形如图1.9所示。
图1.9使伺服电机转速为零的控制信号4理信号sf,而时序图
将程序中的delay_nµs(1500)改成delay_nµs(1300),即延时1.3ms,再重复以上步骤,可用示波器测得使伺服电机使电机顺时针全速旋转的控制信号,其波形如图1.10所示。
图1.10使电机顺时针全速旋转的控制脉冲序列
将程序中的delay_nµs(1500)改成delay_nµs(1700),即延时1.7ms,再重复以上步骤,可用示波器测得使伺服电机逆时针全速旋转的控制信号,其波形如图1.11所示。
图1.11使伺服电机逆时针全速旋转的脉冲序列
在1.3ms—1.5ms—1.7ms时间范围内改变延时函数的延时量,可获得控制伺服电机不同旋转方向和转速的各种波形。
步骤3:
对伺服电机进行零点标定
所谓伺服电机零点标定是指当发送一个使伺服电机转速为零的控制信号给伺服电机时,让电机保持静止不动的过程,伺服电机在出厂时没有预先标定,因此需要调整。
具体做法是:
将步骤2产生的使电机转速为零的控制程序加载到单片机程序存储器,开机运行,,若电机有旋转,说明未标定,用螺丝刀调整伺服电机上的电位器,同时观察电机的旋转情况,直到电机停止转动,表明已经标定。
电机标定后,用步骤2产生的各种控制信号测试电机的旋转方向和速度,观察电机的运行情况,可以实现对电机的不同旋转方向和速度的控制。
3、程序设计思路
基本思路是:
根据伺服电机的控制信号的时序要求,调用延时函数控制单片机引脚高低电平的持续时间,并用循环执行的方式使单片机引脚不断的输出伺服电机控制信号。
产生伺服电机基本控制信号的程序流程图1.12所示:
图1.12主函数流程图
即利用延时函数将指定的引脚的低电平持续时间固定为20ms,而高电平持续时间根据需要在“1.3ms—1.5ms—1.7ms”时间范围内改变,然后循环执行,就可获得能够控制伺服电机不同旋转方向和转速的各种控制脉冲信号。
方案二:
对单片机P0.0、P0.1(左电机)和P0.2、P0.3(右电机)编程,程序设计以左电机为例。
1、源程序
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitzuo1=P0^1;//左电机端口定义
sbitzuo2=P0^0;
sbityou1=P0^3;//右电机端口定义
sbityou2=P0^2;
voiddelay(uintx)
{
uchari;
while(x--)
for(i=0;i<123;i++);
}
voidqian()
{
zuo1=0;
zuo2=1;//左边往前
you1=0;
you2=1;//右边往前
}
main()
{
while
(1)
{
qian();
delay(922*5);
}
}
2、程序运行及调试
在智能寻迹避障小车控制板上按图1.8连接伺服电机控制电路,编译以上程序,将产生的可执行文件烧写到控制板上的单片机程序存储器,具体操作步骤如下:
步骤1:
启动KeiluVision4IDE,完成对上面程序的编辑,编译和调试,产生可执行的HEX文件。
步骤2:
将STC下载线一端连接到PC机的并行接口上,另一端(小端)连接到智能寻迹避障小车的程序下载口上。
打开STC下载软件将步骤1获得的HEX文件下载到智能寻迹避障小车的单片机内部程序存储器,开启电源,运行程序,此时左右电机顺时针旋转,小车前进。
将上述程序中的前进函数中的左右端口控制电平按表1-1所示的修改,编辑、编译后便可以得到电机逆转(后退)、停转(原地不动)的控制函数。
任务二:
编制智能寻迹避障小车基本巡航动作的控制函数
方案一:
本任务是在伺服电机基本控制信号的基础上设计出智能寻迹避障小车的基本巡航动作的控制函数,并按一定的算法调用这些控制函数,使智能寻迹避障小车完成比较复杂的运动。
1、源程序
*=========================================================
程序名:
Control.c
功能:
控制轮式教育机器人实现前后左右运动的基本动作
=========================================================*/
#include
#defineuintunsignedint
#defineucharunsignedchar
voiddelay_nµs(uinti);//函数声明
voiddelay_nms(uintn);
voidForward(void);
voidLeft_Turn(void);
voidRight_Turn(void);
voidBackward(void);
ucharNavigation[10]={'F','L','F','F','R','B','L','B','B','Q'};
main(void)//主函数
{
intaddr=0;
while(Navigation[addr]!
='Q')
{
switch(Navigation[addr])
{
case'F':
Forward();break;
case'L':
Left_Turn();break;
case'R':
Right_Turn();break;
case'B':
Backward();break;
}
addr++;
}
}
voiddelay_nµs(uinti)//延时nµs
{
i=i/10;
while(--i);
}
voiddelay_nms(uintn)//延时nms
{
n=n+1;
while(--n)
delay_nµs(900);
}
voidForward(void)//前进子函数
{
uchari;
for(i=1;i<=65;i++)
{
P1_1=1;
delay_nµs(1700);
P1_1=0;
P1_0=1;
delay_nµs(1300);
P1_0=0;
delay_nms(20);
}
}
voidLeft_Turn(void)//左转弯子函数
{
uchari;
for(i=1;i<=26;i++)
{
P1_1=1;
delay_nµs(1300);
P1_1=0;
P1_0=1;
delay_nµs(1300);
P1_0=0;
delay_nms(20);
}
}
voidRight_Turn(void)//右转弯子函数
{
uchari;
for(i=1;i<=26;i++)
{
P1_1=1;
delay_nµs(1700);
P1_1=0;
P1_0=1;
delay_nµs(1700);
P1_0=0;
delay_nms(20);
}
}
voidBackward(void)//后退子函数
{
uchari;
for(i=1;i<=65;i++)
{
P1_1=1;
delay_nµs(1300);
P1_1=0;
P1_0=1;
delay_nµs(1700);
P1_0=0;
delay_nms(20);
}
}
2、运行程序
这里仍然按图1.7连接伺服电机控制电路,编译以上程序,将产生的可执行文件烧写到智能寻迹避障小车控制板上的单片机程序存储器,开机运行,可以看到小车能按如下规律运动,即:
前进→左转弯→前进→前进→右转弯→后退→左转弯→后退→后退→停止,仔细观察可以发现,它的运动轨迹接近一个矩形。
3、程序设计思路
主函数按数组设定的次序依次调用前进,左转弯、右转弯和后退等四个基本控制函数,这四个函数是在任务一介绍过的伺服电机基本控制信号的基础上设计的,下面我们重点以“前进子函数”为例介绍其基本设计思路,为了便于分析,这里再把程序中的“前进子函数”单独列出如下:
voidForward(void)//前进子函数
{
uchari;
for(i=1;i<=65;i++)
{
P1_1=1;
delay_nµs(1700);
P1_1=0;
P1_0=1;
delay_nµs(1300);
P1_0=0;
delay_nms(20);
}
}
仔细分析以上程序,根据P1_0和P1_1引脚的高低电平持续时间,可以画出让轮式教育机器人前进的左右电机控制脉冲时序图,如下:
图1.13前进控制信号时序图
对照任务一中介绍过的伺服电机正转、反转控制信号,我们发现,以上控制小车前进的脉冲信号有两个问题需要进一步解释。
第一:
因为伺服电机安装在车架上的朝向刚好相反,其中一个电机如果原来是正转,那么掉转朝向之后就变成了反转,所以要使两个电机带动两个轮子朝一致的方向转动,就必须让两个伺服电机的旋转方向为一正一反。
第二:
因为受到单片机的编程限制,两个电机的控制脉冲并没有在时间上保持绝对的同步(如图1.13所示),这样看起来似乎一个电机要先动作,而另一个电机稍微有点滞后,并且由此引起的低电平持续时间也不再是前面介绍的20ms。
不过这点小误差在程序实际运行中的影响可以被忽略。
图1.13只给出了控制小车前进的一个控制脉冲,为驱使小车向前行进一段距离,程序中用for循环语句产生65个这样的脉冲序列,在具体应用中,可以根据实际需要改变循环次数,以达到改变小车行进距离的目的。
用同样的思路,读者不难分析本案例中的左转弯、右转弯和后退等基本动作控制函数。
方案二:
本任务是在直流减速电机基本控制信号的基础上设计出智能寻迹避障小车的基本巡航动作的控制函数,主要完成智能寻迹避障小车前进、后退、停止等基本巡航动作。
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitzuo1=P0^1;
sbitzuo2=P0^0;
sbityou1=P0^3;
sbityou2=P0^2;
voiddelay(uintx)
{
uchari;
while(x--)
for(i=0;i<123;i++);
}
voidqian()
{
zuo1=0;
zuo2=1;//左边往前
you1=0;
you2=1;//右边往前
}
voidhou()
{
zuo1=1;
zuo2=0;//左边往后
you1=1;
you2=0;//右边往后
}
voidzuo()
{
zuo1=1;
zuo2=0;//左边往后
you1=0;
you2=1;//右边往前
}
voidyou()
{
zuo1=0;
zuo2=1;//左边往前
you1=1;
you2=0;//右边往后
}
voidting()
{
zuo1=1;
zuo2=1;
you1=1;
you2=1;
}
main()
{
while
(1)
{
qian();
delay(922*5);
hou();
delay(922*4);
ting();
delay(922*3);
}
}
2、运行程序
这里仍然按图1.8连接直流减速电机控制电路,编译以上程序,将产生的可执行文件烧写到智能寻迹避障小车控制板上的单片机程序存储器,开机运行,可以看到小车能按如下规律运动,即:
前进5秒→后退4秒→停止3秒;如此周而复始循环。
3、程序设计思路
主函数按事先设定的次序依次调用前进,延时、后退,延时、停止,延时函数;让智能寻迹避障小车完成规定动作。
即主要测试电机的前进、后退、停止功能是否控制正常,读者可以将左转弯、右转弯函数加入主函数中加以调用,看功能是否实现。
1.4相关知识
通过上述设计案例的学习和实践,在对单片机输出接口的应用有了直观认识之后,我们下面再来详细学习有关单片输入/输出口机(I/O口)的基本结构及原理,以及特殊功能寄存器(sfr)的Cx51定义方法。
1.4.189C51并行IO 口的内部结构及原理
89C51单片机总共有4个8位的并行IO接口,分别是P0,P1,P2和P3(本案例用到P1口),共32根I/O口线,实际上4个并行I/O口就是特殊功能寄存器SFR之中的4个,每个I/O口主要由4部分构成:
端口锁存器、输入缓冲器、输出驱动器和端口引脚,下面分别介绍其内部结构及原理:
(a)P0口的位结构(b)P1口的位结构
(c)P2口的位结构(d)P3口的位结构
图1.1489C51各I/O口的位结构
1、P0口:
图1.14中的(a)是P0口中一位结构图。
其中包含一个输出锁存器、两个三态缓冲器、一个输出驱动电路和一个输出控制电路。
输出驱动电路由两个场效应管T1和T2组成,其工作状态受输出控制电路的控制。
控制电路包括一个与门、一个反相器和模拟转换开关MUX。
模拟开关的位置由来自CPU的控制信号决定,当控制信号为低电平时,它把输出级与锁存器的Q端接通。
同时,因为与门输出为低电平,输出级中的场效应管T1处于截止状态,因此是输出级是漏级开路的开漏电路。
这种情况P0口可用做一般的I/O线。
其输出和输入操作如下:
当CPU向端口输出数据时,写脉冲加在触发器的时钟端CL上,此时与内部总线相连的D端的数据经反向后出现在Q端上,再经T2管反相,于是在P0口这一位引
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 智能 寻迹避障 小车 电机 控制系统 设计 教材