基于stm32f4的蓝牙控制小车Word文件下载.docx
《基于stm32f4的蓝牙控制小车Word文件下载.docx》由会员分享,可在线阅读,更多相关《基于stm32f4的蓝牙控制小车Word文件下载.docx(24页珍藏版)》请在冰点文库上搜索。
L298N的工作原理和以上介绍的H桥相同,引脚图如图3.1所示:
图3.1L298N封装图
3.1.2L298N的原理图设计
L298N是ST公司生产的一种高电压、大电流电机驱动芯片。
该芯片采用15脚封装。
主要特点是:
工作电压高,最高工作电压可达46V;
输出电流大,瞬间峰值电流可达3A,持续工作电流为2A;
额定功率25W。
内含两个H桥的高电压大电流全桥式驱动器,可以用来驱动直流电动机和步进电动机、继电器线圈等感性负载;
采用标准逻辑电平信号控制;
具有两个使能控制端,在不受输入信号影响的情况下允许或禁止器件工作有一个逻辑电源输入端,使内部逻辑电路部分在低电压下工作;
可以外接检测电阻,将变化量反馈给控制电路。
使用L298N芯片驱动电机,该芯片可以驱动一台两相步进电机或四相步进电机,也可以驱动两台直流电机。
L298的参考电路图如图3.2所示。
图3.2电机驱动电路原理图
3.1.3电机驱动模块实物
1、控制板内部带5V逻辑电平转换芯片,不需要额外的5V供电。
2、如果EN1、EN2、EN3、EN4不接PWM调速信号,次脚需要和对应的管教短接。
3、GND和12V接电机电源,其中12V可以接7V--24V电平,板子上的电源开关只是控制逻辑5V电平的开关,L298的12V电源不受此开关控制.
4、输出端和输入端一一对应,当输入端为5V时,输出端也为高电平,输入端为低电平时输出亦为低电平。
图3.3L298N电机驱动模块实物图
3.2电源管理模块
3.2.1智能车电源设计要点
电源是整个系统稳定工作的前提,因此必须有一个合理的电源设计,对于小车来说电源设计应
注意两点:
1.与一般的稳压电源不同,小车的电池电压一般在6-8V左右,还要考虑在电池损耗的情况下电压的降低,因此常用的78系列稳压芯片不再能够满足要求,因此必须采用低压差的稳压芯片,在本文中以较为常见的LM2940-5.0为例。
2.单片机必须与大电流器件分开供电,避免大电流器件对单片机造成干扰,影响单片机的稳定运行。
现在各种新型的电源芯片层出不穷,各位读者可以根据自己的需求自行选择电源芯片,对于本设计应该主要注意稳压压差和最大输出电流两个指标能否满足设计要求。
3.2.2低压差稳压芯片LM2940简介
LM2940系列是输出电压固定的低压差三端端稳压器;
输出电压有5V、8V、10V多种;
最大输出电流1A;
输出电流1A时,最小输入输出电压差小于0.8V;
最大输入电压26V;
工作温度-40~+125℃;
内含静态电流降低电路、电流限制、过热保护、电池反接和反插入保护电路。
同时LM2940价格适中而且较容易购买,非常适合在本设计中使用。
LM2940-5.0封装和实物如图3.4所示。
图3.4LM2940封装和实物图
如图3.5所示,采用两路供电,这样可以使用其中一路单独为STM32F4discovery电路板供电,指示灯等供电。
另外一路提供L298N、舵机、蓝牙的工作电压,L298N的驱动电压由电池不经任何处理直接给出。
舵机可以用6V供电,也可以直接用5V供电。
图3.5电源模块原理图
如图3.6中的PCB图:
图3.6电源模块PCB图
图3.7是运用腐蚀液自制的电源管理模块,具有12v\5v的供电模块,可同时给电机模块和主控板(STM32DISCOVERY)供电:
图3.7电源管理模块实物图
4.系统软件设计
4.1主控板程序设计
4.1.1main程序设计
主函数主要分为延迟时间初始化、串口接收模块程序、电机初始化三部分。
主函数的流程图如图4.1所示:
图4.1主函数流程图
主函数程序代码如下:
intmain(void)
{
delay_init(168);
//延迟时间初始化
uart_init(9600);
//串口初始化
Direction
(1);
//电机初始化
delay_ms(10);
//延迟10ms
printf("
welcometocontrolthesmartcar!
:
\n\r"
);
//输入语句
while
(1);
}
4.1.2串口接收模块程序
主控板接收到蓝牙从串口传来的数据后存入Res变量,然后通过分支程序来选择执行前进、后退、左转、右转和停止等功能。
该模块的程序流程图如图2所示:
图2串口接收程序流程图
4.1.3修改PWM输出值程序
该程序是基于“4_PWM的实现”中的程序改编的。
代码如下:
voidChange_PWM(intduty1,intduty2,intduty3,intduty4)
{
SCB->
AIRCR=0x05AF00;
//中断优先级分组抢占:
响应=3:
1
RCC->
AHB1ENR|=(1<
<
2);
//打开GPIOC时钟
GPIOC->
MODER|=0x000AA000;
//pc6789第二功能,推挽输出
OSPEEDR|=0x000FF000;
//输出速度为100m
PUPDR|=0x00055000;
//上拉
AFR[0]|=0x22000000;
//pc6789的第二功能为AF2
AFR[1]|=0x00000022;
APB1ENR|=(1<
1);
//打开TIM3时钟
TIM3->
PSC=83;
//对84M时钟进行84分频,使得计数频率为1M
ARR=10000;
//周期为10ms
EGR|=1;
//产生一次更新时间
CCMR1|=0x6060;
//PWM模式1
CCMR2|=0x6060;
//PWM模式2
CCR1=duty1;
//1路PWM
CCR2=duty2;
//2路PWM
CCR3=duty3;
//3路PWM
CCR4=duty4;
//4路PWM
CCER|=0x1111;
//使能比较输出
CCMR1|=0x0808;
//启动预装载
CCMR2|=0x8080;
CR1|=1;
//开始计时
4.1.4设置电机转向程序
改程序将电机驱动模块的8个输入端口接到了主控板的8个GPIO口,通过推挽输出,从而控制电机的转向,代码如下:
voidDirection(intdirection)
SysTick_Config(SystemCoreClock/1000);
//时钟中断设为1ms
RCC->
AHB1ENR|=0x00000005;
//使能GPIOA和GPIOD时钟
APB2ENR|=(1<
14);
//使能syscfg时钟
if(direction==0)
GPIOA->
MODER&
=0xffff0000;
//设置PA0,1,2,3为输出
MODER|=0x00005555;
OTYPER&
=0xFFFFff00;
//设置PA0,1,2,3为推挽输出
OSPEEDR&
//设置PA0,1,2,3的输出速度为100M
OSPEEDR|=0x0000ffff;
SYSCFG->
CMPCR=0x00000001;
//使用IO补偿单元
PUPDR&
=0xffffff00;
//设置PA0,1,2,3无上拉,无下拉
BSRRH=0x00ff;
//复位GPIOA_BSRRH寄存器
BSRRL=0x0055;
}
else
{
GPIOA->
MODER|=0x0000005555;
BSRRL=0x00AA;
4.2android客户端程序设计
4.2.1控制界面的布局
控制界面主要运用了线性布局、相对布局和表格布局。
整体采用线性布局,局部采用相对布局,而控制按钮采用了表格布局。
控制界面的布局如图4.1所示:
图4.1控制界面的布局
4.2.2布局的代码如下:
?
xmlversion="
1.0"
encoding="
utf-8"
>
LinearLayoutxmlns:
android="
android:
layout_width="
wrap_content"
layout_height="
fill_parent"
orientation="
vertical"
>
RelativeLayout
id="
@+id/container"
<
RelativeLayout
id="
@+id/edit_bottombar"
layout_alignParentBottom="
true"
Buttonandroid:
id="
@+id/btn_disconnect"
android:
65dp"
layout_alignParentLeft="
text="
断开"
/>
<
@+id/btn_msg_send"
layout_alignParentRight="
发送"
EditText
android:
@+id/MessageText"
98dp"
layout_toRightOf="
hint="
说点什么呢?
"
textSize="
15dip"
/>
/RelativeLayout>
ListView
@+id/list"
layout_above="
@id/edit_bottombar"
layout_below="
@id/container"
layout_weight="
divider="
#ffc6c6c6"
scrollingCache="
false"
visibility="
visible"
/>
TableLayout
match_parent"
TableRow
@+id/tableRow1"
Button
@+id/button1"
Button"
invisible"
@+id/start"
layout_marginRight="
0dp"
start"
width="
120px"
/TableRow>
@+id/tableRow2"
1"
@+id/left"
left"
@+id/stop"
stop"
@+id/right"
right"
@+id/tableRow3"
@+id/button2"
@+id/back"
Back"
/TableLayout>
/LinearLayout>
4.2.3android客户端的界面如图4.2所示:
图4.2android控制界面
4.2.4发送按钮的代码
sendButton=(Button)findViewById(R.id.btn_msg_send);
sendButton.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewarg0){
//TODOAuto-generatedmethodstub
StringmsgText=editMsgView.getText().toString();
//获取编辑框内的内容
if(msgText.length()>
0){
sendMessageHandle(msgText);
//发送编辑框的内容给串口
editMsgView.setText("
//清空编辑框
editMsgView.clearFocus();
//closeInputMethodManager
InputMethodManagerimm=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editMsgView.getWindowToken(),0);
else
Toast.makeText(mContext,"
发送内容不能为空!
Toast.LENGTH_SHORT).show();
});
4.2.5控制按钮的代码
以左转按钮为例:
sendButton=(Button)findViewById(R.id.left);
StringmsgText="
;
//发送左转命令“l”
sendMessageHandle(msgText);
//发送“l”给串口
editMsgView.setText("
editMsgView.clearFocus();
imm.hideSoftInputFromWindow(editMsgView.getWindowToken(),0);
5.系统创新
自从有了智能手机,机器人的应用也就多了一个新的方向:
手机控制机器人。
2005年日本第二大电信运营商KDDI和机械制造商IBeeKK联合推出了第一款手机控制机器人。
当然了,想要操纵这种机器人,你首先需要使用KDDI网络,并且用户的手机上,本身还需要带有蓝牙功能,然后再通过KDDI提供BREW方式下载机器人的驱动程式和控制系统。
不过这种机器人的价格却相对高昂,预售市价约合人民币15000元。
随着Android系统技术的普及,可以做个基于Android的客户端,在小车上装个接收蓝牙信号的FBT蓝牙接收模块,然后就可以通过客户端发送蓝牙信号,来对蓝牙小车进行控制控制,其接收可达15米,完全能适应对小车的要求。
其中这个FBT蓝牙接收模块是低耗能,这样就把更多的能量用在小车的驱动上。
小车需要很大的马力和很好的灵活性以应对不同的地形。
这辆车的车轮使用四驱的直流电机来驱动的