题目:
指导老师:***
小组成员:********
序言
本课题是利用本学期所学习的ARM知识来设计控制电动机(小车)的运动,经过我们小组激烈的讨论,最终确定了一个可行的方案。
我们采用ARM7-LPC213作为核心板进行总体设计,因为这种芯片实验室可以提供,而且它内核采用ARM设计提供的强大功能,各方面性能比起AT89C51系类单片机具有很强的实用功能和优点。所以我们利用ARM核心模块作为主控制器,还设计了利用具有两路H桥的功能的L298N作为驱动直流电动机的驱动电路,利用LPC213 产生一定占空比的PWM波,实现对电机转速的控制。本系统在设计的过程中还尝试着利用远程遥控来控制电动机(小车),从而使系统性能表现出色。
目录
第一章:硬件的系统电路设计 (4)
1.1硬件设计总体框图…………………………………………………… 1.2 直流稳压电源的实现………………………………………………… 1.3 ARM 微处理器LPC2131…………………………………………….. 1.4 电机控制电路………………………………………………………… 1.5遥控控制电路部分…………………………………………………….. 第二章: 软件设计
2.1软件设计总体框图……………………………………………………. 2.2软件程序解析…………………………………………………………. 第一章:硬件的设计电路设计 1.1硬件设计总体框图
图1.1硬件设计思路框图 1.2直流稳压电源的实现 直流电源
LPC2131
产生PWM
电机驱动L298N
直流电机(小车)
遥控器
图1.2为实验电路实物图
在该系统中,需要使用5V、12V、3.3V的直流稳压电源,其中,LPC2131核心使用5V电源,L298N 的4脚需使用12V的电源以驱动电机,9脚可接5V电源,此系统稳压电源LP3003D。
LP3005D特点:
●低噪声、低纹波、过电流保护
●特别具备恒压/ 恒电流输出,可任意设定
●低价位、高品质、可靠性高
●广泛用于工业生产、实验室
1.3ARM-LPC2131
EasyARM2131开发板是广州周立功公司设计的EasyARM系列开发套件之一,采用了
PHILIPS公司基于ARM7TDMI-S 核、单电源供电、LQFP64封装的LPC2131,具有JTAG
仿真调试、ISP编程等功能
开发板上提供了一些键盘、LED、蜂鸣器等常用功能部件,还具有RS232接口电路、I2C
存储器电路。另外,用户也可以更换兼容的CPU进行仿真调试,如LPC2132、LPC2138、
LPC2142等。灵活的跳线组合(开发板内使用的所有I/O均可断开连接),还有用户I/O接口,
极大地方便了用户进行32位ARM嵌入式系统的开发实验。
EasyARM2131开发板功能特点
完全自主设计的软硬件、拥有自主版权的JTAG仿真技术
支持ADS1.2集成开发环境及其PHILIPS所有型号ARM微控制器的仿真与开发;
SD卡适配器(标准配置)+多种可选配置适配器的形式构成EasyARM2131开发套件,标准配置的CPU PACK主芯片为LPC2131FBD;
板上的功能部件与CPU之间,可以使用跳线器选择连接;
全面支持9种型号的64 PIN小管脚ARM7微控制器
-LPC213x(LPC2131/2132/2134/2136/2138)
-内置USB接口的LPC214x(LPC2142/2144/2146/2148)
多种免费商业化软件包及其详细的开发文档:
*移植μC/OS-II到ARM7软件包
*数据队列软件包
*串口驱动软件包
*MODEM接口软件包
*SPI总线软件包
*I2C总线软件包
*ZLG/FS V1.0版本文件管理系统软件包
*ZLG/GUI图形用户界面软件包
*ZLG/SD卡读写软件包
多种可选配置适配器:
-各种型号的CPU PACK,用户可按需求和喜好配置主ARM芯片
-MG12864点阵图型液晶模块
所有I/O口全部引出,方便用户连接外部电路的开发与使用;
可进行GPIO的控制实验,如键盘输入、蜂鸣器控制、模拟SPI等;
6个独立按键(可用于外部中断、定时器捕获输入),8个LED指示灯;
具有RS232转换电路,可与上位机进行通讯,完成UART通讯实验;
可以与标准串行modem直接接口,方便远程通讯;
具有I2C接口和SPI/SSP接口输出;
提供基于PC的人机界面,方便调试实时时钟、串口通信等功能;
可进行外部中断实验,学习向量中断控制器(VIC);
定时器控制实验,如定时控制LED、定时器捕获等;
使用板内的CA T1025(内含复位功能),完成I2C总线的实验;
使用74HC595芯片,实现SPI接口数据发送、接收实验;
A/D转换实验;DAC转换实验(更换CPU为LPC2132及以上);
实时时钟控制实验;
WDT及低功耗控制实验;
54个基础实验及其大量的中间件软件包,完整地验证了几乎所有的硬件功能
资源;
ARM-2131 1.3实物图
图1.3ARM-2131实物图
1.4电机控制电路
控制器不能直接驱动直流电机,所以必须要有专门的驱动芯片来驱动电机,在这个课题所设计的系统中,我们选择了Mutiwatt15封装形式的l298n,其引脚图如下
图1.4 L298N的引脚图
在本课题中,只需一片L298N来驱动电机,具体电路如下所示:
图1.5 L298N 驱动电机电路
其引脚功能如下所示:
9脚:芯片正常工作电压,4.5V —7V ,可选5V 电源。 4脚:电机工作电压,最大为46V ,这里我们选12V 工作电压
5脚和7脚用于控制电机的转向,此时电平相反,当电平一样时,电机停转。
6脚:使能端,控制电机转速,用控制器控制6脚的脉冲占空比,便可控制了转速。 1脚和15脚:如果不必用作感应电流作用,则可将RSA,RSB 去掉,直接接地。 2脚和3脚:输出端,接直流电机。13脚和14脚与此同
备注:5脚和12脚功能相同
6脚和11脚功能相同 7脚和10脚功能相同
L298是ST 公司生产的一种高电压、大电流电机驱动芯片。该芯片的主要特点是:工作电压高,最高工作电压可达46V;输出电流大,瞬间峰值电流可达3A,持续工作电流为2A;内含两个H 桥的高电压大电流全桥式驱动器,可以用来驱动直流电动机和步进电动机、继电器、线圈等感性负载;采用标准TTL 逻辑电平信号控制;具有两个使能控制端,在不受输入信号影响的情况下允许或禁止。
1
1
21
2
12
1
2
1
2
121
2
121
2
1
2
121
2
1
2
1
2
2
1
15
1413
1211
109
87
65
3
2
1
42
9
8
7
6
5
4
3
1
图1.7 L298N 驱动电机电路的PCB 板
一片L298N可以驱动两个直流电机,图中D1---D8都是为了防止电机产生的电感反电动势烧坏L298而设计的,PWM用来控制电机的转速,而XA1、XA2控制电机的转向和起到刹车的作用。
LPC2131与L298的连接关系:
控制电机转速用到的引脚:P0.0、P0.7
控制电机转向用到的引脚:P0.1、P0.2、P0.3、P0.4
1.5遥控控制电路部分
本次课程设计使用的遥控模块为PT2262/PT2272八路遥控模块M8飞锁接收模块配大功率遥控器。本接收板性能稳定可靠,灵敏度高,带有解码IC可直接使用。工作频率315M,解码使用PT2272或者兼容的固定码芯片,振荡电阻820K,四路输出,可与各款固定码遥控器配合使用。
模块说明:该高频接收模块采用进口SMD器件,6.5G高频三极管,高Q值电感生产。采用超再生接收电路,性能稳定可靠,灵敏度高,带有解码IC可直接使用,功耗低。广泛应用于各种防盗系统,遥控控制系统。
适用范围:
●八位位数据无线接收,防盗报警器信号接收;
●工业遥控,遥测,遥感;
●各种家用电器的遥控等。
技术参数:
工作电压:5.0VDC ±0.5V
工作电流:≤4.5mA(5.0VDC)
工作原理:超再生
工作方式:OOK/ASK
频率范围:315MHz
带宽:2MHz(315MHz, 灵敏度下降3dBm时测试)
灵敏度:优于-105dBm(50Ω)
速率:<5Kbps(315MHz, -95dBm时)
解码格式:PT2272,SC2272等
输出信号:TTL电平,八位路输出
天线长度:24~28cm(315MHz)尺寸及引脚定义:
VT 解码有效指示输出脚
D0-D7 八个控制信号输出引脚
+ VCC DC5V
- GND 负极、地
ANT 天线
下图中左从至右分别为:VCC、GND、D0、D1、D2、D3、D4、D5、D6、D7、VT
遥控模块使用注意事项:
1.天线用软导线或其它硬质金属(如拉杆天线),长度大约28cm(315MHz)或24cm(433MHz),尽量拉直使用。不要靠近金属物体。
2.电源电压要求稳定且波纹系数低,需多级滤波(如增加磁珠﹑电感﹑电容等)
3.若配合单片机使用建议MCU时钟频率在4MHZ以下并且晶体尽量远离RF接收模块,否则晶体的高次谐波会影响通讯距离。
4.注意编码IC和解码IC的速率一致和码的格式一致(即振荡电阻要匹配),否则将会影响距离乃至不能通讯。
ARM-2131和遥控模块引脚连接:
遥控模块D0—D7分别和ARM P0.8、P0.9、P0.10、P0.11、P0.12、P0.13、P0.14
遥控模块VCC和ARM的3.3V相连
遥控模块GND和ARM GND相连
VT天线
第二章:软件设计
2.1系统程序
#include "config.h"
#define IN1 1<<1
#define IN2 1<<2
#define IN3 1<<3
#define IN4 1<<4
#define key1 0x00000100
#define key2 0x00000200
#define key3 0x00000400
#define key4 0x00000800
#define key5 0x00001000
#define key6 0x00002000
#define key7 0x00004000
uint32 Duty;
void dingyiyinjiao()
{
PINSEL0=PINSEL0&0xfffffff3;/*设置GPIO P0.1*/
PINSEL0=PINSEL0&0xffffffcf;/*设置GPIO P0.2*/
PINSEL0=PINSEL0&0xffffff3f;/*设置GPIO P0.3*/
PINSEL0=PINSEL0&0xfffffcff;/*设置GPIO P0.4*/ }
void tiaosu()
{
PINSEL0=PINSEL0&0xf3ffffff;/* 设置P0.13 */
PINSEL0=PINSEL0&0xcfffffff;/* 设置P0.14 */
IO0DIR|=0x000000ff;/*P0.0-P0.7为输出其他为输入*/ if ((IO0PIN&key6)!=0)
Duty=80;
if ((IO0PIN&key7)!=0)
Duty=40;
}
/*接受正转*/
void jieshouzhengzhuan()
{
dingyiyinjiao();
PINSEL0=PINSEL0&0xfffcffff;/* 设置P0.8 */
IO0DIR|=0x000000ff;/*P0.0-P0.7为输出其他为输入*/ if((IO0PIN&key1)!=0)
{
IO0SET=IN1;
IO0CLR=IN2;
IO0SET=IN3;
IO0CLR=IN4;
}
}
/*反转*/
void jieshoufanzhuan()
{
dingyiyinjiao();
PINSEL0=PINSEL0&0xfff3ffff;/* 设置P0.9 */
PINSEL0=PINSEL0&0xf3ffffff;/* 设置P0.13 */
IO0DIR|=0x000000ff;/*P0.0-P0.7为输出其他为输入*/ if((IO0PIN&key2)!=0)
{
IO0SET=IN2;
IO0CLR=IN1;
IO0SET=IN4;
IO0CLR=IN3;
}
}
/*电机右转*/
void jieshouyouzhuan()
{
dingyiyinjiao();
PINSEL0=PINSEL0&0xffcfffff;/* 设置P0.10 */
PINSEL0=PINSEL0&0xf3ffffff;/* 设置P0.13 */
IO0DIR|=0x000000ff;/*P0.0-P0.7为输出其他为输入*/ if((IO0PIN&key3)!=0)
{
IO0CLR=IN2;
IO0CLR=IN3;
IO0CLR=IN4;
}
}
/*电机左转*/
void jieshouzuozhuan()
{
dingyiyinjiao();
PINSEL0=PINSEL0&0xfff3ffff;/* 设置P0.11 */
PINSEL0=PINSEL0&0xf3ffffff;/* 设置P0.13 */
IO0DIR|=0x000000ff;/*P0.0-P0.7为输出其他为输入*/ if((IO0PIN&key4)!=0)
{
IO0CLR=IN1;
IO0CLR=IN2;
IO0SET=IN3;
IO0CLR=IN4;
}
}
/*电机停止*/
void jieshoutingzhi()
{
dingyiyinjiao();
PINSEL0=PINSEL0&0xfcffffff;/* 设置P0.12 */
PINSEL0=PINSEL0&0xf3ffffff;/* 设置P0.13 */
IO0DIR|=0x000000ff;/*P0.0-P0.7为输出其他为输入*/ if((IO0PIN&key5)!=0)
{
IO0CLR=IN1;
IO0CLR=IN2;
IO0CLR=IN3;
IO0CLR=IN4;
}
void PWM_Init(uint32 freq,uint32 Duty) {
PINSEL0=(PINSEL0&0xffff3fff)|0x00008000; PINSEL0=(PINSEL0&0xfffffffc)|0x00000002; /*初始化pwm2*/
PWMPCR|=(1<<10);
PWMPR=0x00;
PWMMCR=0x02;
PWMMR0=Fpclk/freq;
PWMMR2=PWMMR0*Duty/100;
PWMLER|=(0x01|1<<2);
PWMTCR=0x09;
/*初始化pwm1*/
PWMPCR|=(1<<9);
PWMPR=0x00;
PWMMCR=0x02;
PWMMR0=Fpclk/freq;
PWMMR1=PWMMR0*Duty/100;
PWMLER|=(0x01|1<<1);
PWMTCR=0X09;
}
void MOTO_A_PWM(uint32 Duty)
{
PWMMR1=PWMMR0*Duty/100;
PWMLER|=(0X01|1<<1);
PWMTCR=0X09;
}
void MOTO_B_PWM(uint32 Duty)
{
PWMMR2=PWMMR0*Duty/100;
PWMLER|=(0x01|1<<2);
}
/*电机控制端口初始化*/
void MOTO_Init(void)
{
PWM_Init(200,0);
}
/*右电机正转*//*PWM通过控制两个使能端来控制调速*/ void MOTO_zhunbeidong(uint32 Duty)
{
MOTO_A_PWM(Duty);
MOTO_B_PWM(Duty);
}
/*控制直流电机正转、反转、停止示例程序主函数*/
int main(void)
{
PWM_Init(200,0);
Duty=40;
IO0CLR=IN1;
IO0CLR=IN2;
IO0CLR=IN3;
IO0CLR=IN4;
while(1)
{
/*正转*/
MOTO_zhunbeidong(Duty);
jieshouzhengzhuan();
tiaosu();
MOTO_zhunbeidong(Duty);
/*反转*/
jieshoufanzhuan();
tiaosu();
MOTO_zhunbeidong(Duty);
/*停止*/
MOTO_zhunbeidong(Duty);
jieshoutingzhi();
/*右转*/
MOTO_zhunbeidong(Duty);
jieshouyouzhuan();
/*左转*/
MOTO_zhunbeidong(Duty);
jieshouzuozhuan();
}
return 0;
}
总结:
非常感谢**老师的指导,在他指导下我们才能取得最后的成功;**老师在设计训练的过程中一直不嫌其烦的给我们讲授!再次表示衷心感谢!
**心得:
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,ARM嵌入式系统已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握嵌入式的开发技术是十分重要的。
回顾起这次课程设计,我仍感慨颇多,的确,从选题到定稿,从理论到实践,在接近两星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己
各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说不懂一些元器件的使用方法,对ARM硬件系统掌握得不好……通过这次课程设计之后,一定把以前所学过的知识重新温故。
这次课程设计终于顺利完成了,在设计中遇到了很多编程问题,最后在老师的辛勤指导下,终于游逆而解。同时,在老师那里我学得到很多实用的知识,在此我表示感谢,同时,对学校给我这次机会表示忠心的感谢!
附录:实物图