STM32智能小车测速.docx
《STM32智能小车测速.docx》由会员分享,可在线阅读,更多相关《STM32智能小车测速.docx(21页珍藏版)》请在冰点文库上搜索。
![STM32智能小车测速.docx](https://file1.bingdoc.com/fileroot1/2023-5/16/00e127af-922d-4106-845a-d796ed050529/00e127af-922d-4106-845a-d796ed0505291.gif)
STM32智能小车测速
课程设计说明书
题目:
基于单片机的测速装置
学院(系):
年级专业:
学号:
学生姓名:
指导教师:
教师职称:
目录
目录1
燕山大学课程设计(论文)任务书2
摘要 3
前言3
一、STM32相关知识介绍4
1.1STM32介绍4
1.2固件库在STM32中的作用4
二、智能小车介绍5
2.1智能小车整体简介5
2.24路红外线探测系统6
2.3PWM测速原理及模块7
2.4L298驱动模块8
三、程序设计9
3.1外设的初始化和设置步骤9
3.2设计流程和思路12
四、心得体会13
五、参考资料14
六、程序附录14
燕山大学课程设计(论文)任务书
院(系):
电气工程学院基层教学单位:
自动化系
学号
学生姓名
专业(班级)
设计
题目
基于单片机的测速装置
设
计
技
术
参
数
1掌握PWM电机调速原理;
2掌握红外测速原理;
3合理设置电机控制周期。
设
计
要
求
1测速装置采用20格光码盘;
2主板选用STM32;
3驱动采用双L298模块。
工
作
量
1、完成设计说明书一份;文稿打印;
2、设计说明书中要绘制原理图、流程图;
2、能够现场根据要求调试参数。
工
作
计
划
第1周:
查阅相关资料,有老师讲授STM32开发版学习;
第2周:
装配电机,实现正常行驶;
第3周:
调试
第4周:
规范化撰写课程设计说明书;最后进行答辩。
参
考
资
料
1直流电机调速原理;
2光电检测技术;
3相应的微处理器原理及应用。
指导教师
签字
基层教学单位主任签字
说明:
此表一式四份,学生、指导教师、基层教学单位、系部各一份。
摘要
本次综合训练是以基于Cortex-M3内核的STM32微控制器为控制工具去控制智能小车去检测黑线进行循迹,同时利用PWM测速原理去检测并传回转速值。
前言
随着科学技术迅猛发展,人们对设备越来越高的应用需要已经无法满足当前和未来高性能的应用与发展需求。
显然,嵌入式系统的软、硬件技术和开发手段,正日益受到重视,成为各领域技术创新的重要基础。
目前,嵌入式系统是近年来发展很快的计算机方面的学科方向,并迅速渗透到控制、自动化、仪器仪表等学科。
嵌入式方向包括了软硬件协同设计、嵌入式体系结构、实时操作系统、嵌入式产品设计等方面的知识,大于当代大学生,更需要掌握嵌入式系统设计的典型开发工具和开发核心技术。
近年来,随着计算机技术及集成电路技术的发展,嵌入式技术日渐普及,在通讯、网络、工控、医疗、电子等领域发挥着越来越重要的作用。
嵌入式系统无疑成为当前最热门最有发展前途的IT应用领域之一。
一、STM32相关知识介绍
1.1STM32介绍
首先Cortex-M3是ARM公司为要求高性能、低成本、低功耗的嵌入式应用专门设计的内核。
STM32系列产品得益于Cortex-M3在架构上进行的多项改进,包括提升性能的同时又提高了代码密度的Thumb-2指令集和大幅度提高中断响应的紧耦合嵌套向量中断控制器,所有新功能都同时具有业界最优的功耗水平。
STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARMCortex-M3内核。
按性能分成两个不同的系列:
STM32F103“增强型”系列和STM32F101“基本型”系列。
增强型系列时钟频率达到72MHz,是同类产品中性能最高的产品;基本型时钟频率为36MHz,以16位产品的价格得到比16位产品大幅提升的性能,是16位产品用户的最佳选择。
两个系列都内置32K到128K的闪存,不同的是SRAM的最大容量和外设接口的组合。
时钟频率72MHz时,从闪存执行代码,STM32功耗36mA,是32位市场上功耗最低的产品,相当于0.5mA/MHz。
1.2固件库在STM32中的作用
STM32固件库是32位基于ARM微控制器STM32F101xx与STM32F103xx的固件函数库。
该函数库是一个固件函数包,它由程序、数据结构和宏组成,包括了微控制器所有外设的性能特征。
该函数库还包括每一个外设的驱动描述和应用实例。
通过使用本固件函数库,无需深入掌握细节,用户也可以轻松应用每一个外设。
因此,使用本固态函数库可以大大减少用户的程序编写时间,进而降低开发成本。
每个外设驱动都由一组函数组成,这组函数覆盖了该外设所有功能。
每个器件的开发都由一个通用API(applicationprogramminginterface应用编程界面)驱动,API对该驱动程序的结构,函数和参数名称都进行了标准化。
所有的驱动源代码都符合“StrictANSI-C”标准(项目于范例文件符合扩充ANSI-C标准)。
因为该固件库是通用的,并且包括了所有外设的功能,所以应用程序代码的大小和执行速度可能不是最优的。
对大多数应用程序来说,用户可以直接使用之,对于那些在代码大小和执行速度方面有严格要求的应用程序,该固件库驱动程序可以作为如何设置外设的一份参考资料,根据实际需求对其进行调整。
二、智能小车介绍
2.1智能小车整体简介
智能小车可以分为三部分——传感器部分、控制器部分、执行器部分。
控制器部分:
接收传感器部分传递过来的信号,并根据事前写入的决策系统(软件程序),来决定机器人对外部信号的反应,将控制信号发给执行器部分。
好比人的大脑。
执行器部分:
驱动机器人做出各种行为,包括发出各种信号(点亮发光二极管、发出声音)的部分,并且可以根据控制器部分的信号调整自己的状态。
对机器人小车来说,最基本的就是轮子。
这部分就好比人的四肢一样。
传感器部分:
机器人用来读取各种外部信号的传感器,以及控制机器人行动的各种开关。
好比人的眼睛、耳朵等感觉器官。
用STM32控制的智能小车作为现代的新发明,是以后的发展方向,他可以按照预先设定的模式在一个环境里自动的运作,不需要人为的管理,可应用于科学勘探等等的用途。
智能小车能够实时显示时间、速度、里程,具有自动寻迹、寻光、避障功能,可程控行驶速度、准确定位停车,远程传输图像等功能。
2.24路红外线探测系统
简介:
此模块是为智能小车、机器人等自动化机械装置提供一种多用途的红外线探测系统的解决方案。
使用红外线发射和接收管等分立元器件组成探头,并使用LM339电压比较器(加入迟滞电路),防止临界输出抖动做为核心器件构成中控电路。
此系统具有的多种探测功能能极大的满足各种自动化。
智能化的小型系统的应用。
应用范围:
智能化轮式车和智能化履带车
1、巡线2、避障3、防跌落
特性:
易于安装。
4路分别独立工作,工作时不受数量限制中控板与探头分开,安装位置不受限制模块高度≤4厘米,安全工作电压范围在4伏特至6伏特之间4路全开工作电流30毫安至40毫安之间。
+5、GND:
电源接线端
IN(1—4)、OUT:
探头与中控板连接端
OUT1、OUT2、OUT3、OUT4:
对应输出端
LED3、LED4、LED6、LED7:
对应输出指示
R17、R18、R19、R20:
对应比较电压调节
输出端为集电极开路,板载4.7千欧上拉电阻
2.3PWM测速原理及模块
ZK-measure测速模块
简介:
此模块是为智能小车、机器人等自动化机械装置。
使用一休化对射红外发射接收管
WYCH206,并使用74HC14(带施密特触发器反向器),防止临界输出抖动做为核心器件构成中控电路。
应用范围:
智能化轮式车和智能化履带车
1、测速(配合编码盘)
留有安装孔易于安装,使用非常简便,灵敏度高。
反应非常迅速。
测试测速模块:
槽型不要有遮挡物,将模块接上电源+5V后用万用表测OUT输出端电压。
此时的电压电压为0.3V左右,D1指示灯亮,当用大于2MM的不透明物体通过槽型光电,OUT输出端电压应接近电源,D1指示灭(表示已检测到物体)。
通过检测得到PWM波,利用STM32对其进行捕获,可以得到编码盘上栅格的频率,进而根据轮子上编码盘的齿数,轮子半径,得到小车轮子的速度。
2.4L298驱动模块
小车直流电机工作电流一般是200-400MA有些更大,如果一个小车是二个轮子,那么总的电流在400-800MA左右,这些电机轮子都是要接受单片机指令执行相应的动作,而市面有的单片机IO口一般只能提供5MA到10MA的电流,直接驱动不了电机,所以需要加一个驱动模块。
放大电流。
驱动采用专业的L298N驱动芯片。
L298N是ST公司生产的一种高电压、大电流电机驱动芯片。
该芯片采用15脚封装。
主要特点是:
工作电压高,最高工作电压可达46V;输出电流大,瞬间峰值电流可达3A,持续工作电流为2A;额定功率25W。
内含两个H桥的高电压大电流全桥式驱动器,可以用来驱动直流电动机和步进电动机、继电器线圈等感性负载;采用标准逻辑电平信号控制;具有两个使能控制端,在不受输入信号影响的情况下允许或禁止器件工作有一个逻辑电源输入端,使内部逻辑电路部分在低电压下工作;可以外接检测电阻,将变化量反馈给控制电路。
使用L298N芯片驱动电机,该芯片可以驱动一台两相步进电机或四相步进电机,也可以驱动两台直流电机。
三、程序设计
3.1外设的初始化和设置步骤
此步骤描述了如何初始化和设置任意外设。
这里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);
可以通过调用一系列函数来使用外设。
每个外设都有各自功能函数。
注:
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;/*whereXandYaretheonly
membersthatuserwantstomodify*/
PPP_Init(PPP,&PPP_InitStructure);
3.2程序设计流程和思路
一、利用对GPIO的控制对小车的四个电机控制使小车直线运行,在对其控制时先用延时函数仿制了一个PWM波,通过更改占空比可以改变小车轮子的速度;
二、通过4路红外探测返回的信号设置switch语句,使小车检测到黑线时自动进行轨迹循迹,这时可以改变占空比参数使其以合适的速度运行;
三、学习定时器中断相关知识,如NVIC初始化,TIM3初始化等,此时把PWM波真正写成,去控制小车轮子转速;
四、改进为使能四个轮子去控制转速;
五、学习串口相关知识后,利用串口中断写成收发数据的程序;
六、加入测速模块,利用定时器3的捕获通道1对PWM波进行捕获,每次捕获后进入中断用USART_SendData发出频率值,通过串口助手可以看到频率,进而得到轮子转速。
四、心得体会
本次综合训练过程中,利用程序控制STM32进而控制智能小车行进。
训练中我们遇到很多的难题,很多东西都是第一次接触,通过老师详细讲解明白大概自己去摸索写程序去控制。
然而坚持就是胜利,最后我们实现了小车循迹和测速。
以前我对于嵌入式的知识学习的还是不太多,经过综合训练后感觉学到很多嵌入式知识。
它还让我学会了如何通过自己的努力去认知一个新事物,更重要的是端正自己的学习态度,只有真正下功夫去学习,才能有收获,正所谓“一份耕耘,一份收获。
”再者,通过本次训练,我也学会了如何去分析问题,如何找出自己设计中的不足,进而去排除解决问题,这就是一个自我学习的过程。
当我们通过实验去学习理论知识时,自己动手得出的结论,不仅能加深我们对嵌入式的理解,更能加深我们对此的记忆。
此次实习学到了很多课内学不到的东西,比如独立思考解决问题,出现差错的随机应变,和与人合作共同提高,都受益非浅。
在此,感谢老师的细心指导,也同样谢谢其他各组同学的无私帮助!
当然,在这其中,我也发现自己的许多不足之处,我相信在以后的学习工作中,我一定会端正自己的学习态度,一丝不苟的去对待每一件事。
只有做好足够的准备,才能事半功倍!
最后再次感谢两位老师的悉心指导!
五、参考资料
1直流电机调速原理;
2光电检测技术;
3相应的微处理器原理及应用;
4STM32库开发指南(刘火良、杨森著)
5、STM32固件库
六、程序附录
#include"stm32f10x.h"
#include"stdio.h"
//重新定义函数如下:
intfputc(intch,FILE*f)
{
USART_SendData(USART1,(unsignedchar)ch);//USART1可以换成USART2等
while(!
(USART1->SR&USART_FLAG_TXE));
return(ch);
}
voidGPIO_Config(void);
voiddelay(u32z);
voidNVIC_Config(void);//嵌套向量中断控制器的配置
voidTIM4_Config(void);//配置定时器43s中断一次
voidPWM_Config(void);
voidPWM(uint16_tleft_up,uint16_tleft_down,uint16_tright_up,uint16_tright_down);//0...1000
voidUSART1_Config(void);
voidTIM3_Config(void);
voidDelayTest(uint16_tz)
{
uint16_ti=0;
while(z--)
{
for(i=0;i<1000;i++);
}
}
voidSendChar(uint8_t*table)
{
uint16_ti=0;
for(i=0;table[i]!
='\0';i++)
{
USART_SendData(USART1,table[i]);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
}
}
intmain()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_USART1|RCC_APB2Periph_AFIO,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4|RCC_APB1Periph_TIM3,ENABLE);
TIM4_Config();
PWM_Config();
GPIO_Config();
USART1_Config();
TIM3_Config();
NVIC_Config();
SendChar("ok");
GPIO_Write(GPIOD,0xAA00);//控制小车前进IN1---IN8
printf("thisisaTDC-GP21module,designedbyYubin\n\r");
while
(1)
{
switch(GPIO_ReadInputData(GPIOC)&0xf000)//只读取PC15--PB12位的数据
{
case0x8000:
PWM(0,0,2000,2000);break;//10001000
case0x4000:
PWM(0,0,1800,1800);break;//10001000
case0x2000:
PWM(1800,1800,0,0);break;//00100010
case0x1000:
PWM(2000,2000,0,0);break;//00100010
default:
PWM(1000,1000,1000,1000);break;
}
}
}
VoidPWM(uint16_tleft_up,uint16_tleft_down,uint16_tright_up,uint16_tright_down)//0...1000
{
TIM_SetCompare1(TIM4,left_up);
TIM_SetCompare2(TIM4,left_down);
TIM_SetCompare3(TIM4,right_up);
TIM_SetCompare4(TIM4,right_down);
}
voidGPIO_Config(void)
{
GPIO_InitTypeDefGPIO_InitStruct;
//PD8----PD15作为IN1-----IN7
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_15|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOD,&GPIO_InitStruct);
//PC12----PC15作为传感器OUT1---OUT4
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOC,&GPIO_InitStruct);
//PB6----PB9作为驱动使能的ENA---ENB
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_AF_PP;
GPIO_Init(GPIOB,&GPIO_InitStruct);
//PA9PA10作为串口输出。
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init(GPIOA,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStruct);
//PA6、PA7作为输入捕获的通道TIM3对应的通道1、2.
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
}
voidNVIC_Config(void)
{
NVIC_InitTypeDefNVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel=TIM3_IRQn;//中断源
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStruct);
}
voidTIM4_Config(void)
{
TIM_TimeBaseIn