STM32 Cube MX实现超声波避障工程

STM32 Cube MX实现超声波避障工程

使用STM32 F103C8T6芯片,设计超声波避障小车的算法,工具是STM32 Cube MX生成初始程序,keil v5中添加控制逻辑。小车主要硬件:左右前轮各一个直流电机;一个继电器(条件限制没有焊电路板,采用继电器机械换向)控制左侧电机的通断电;一个超声波模块;一个直流电源(蓄电池,电压保证足够5V输出)。

材料限制,只有一个大电池,杜邦线也稀缺,所以硬件都是糊在上面的。
STM32 Cube MX实现超声波避障工程

|--------------------------------

超声波模块的介绍:

工作原理参考链接:https://blog.****.net/qq_27312943/article/details/51591347

STM32 Cube MX实现超声波避障工程

图 超声波雷达。

具有4个引脚:其中VCC电源一定要接5V,我之前不小心接了3V,超声波雷达是没有返回信号的,即Echo引脚一直低电平。另外,如何判断超声波雷达正常工作了:可以在Echo引脚上外接一个LED灯的正极,LED灯闪烁就说明雷达正常工作了。

|--------------------------------

继电器介绍:
STM32 Cube MX实现超声波避障工程

图 继电器

继电器很简单,在连接电路时,当成一个开关串联进供电电路就可以。继电器控制端有一个“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、新建工程
STM32 Cube MX实现超声波避障工程

图1

电机根据单片机型号建立工程。

2、选择对应STM芯片型号
STM32 Cube MX实现超声波避障工程

图2

我采用的是STM32F103 C8T6,在搜索框中输入你所对应的芯片型号。然后右侧列表中双击后打开新界面:
STM32 Cube MX实现超声波避障工程

图3

3、设置RCC

RCC(Reset Clock Controller)复位与时钟控制器。
STM32 Cube MX实现超声波避障工程

图4

我这里选择高速时钟源为 Crystal/。低速时钟源可选可不选。

4、配置引脚

配置PA1为GPIO Output功能。

配置PA3为GPIO Output功能
STM32 Cube MX实现超声波避障工程

图5

配置PA2为GPIO Input功能。
STM32 Cube MX实现超声波避障工程

图6
STM32 Cube MX实现超声波避障工程

图6-1

给GPIO命名Trig和Echo,方便在代码中管理。

5、设置TIM3定时器

根据前文链接中的超声波测距原理,需要Trig引脚输出一个很短时间20微秒的触发信号(高电平脉冲),因此,利用TIM3定时器实现微秒计时的功能。
STM32 Cube MX实现超声波避障工程

图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.****.net/as480133937/article/details/99201209
STM32 Cube MX实现超声波避障工程

图8

图8中设置的预分频值和重装载值分别为72-1和2-1。这样配置得定时器时基为2微秒
STM32 Cube MX实现超声波避障工程

图9

图9开启TIM3的全局中断NVIC。

6、设置时钟树
STM32 Cube MX实现超声波避障工程

图10

7、代码生成设置
STM32 Cube MX实现超声波避障工程
STM32 Cube MX实现超声波避障工程

图11

图12

8、生成代码
STM32 Cube MX实现超声波避障工程

图13

点击 generate code,

然后点击open project。


(二)、Keil v5添加用户代码:

先简单看一下Cube生成的源码主要的部分:目录 复制
STM32 Cube MX实现超声波避障工程

图14 main()函数

STM32 Cube MX实现超声波避障工程

图15 TIM3中断函数

我们主要编辑的就是上面两个部分。

1、声明用户定义的函数和变量
在这里插入图片描述
STM32 Cube MX实现超声波避障工程

图16

2、距离计算函数的定义
STM32 Cube MX实现超声波避障工程

图17

3、中断函数文件(stm32f10xxx_it.c)中添加计数变量TIM3_Count
STM32 Cube MX实现超声波避障工程
STM32 Cube MX实现超声波避障工程

图18 图19

在中断文件stm32f10xxx_it.c中找到中断函数void TIM3_IRQHandler(void),在其中添加计数,别忘了文件前面的外部变量声明。

4、主函数的while(1)中添加控制逻辑
STM32 Cube MX实现超声波避障工程

图20

|------------------------------------------------------

至此,程序配置结束了,然后编译,选择下载接口,之后下载到开发板中就可以了。硬件电路也要接好。
源码网盘地址:链接:https://pan.baidu.com/s/17k4YIe64x4fJk2uWP7FMuw
提取码:zxmd