STM32 Cube MX实现超声波避障工程
使用STM32 F103C8T6芯片,设计超声波避障小车的算法,工具是STM32 Cube MX生成初始程序,keil v5中添加控制逻辑。小车主要硬件:左右前轮各一个直流电机;一个继电器(条件限制没有焊电路板,采用继电器机械换向)控制左侧电机的通断电;一个超声波模块;一个直流电源(蓄电池,电压保证足够5V输出)。
材料限制,只有一个大电池,杜邦线也稀缺,所以硬件都是糊在上面的。
|--------------------------------
超声波模块的介绍:
工作原理参考链接:https://blog.csdn.net/qq_27312943/article/details/51591347
图 超声波雷达。
具有4个引脚:其中VCC电源一定要接5V,我之前不小心接了3V,超声波雷达是没有返回信号的,即Echo引脚一直低电平。另外,如何判断超声波雷达正常工作了:可以在Echo引脚上外接一个LED灯的正极,LED灯闪烁就说明雷达正常工作了。
|--------------------------------
继电器介绍:
图 继电器
继电器很简单,在连接电路时,当成一个开关串联进供电电路就可以。继电器控制端有一个“IN”引脚,连接开发板,用于控制继电器通断。
|
|
|
下面说一下控制程序:
(一)、Cube MX生成源码:
程序目标:利用超声波雷达的测距功能,实现当障碍物距离小于一定值时,触发继电器断开,使小车原地转向。
用到的芯片功能:(1)GPIO 输入;(2)GPIO输出;(3)TIM3定时器的时基。
引脚分配:主要是配置3各引脚——超声波雷达的Trig、Echo和继电器的IN引脚。其余电源引脚“VCC和GND”按要求接入电路。超声波的VCC接5V;继电器的VCC可以接3V,也可以接5V;一般开发板上会标出对应引脚的电压,我的开发板预留了两个5V接口。
PA1——Trig;
PA2——Echo;
PA3——IN。
Cube软件具有可视化配置单片机的界面,相比配置标准STM32库函数要省心很多,同时也有缺点,Cube生成的程序源码可读性很差,需要多熟悉。
下面是软件中操作步骤:
1、新建工程
图1
电机根据单片机型号建立工程。
2、选择对应STM芯片型号
图2
我采用的是STM32F103 C8T6,在搜索框中输入你所对应的芯片型号。然后右侧列表中双击后打开新界面:
图3
3、设置RCC
RCC(Reset Clock Controller)复位与时钟控制器。
图4
我这里选择高速时钟源为 Crystal/。低速时钟源可选可不选。
4、配置引脚
配置PA1为GPIO Output功能。
配置PA3为GPIO Output功能
图5
配置PA2为GPIO Input功能。
图6
图6-1
给GPIO命名Trig和Echo,方便在代码中管理。
5、设置TIM3定时器
根据前文链接中的超声波测距原理,需要Trig引脚输出一个很短时间20微秒的触发信号(高电平脉冲),因此,利用TIM3定时器实现微秒计时的功能。
图7
TIM3配置选中Internal Clock。
关于定时器如何设置时基的问题,其实也不是很复杂,主要是设置两个值。一个是预分频值prescaler,另一个是重装载值counter period(计数周期)。本文所用芯片的系统频率是72 MHz。下面以一个设置1ms时基的例子说明prescaler和counter period分别取多少:
首先设置prescaler=72-1,即得到计时器的计数频率等于 1 MHz(每秒计数1000 000次);
之后设置计数周期counter
period=1000-1;即从0往上数数,数到999。大家可以想一想,如果你每秒能数1000 000个数,我想让你每隔1 ms报时一次(也就是触发你做一件事),那你的计数周期应该是1000个数。
芯片定时器的计时也是通过不断向上计数,达到计数周期之后会发生一次溢出中断,溢出后会运行一次中断函数中的内容,也就是上面所说的触发你做一件事。
上面说的定时器是我自己的理解,肯定会有不恰当之处。定时器的详细介绍参考链接:https://blog.csdn.net/as480133937/article/details/99201209
图8
图8中设置的预分频值和重装载值分别为72-1和2-1。这样配置得定时器时基为2微秒
图9
图9开启TIM3的全局中断NVIC。
6、设置时钟树
图10
7、代码生成设置
图11
图12
8、生成代码
图13
点击 generate code,
然后点击open project。
(二)、Keil v5添加用户代码:
先简单看一下Cube生成的源码主要的部分:目录 复制
图14 main()函数
图15 TIM3中断函数
我们主要编辑的就是上面两个部分。
1、声明用户定义的函数和变量
在这里插入图片描述
图16
2、距离计算函数的定义
图17
3、中断函数文件(stm32f10xxx_it.c)中添加计数变量TIM3_Count
图18 图19
在中断文件stm32f10xxx_it.c中找到中断函数void TIM3_IRQHandler(void),在其中添加计数,别忘了文件前面的外部变量声明。
4、主函数的while(1)中添加控制逻辑
图20
|------------------------------------------------------
至此,程序配置结束了,然后编译,选择下载接口,之后下载到开发板中就可以了。硬件电路也要接好。
源码网盘地址:链接:https://pan.baidu.com/s/17k4YIe64x4fJk2uWP7FMuw
提取码:zxmd