通行闸机2(HAL库)
文章目录
- 通行闸机2(HAL库)
- 必看
-
- 一、我们需要用stm32cubeMX进行项目相关配置。
- 硬件设计
- 软件设计
-
- 5、 进行接下来 HC—SR04超声波 的选择与配置,这里我们选择GPIOA-Pin11(HCSR04_TRIG1),GPIOA-Pin12(HCSR04_TRIG2)
- 6、 接下来 es08a舵机 进行GPIO口的选择与配置,这里我们选择GPIOB-Pin6。
- 7、 接下来 红外遥控模块 进行GPIO口的选择与配置,这里我们选择GPIOA-Pin3。
- 8、 这里我也开启了USART1串口,用来输出到电脑上
- 9、 接下来我们进行项目相关信息的设置,这里我们可以进行项目名称,项目保存地址,开发环境的选择
- 二、MDK5中的代码编写
-
- 超声波测距代码:
-
- HCSR04.c
- HCSR04.h
- es08a舵机旋转 模拟开门关门代码
- 红外遥控 代码
-
- HW_remote.c
- HW_remote.h
- 串口一,在usart.c文件中添加下面函数
- 最后,在给大家main.c的代码
-
- main.c
- STM32-通行闸机1
- 完整效果
必看
说明,文章分为两部分,先看另一篇文章
另一部分在—》通行闸机1(STM32HAL库)
一、我们需要用stm32cubeMX进行项目相关配置。
具体详情请看----》STM32通行闸机1(HAL库)
硬件设计
- 两个超声波模块
- 一个红外遥控
- 一个红外避障
- 一个舵机(接CH340的5v引脚,单独供电)
- 一个0.96寸OLED屏幕
- 一个STM32F103C8T6
- 一个CH340
- 一个ST-Link v2
软件设计
- 使用了TIM1_CH1、TIM2_CH1、TIM3_CH1、TIM4_CH1
- 使用了USART1
- 模拟IIC
5、 进行接下来 HC—SR04超声波 的选择与配置,这里我们选择GPIOA-Pin11(HCSR04_TRIG1),GPIOA-Pin12(HCSR04_TRIG2)
13、选择GPIOA-Pin11,GPIOA-Pin12引脚,点击进行设置
14、将引脚功能设置为输出模式
15、点击GPIOA-Pin11,GPIOA-Pin12,看图设置
16、设置别名GPIOA-Pin11(HCSR04_TRIG1),GPIOA-Pin12(HCSR04_TRIG2)
配置PA0(TIM2CH1)给超声波1的ECHO口
配置PA6(TIM3CH1)给超声波2的ECHO口
设置别名
6、 接下来 es08a舵机 进行GPIO口的选择与配置,这里我们选择GPIOB-Pin6。
7、 接下来 红外遥控模块 进行GPIO口的选择与配置,这里我们选择GPIOA-Pin3。
我们需要使用定时器TIM1_CH1
8、 这里我也开启了USART1串口,用来输出到电脑上
9、 接下来我们进行项目相关信息的设置,这里我们可以进行项目名称,项目保存地址,开发环境的选择
注意:选择生成路径时,不能有中文路径
点击生成 GENERATE CODE后会生成项目文件,生成后界面如下图。
在这里,我们可以直接点击OPEN PROJECT,也可以在项目创建目录下打开
接下来给大家介绍第二种从创建目录下打开的方法。
二、MDK5中的代码编写
我们首先需要了解文件夹结构
我们需要在Core文件夹中添加自定义的文件,添加教程在 通行闸机1 中
这是完整的文件样式,图一,图二,图三
(图一)
(图二)
(图三)
完成后,我们打开MDK-ARM文件,打开项目工程
超声波测距代码:
由于代码过于多,这里就直接给到大家,将下面的代码添加到HCSR04.c
HCSR04.c
#include "stm32f1xx_hal.h"
#include "HCSR04.h"
float distant1; //测量距离
float distant2; //测量距离
uint32_t measure_Buf1[3] = {
0}; //存放定时器计数值的数组
uint32_t measure_Buf2[3] = {
0}; //存放定时器计数值的数组
uint8_t measure_Cnt1 = 0; //状态标志位
uint8_t measure_Cnt2 = 0; //状态标志位
uint32_t high_time1; //超声波模块返回的高电平时间
uint32_t high_time2; //超声波模块返回的高电平时间
//===============================================读取距离
void SR04_GetData1(void)
{
switch (measure_Cnt1){
case 0:
TRIG1_H;
delay_us(30);
TRIG1_L;
measure_Cnt1++;
__HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1); //启动输入捕获 或者: __HAL_TIM_ENABLE(&htim5);
break;
case 3:
high_time1 = measure_Buf1[1]- measure_Buf1[0]; //高电平时间
distant1=(high_time1*0.034)/2; //单位cm
printf("\r\n-超声波1检测距离为-%.2f-cm-\r\n",distant1);
measure_Cnt1 = 0; //清空标志位
TIM2->CNT=0; //清空计时器计数
break;
}
HAL_Delay(100);
}
//===============================================读取距离
void SR04_GetData2(void)
{
switch (measure_Cnt2){
case 0:
TRIG2_H;
delay_us(30);
TRIG2_L;
measure_Cnt2++;
__HAL_TIM_SET_CAPTUREPOLARITY(&htim3, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);
HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_1); //启动输入捕获 或者: __HAL_TIM_ENABLE(&htim5);
break;
case 3:
high_time2 = measure_Buf2[1]- measure_Buf2[0]; //高电平时间
distant2=(high_time2*0.034)/2; //单位cm
printf("\r\n-超声波2检测距离为-%.2f-cm-\r\n",distant2);
measure_Cnt2 = 0; //清空标志位
TIM3->CNT=0; //清空计时器计数
break;
}
HAL_Delay(100);
}
//===============================================us延时函数
void delay_us(uint32_t us)//主频72M
{
uint32_t delay = (HAL_RCC_GetHCLKFreq() / 4000000 * us);
while (delay--)
{
;
}
}
由于代码过于多,这里就直接给到大家,将下面的代码添加到HCSR04.h
HCSR04.h
#ifndef __HCSR04_H
#define __HCSR04_H