基于STM32的智能循迹小车的设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
燕山大学
课程设计说明书
题目:基于STM32的智能循迹小车的设计
学
说明:此表一式四份,学生、指导教师、基层教学单位、系部各一份。
年月日
基于STM32的智能循迹小车的设计
贺红红
理学院12级智能传感器
摘要:主要分析了基于STM32的小车控制系统的设计过程,此系统主要包括STM32控制器、按键控制电路、电机驱动电路、红外探测电路等。
以STM32为主控芯片及其外围扩展电路实现系统整体功能,用红外探测电路实现小车循迹功能,小车速度由PWM波控制,控制电动小车的速度及转向,从而使小车顺利通过直线,虚线,十字路口,S弯,实现循迹功能。
在硬件设计的基础上实现了电机控制功能,LED显示功能,以及小车简单循迹的软件设计方案。
关键字:STM32 电机传感器 PWM KEIL
Design of intelligent tracking car based on STM32
Abstract:.Mainly analyzes the design process of the car control system based on STM32, this system mainly includes the STM32 controller, button control circuit, motor drive circuit, infrared detection circuit, etc. STM32 as main control chip and extend the peripheral circuit to realize the whole system function, the function of infrared detection circuit is used to implement the car tracking, vehicle speed is controlled by a PWM wave, control the speed of the electric car and steering, which makes the car pass straight line, dotted line, intersection, S bending, realize the tracking function. On the basis of the hardware design to realize the function of motor control, LED display function, and software design scheme of simple car tracking.
Keywords:STM32、The motor、The sensor、PWM、KEIL.
学习目的
1.学习STM32工作原理及使用方法;
2. 学习计算机程序设计;
3. 学习编程并掌握软件调试。
二〇二二年四月二十五日
学习软件
Keil uVision、串口猎人
学习任务
学会利用STM32和红外线传感器设计智能循迹小车
一、引言
智能车辆作为智能交通系统的关键技术之一,是许多高新技术综合集成的载体。
它体现了车辆工程、人工智能、自动控制及计算机技术于一体的综合技术,是未来汽车发展的趋势。
本文提出了一个基于STM32芯片为控制核心,附以红外传感器采集外界信息的智能小车系统设计方案。
充分利用该芯片高速运算、处理能力,来实现小车自动识别路线按迹行走,自带的PWM输出功能,调节占空比来调节电机的转速。
通过模糊控制和PWM脉宽调制技术的结合,提高了对车位置控制精度。
智能循迹小车组装
组装步骤:
一、第一步:电路部分基本焊接
二、电路焊接部分比较简单,焊接顺序按照元件高度从低到高的原则,首先焊接8个电阻,
焊接时可用万用表确认阻值是否正确,焊接有极性的元件如三极管、LED指示灯、电解电容、芯片务必分清楚极性尽量参考图片的元件方向焊接,焊接时间不能太长否则容易焊坏。
初步焊接完成后请务必细心核对,防止粗
三、提供的小车元器件有小车主板,电机,STM32芯片,红外传感器,电池插座,螺丝螺
母,电池,车轮,排线等。
按照说明书及图片安装小车,其中有一点与说明书不同:按照正常把电机与车轮装在主板上,但是此时,小车前排传感器与电机和车轮较近,这对反应时间有很大的影响,这时我们就会把电机反过来装,这样距离较远,调整反应时间,小车会走的相对较稳。
组装好的小车如下图所示:
图 1.小车正反面
二、传感器检测模块
小车上装有红外传感器,当小车在地面行走时,黑胶带地面对光的反射程度不一样,根据反射光的强弱分辨出是地板还是黑胶带。
黑胶带检测是小车研究中重要的一部分,
红外传感器相当于小车的眼睛,其探测视角小,方向性强,只对红外线具有较高灵敏度,从而避免了外界光线的干扰;跑道黑带能够吸收红外线,而白色跑道能够反射红外线,从而检测到跑道黑带。
因而选用红外传感器作为小车探测器。
图 2.小车检测电路
红外传感器由我们自己焊接完成,其电路如下所示:
+vcc
Inc
发射器接受器
GND
图3.红外传感电路
三、控制器模块
系统采用STM32芯片作为循迹小车的中央控制器,完成传感器信息收集、电机控制、外部扩展等功能。
STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M3内核。
按性能分成两个不同的系列:STM32F103“增强型”系列和STM32F101“基本型”系列。
增强型系列时钟频率达到72MHz,是同类产品中性能最高的产品;基本型时钟频率为36MHz,以16位产品的价格得到比16位产品大幅提升的性能,是
16位产品用户的最佳选择。
两个系列都内置32K到128K的闪存,不同的是SRAM的最大容量和外设接口的组合。
时钟频率72MHz时,从闪存执行代码,STM32功耗36mA,是32位市场上功耗最低的产品,相当于0.5mA/MHz。
本系统的核心控制板是STM32F103的最小系统,它由电源电路、实时时钟、系统时钟电路、JTAG接口电路、复位电路、按键电路、串口电路等组成。
STM32如下图所示:
图 3 STM32芯片图
小车前方装有五个自制的红外传感器,当红外传感器检测到地面黑线时,将该信号发送到STM32芯片,STM32芯片通过控制电机来控制轮子的转速,从而使小车实现直走、转弯、停止等功能。
这样就达到了小车循迹的目的。
四、电机模块
电机是指依据电磁感应定律实现电能的转换或传递的一种电磁装置,或者将一种形式的电能转换成另一种形式的电能。
电动机是将电能转换为机械能(俗称马达),发电机是将机械能转换为电能。
电动机在电路中用字母“M”(旧标准用“D”)表示。
它的主要作用是产生驱动转矩,作为用电器或各种机械的动力源,我们这次使用的是L9110电机,L9110 是为控制和驱动电机设计的两通道推挽式功率放大专用集成电路器件,将分立电路集成在单片 IC 之中,使外围器件成本降低,整机可靠性提高。
该芯片有两个TTL/CMOS 兼容电平的输入,具有良好的抗干扰性;两个输出端能直接驱动电机的正反向运动,它具有较大的电流驱动能力,每通道能通过 800mA 的持续电流,峰值电流能力
可达 1.5A;同时它具有较低的输出饱和压降;内置的钳位二极管能释放感性负载的反向冲击电流,使它在驱动继电器、直流电机、步进电机或开关功率管的使用上安全可靠。
L9110 被广泛应用于玩具汽车电机驱动、脉冲电磁阀门驱动,步进电机驱动和开关功率管等电路上。
下图分别为电路图。
图 4 L9110电机电路图
五、软件编程设计
先分析工作原理和工作要求,利用小车前方的五个红外传感器探测到黑线,然后把信号发送到STM32芯片,STM32芯片通过控制电机来控制轮子的转速,从而使小车实现直走、转弯、停止等功能。
这样就达到了小车循迹的目的。
在这次小车的设计中,要求小车在起点时2秒自起,依次通过转弯,直行,虚线,十字路口,S弯。
分析完要求后,可按照要求编写对应程序,
六、总结
在这为期15天的课程设计中,虽然时间很短,但学到的东西有很多,感触也不少。
首先,同为大三学生,别人却对这方面很有研究,能给我们教授知识,令人佩服,这也激发了大家的斗志。
给大家很大的鼓励。
另外在这次课设中学到的不仅是课本上的知识,更提高了我们的实践能力。
包括焊接、贴片、组装小车等,这些在平时学习跟生活中学不到的东西,让这次课设变得更为生动有趣。
除此之外,整个课设过程中,大家一起努力,大大地提高了自己的动手能力。
虽然课设时间很紧,很忙碌,但这种充实感代替了疲惫感。
学到了很多东西,增强了动手能力。
七、参考资料
[1]《控制电机》杨渝钦
[2]《 STM32系列ARM Cortex-M3微控制器原理与实践》王咏虹徐炜郝立平
[3]《Cortex-M3嵌入式处理器原理与应用》范书瑞
[4] 《电子元器件与实用电路基础》韩广兴
八、附录
void car_stay(void) //小车停止速度
{
left_pwm=0;
right_pwm=0;
leftb_pwm=0;
rightb_pwm=0;
}
void go_stright(void) //小车直行速度
{
left_pwm=40;
right_pwm=40;
leftb_pwm=0;
rightb_pwm=0;
}
void go_stright_slow(void) //小车慢直行速度{
left_pwm=30;
right_pwm=30;
leftb_pwm=0;
rightb_pwm=0;
}
void turn_left_slow(void) //左转大弯速度{
left_pwm=20;
right_pwm=27;
leftb_pwm=0;
rightb_pwm=0;
}
void turn_right_slow(void) //右转大弯速度{
left_pwm=27;
right_pwm=20;
leftb_pwm=0;
rightb_pwm=0;
}
void turn_left_quick(void) //左小弯速度
{
left_pwm=5;
right_pwm=20;
leftb_pwm=0;
rightb_pwm=0;
}
void turn_right_quick(void) //右小弯速度
{
left_pwm=20;
right_pwm=5;
leftb_pwm=0;
rightb_pwm=0;
}
void turn_back(void) //后退速度
{
left_pwm=0;
right_pwm=0;
leftb_pwm=10;
rightb_pwm=10;
}
2.本次设计主程序
/**************************************************** *Name:main.c
*Discribe :
*Libery edition:ST3.5.0
*Writer :FS
****************************************************/ #include "stm32f10x.h"
#include "PWM.h"
#include "key.h"
#include "gpio.h"
#include "xunji.h"
#include "time.h"
/*
* º¯ÊýÃû£ºmain
* ÃèÊö£ºÖ÷º¯Êý
* ÊäÈ룺ÎÞ
* Êä³ö£ºÎÞ
*/
uint8_t left1,left2,mid,right1,right2;
uint16_t left_pwm=0,right_pwm=0,leftb_pwm=0,rightb_pwm=0; uint16_t time=0,final_stay_time=0;
uint32_t delay_time1=0x31450,delay_time2=0x31450;//10£¬100ms
void Delay_2s(void);
void delay_(__IO u32 nCount);
void final_stay(void);
int main(void)
{
KEY_GPIO_Config();
TIM4_PWM_Init();
Infrared_GPIO_Config();
TIM2_NVIC_Configuration();
TIM2_Configuration();
while(1)
{
if(Key_Scan(GPIOC,GPIO_Pin_1)==KEY_ON)
{
Delay_2s();
TIM4->CCR1=20; //左轮占空比改变—寄存器操作
TIM4->CCR3=20; //右轮占空比改变—寄存器操作
break;
}
}
while (1)
{
left2=rd_left2;
left1=rd_left1;
mid=rd_mid;
right1=rd_right1;
right2=rd_right2;
TIM4->CCR1=left_pwm; //左轮占空比改变—寄存器操作
TIM4->CCR3=right_pwm; //右轮占空比改变—寄存器操作
if(mid )
{
go_stright();
}
else
{
if(left1){turn_left_slow();}
else if(left2){turn_left_quick();}
else if(right1){turn_right_slow();}
else if(right2){turn_right_quick();}
else if(left2==1 && left1==1 && right1==1 && right2==1){go_stright_slow();} //11011
else if(left2==1 && left1==0 && right1==1 && right2==1){go_stright_slow();} //10011
else if(left2==1 && left1==1 && right1==0 && right2==1){go_stright_slow();} //11001
else if(left2==1 && left1==1 && right1==1 && right2==0){go_stright_slow();} //11010
else if(left2==0 && left1==1 && right1==1 && right2==1){go_stright_slow();} //01011
else if(left2==1 && left1==0 && right1==1 && right2==0){go_stright_slow();} //10010
else {;}
}
if(left2==0 || right2==0 ) //10101
{
final_stay_time=0;
}
if(final_stay_time>=90)
{
while(1){ TIM4->CCR1=0; TIM4->CCR3=0; }
}
}
}
/************************************************************** 延时程序
**************************************************************/ void delay_(__IO u32 nCount)//延时函数0Xc49或3145大概4秒
{
for(; nCount != 0; nCount--);
}
void Delay_2s(void) //停止函数大概2秒{
__IO u32 nCount=0x5fffff
for(; nCount != 0; nCount--);
}。