蓝牙智能小车.docx
- 文档编号:7090173
- 上传时间:2023-01-17
- 格式:DOCX
- 页数:12
- 大小:1.44MB
蓝牙智能小车.docx
《蓝牙智能小车.docx》由会员分享,可在线阅读,更多相关《蓝牙智能小车.docx(12页珍藏版)》请在冰豆网上搜索。
蓝牙智能小车
燕山大学
课程设计说明书
题目:
蓝牙智能小车
学院(系):
电气工程学院
年级专业:
10级过控2班
学号:
学生姓名:
指导教师:
摘要
本文的主要工作是基于STM32蓝牙智能小车的设计,随着越来越多的高科技产品逐渐融入了日常生活中,步进电机控制系统发生了巨大的变化。
单片机、C语言等前言学科的技术日趋成熟与实用化,使得步进电机的控制系统有了新的研究方向与意义。
本文描述了一个由STM32微处理器、步进电机、键盘等模块构成的,提供基于STM32的PWM细分技术的步进电机控制系统。
该系统采用STM32微处理器为核心,在MDK环境下进行编程,根据键盘的输入,使STM32产生周期性的PWM信号,用此信号对步进电机的速度和转动方向进行控制。
结果表明该系统具有结构简单、工作可靠、精度高等特点。
关键词:
STM32微处理器;蓝牙智能小车;PWM信号;细分技术
第一章蓝牙智能小车简介
机器人可以分为三部分——传感器部分、控制器部分、执行器部分。
控制器部分:
接收传感器部分传递过来的信号,并根据事前写入的决策系统(软件程序),来决定机器人对外部信号的反应,将控制信号发给执行器部分。
好比人的大脑。
执行器部分:
驱动机器人做出各种行为,包括发出各种信号(点亮发光二极管、发出声音)的部分,并且可以根据控制器部分的信号调整自己的状态。
对机器人小车来说,最基本的就是轮子。
这部分就好比人的四肢一样。
传感器部分:
机器人用来读取各种外部信号的传感器,以和控制机器人行动的各种开关。
好比人的眼睛、耳朵等感觉器官。
无线部分:
用蓝牙从机的TTL接口接收信号反馈给单片机,还可以通过电脑的无线局域网网卡来控制路由器的TTL串口来控制单片机的状态。
由于蓝牙模块容易得到且接口方便,电压可以用+5V控制,携带方便,便于在小车上安装。
电机驱动:
电机驱动需要大电流,较高的电压,考虑到单片机的负载能力,用L298N驱动模块来驱动电机,单片机输出逻辑信号控制L298N模块输出正反向电压,由此控制电机的正反转。
第二章系统硬件设计
1.小车底盘
小车底盘是机器人最重要的载体,相当于人体的驱干,ZK-4WD小车平台采用差速转弯非常灵活可以实现原地打转。
小车平台大小刚好,可以承载一些如驱动器,控制器,电池,传感器等。
2.驱动器
小车直流电机工作电流一般是200-400MA有些更大,如果一个小车是二个轮子,那么总的电流在400-800MA左右,这些电机轮子都是要接受单片机指令执行相应的动作,而市面有的单片机IO口一般只能提供5MA到10MA的电流,直接驱动不了电机,所以需要搞一个驱动模块。
放大电流。
驱动采用专业的L298N,L293D驱动芯片。
3.控制器
STM32单片机控制器:
这款控制器主控芯片是STC89C52属标准的51核的单片机,也可以用增强型51单片机芯片,STC12C5A60S2内带PWM,AD,1T运行速度(主流),集成USB转串可以直接用USB下载程序。
集成数码管,舵机,红外避障,12864,1602,无线模块,等接口,板载输入按键。
控制板休积小,非常适用于小车。
在不用的时候可作用学习板使用。
4.小车所需的能源
可以用普通的AA5号电池,但一般采用低内阻的充电电池,充电电池套装。
5.蓝牙无线传感器
可以用Android智能手机控制小车运行(我们有配套的Android软件),Android手机用内置蓝牙与蓝牙无线模块配对,发出指令,蓝牙无线模块接收其指令。
当单片机接收到蓝牙无线模块传来的指令,执行相应解码动作,从而控制小车。
第三章 系统软件设计
一、所包含的头文件:
#include"stm32f10x.h"
#include"usart1.h"
#include"timer4.h"
#include"adc1.h"
#include"key.h"
二、外设的初始化和设置
本节按步骤描述了如何初始化和设置任意外设。
这里PPP代表任意外设。
1、在主应用文件中,声明一个结构PPP_InitTypeDef,例如:
PPP_InitTypeDefPPP_InitStructure;
这里PPP_InitStructure是一个位于内存中的工作变量,用来初始化一个或者多个外设PPP。
2、为变量PPP_InitStructure的各个结构成员填入允许的值。
可以采用以下2种方式:
a)按照如下程序设置整个结构体
PPP_InitStructure.member1=val1;
PPP_InitStructure.member2=val2;
PPP_InitStructure.memberN=valN;
/*whereNisthenumberofthestructuremembers*/
以上步骤可以合并在同一行里,用以优化代码大小:
PPP_InitTypeDefPPP_InitStructure={val1,val2,..,valN}
b)仅设置结构体中的部分成员:
这种情况下,用户应当首先调用函数PPP_SturcInit(..)来初始化变量PPP_InitStructure,然后再修改其中需要修改的成员。
这样可以保证其他成员的值(多为缺省值)被正确填入。
PPP_StructInit(&PPP_InitStructure);
PP_InitStructure.memberX=valX;
PPP_InitStructure.memberY=valY;
/*whereXandYarethememberstheuserwantstoconfigure*/
3.调用函数PPP_Init(..)来初始化外设PPP。
4.在这一步,外设PPP已被初始化。
可以调用函数PPP_Cmd(..)来使能之。
PPP_Cmd(PPP,ENABLE);
可以通过调用一系列函数来使用外设。
每个外设都拥有各自的功能函数。
更多细节参阅Section3外设固件概述。
注:
1.在设置一个外设前,必须调用以下一个函数来使能它的时钟:
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_PPPx,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_PPPx,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_PPPx,ENABLE);
2.可以调用函数PPP_Deinit(..)来把外设PPP的所有寄存器复位为缺省值:
PPP_DeInit(PPP)
3.在外设设置完成以后,继续修改它的一些参数,可以参照如下步骤:
PPP_InitStucture.memberX=valX;
PPP_InitStructure.memberY=valY;/*whereXandYaretheonlymembersthatuserwantstomodify*/
PPP_Init(PPP,&PPP_InitStructure);
1)此次课设中GPIO的配置
voidSTEPMotor_GPIO_Config(void)
{
GPIO_InitTypeDefGPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_12|GPIO_Pin_13;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOB,&GPIO_InitStruct);
}
选用端口为PB的PB0,PB1,PB12,PB13。
频率为50MHz,
输出模式为推挽输出。
2)主程序
#include"stm32f10x.h"//头文件
voidGPIO_Config(void);//声明函数
voidUsart_Config(void);//声明函数
voiddelay(uint16_tz);//声明函数
voidNVIC_Config(void);//声明函数
u8Receive;
intmain()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOA
|RCC_APB2Periph_GPIOB
|RCC_APB2Periph_AFIO|RCC_APB2Periph_USART1,ENABLE);//打开相应的时钟使能
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//打开TIM4的时钟使能
GPIO_Config();//调用函数
Usart_Config();//调用函数
GPIO_Config();//调用函数
NVIC_Config();//调用函数
while
(1)
{
}
}
voiddelay(uint16_tz)//延时函数
{
uint16_ti=0;
while(z--)
{
for(i=0;i<1000;i++);//1毫秒
}
}
voidUsart_Config(void)//设置串口
{
USART_InitTypeDefUSART_InitStruct;//声明结构体
USART_InitStruct.USART_BaudRate=9600;//给结构体赋值
USART_InitStruct.USART_WordLength=USART_WordLength_8b;
USART_InitStruct.USART_StopBits=USART_StopBits_1;
USART_InitStruct.USART_Parity=USART_Parity_No;
USART_InitStruct.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_Init(USART1,&USART_InitStruct);//初始化
USART_Cmd(USART1,ENABLE);//使能
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//中断
}
voidGPIO_Config(void)
{
GPIO_InitTypeDefGPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOB,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_All;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOC,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_All;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOD,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init(GPIOA,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStruct);
}
voidNVIC_Config(void)//设置中断
{
NVIC_InitTypeDefNVIC_InitStruct;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStruct.NVIC_IRQChannel=USART1_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStruct);
}
中断it.c里面的程序
voidSysTick_Handler(void)
{
}
uint8_tdat=0;
uint8_tflag=0;
voidUSART1_IRQHandler(void)
{
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
dat=USART_ReceiveData(USART1);
if((dat=='O')&&(flag==0))
{
flag++;
}
if((dat=='N')&&(flag==1))
{
flag++;
}
if(flag==2)
{
switch(dat)
{
case'A':
GPIO_Write(GPIOD,0XAA00);break;//实现前进后退等四个方向.前进
case'B':
GPIO_Write(GPIOD,0X5500);break;//后退
case'C':
GPIO_Write(GPIOD,0X8800);break;//左转
case'D':
GPIO_Write(GPIOD,0X2200);break;//右转
case'F':
GPIO_Write(GPIOD,0x0000);break;////停止
default:
break;/////灯翻转
}
flag=0;
}
}
第四章心得与体会
为期一周的创新学分训练马上就要结束了,此次实训我做的题目是蓝牙智能小车。
简单地说就是通过STM32微控制器通过蓝牙控制小车运动。
实现这个功能主要是通过编写单片机程序然后传送到STM32芯片中,控制电机的运动。
所以此次实训的主要目的就是编写程序然后调试程序。
刚开始的时候,老师就带着我们熟悉编程序的软件,并且告诉我们一定要养成良好的代码风格,并且让我们熟悉掌握外设的初始化和设置,这个是编写程序的基础吧,如果不按照外设初始化和设置的步骤来编写程序,程序就无法正常运行,就算运行了也无法实现正确的功能,所以对于我这个初学者来说,这是很好的经历,可以在调试程序或者是修改程序的时候少走弯路。
老师给我们讲解了流水灯,中断,串口等等程序之后,我对编写程序也比较熟练了,然后就是自己把程序下载到单片机上,让小车去寻迹,根据小车出现的问题去改变参数,调试程序,最后让小车可以稳定的运行。
在硬件系统设计成功的前提下,通过分析步进电机的工作特点和STM32产生PWM信号的原理,系统通过不断调整控制各步进电机的PWM信号的频率,实现了多步进电机在目标位置不同的情况下,能够同时启动、加速、高速、减速和制动的同步协调工作,达到了系统的要求。
此次课设基本要求实现了,并且锻炼了自己的动手能力,养成了良好的代码风格,对于STM32也有了一定的了解,可以编写一些简单的程序了,对于我来说这是很大的一个突破。
在编写程序时,也学会了看参考手册,以和查找相应参数的方法。
这次实训学到了不少东西,这和我自己的努力有关,这个更离不开老师们的细心指导和教学,在此感谢指导我一个月的两位学长,你们辛苦了,非常感谢。
参考资料
1.《STM32库开发实战指南》刘火良杨森编著,机械工业出版社
2.《STM32快速上手》陈志旺,机械工业出版社
电气学院创新设计评审意见表
图面和其它成绩:
(20)
指导教师评语:
(40)
①该组学习态度(认真较认真不认真)
②该组依赖他人进行设计情况(有无)
③该组设计有无创新点(有无)
该组电路设计情况(未实现实现创新)
该组程序设计情况(未实现实现创新)
指导教师签字:
年月日
答辩小组评语:
(20)
①设计巧妙,实现设计要求,并有所创新。
②设计合理,实现设计要求。
③实现了大部分设计要求。
④没有完成设计要求,或者只实现了一小部分的设计要求。
答辩成绩:
组长签字:
年月日
创新设计综合成绩:
(20)
答辩小组成员签字:
年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 蓝牙 智能 小车
![提示](https://static.bdocx.com/images/bang_tan.gif)