[其他ST产品] 通行闸机2(HAL库)

[复制链接]
1638|42
 楼主| 原来是wjc 发表于 2023-6-29 20:28 | 显示全部楼层 |阅读模式
本帖最后由 原来是wjc 于 2023-6-29 20:37 编辑

硬件设计
  • 两个超声波模块
  • 一个红外遥控
  • 一个红外避障
  • 一个舵机(接CH340的5v引脚,单独供电)
  • 一个0.96寸OLED屏幕
  • 一个STM32F103C8T6
  • 一个CH340
  • 一个ST-Link v2
41736649d78c494ab1.png

软件设计
  • 使用了TIM1_CH1、TIM2_CH1、TIM3_CH1、TIM4_CH1
  • 使用了USART1
  • 模拟IIC
42331649d78d3cd2e8.png


 楼主| 原来是wjc 发表于 2023-6-29 20:28 | 显示全部楼层
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)

58937649d78e367f6a.png

39211649d78ec1a155.png
 楼主| 原来是wjc 发表于 2023-6-29 20:29 | 显示全部楼层
配置PA0(TIM2CH1)给超声波1的ECHO口

78721649d7912c34eb.png

57399649d791ae6dd7.png
 楼主| 原来是wjc 发表于 2023-6-29 20:29 | 显示全部楼层
配置PA6(TIM3CH1)给超声波2的ECHO口
57125649d792a44352.png
33003649d7933a6970.png
 楼主| 原来是wjc 发表于 2023-6-29 20:30 | 显示全部楼层
设置别名

61819649d794239c15.png
 楼主| 原来是wjc 发表于 2023-6-29 20:31 | 显示全部楼层
6、 接下来 es08a舵机 进行GPIO口的选择与配置,这里我们选择GPIOB-Pin6。
95290649d798421d9a.png
 楼主| 原来是wjc 发表于 2023-6-29 20:31 | 显示全部楼层
 楼主| 原来是wjc 发表于 2023-6-29 20:31 | 显示全部楼层
7、 接下来 红外遥控模块 进行GPIO口的选择与配置,这里我们选择GPIOA-Pin3。
我们需要使用定时器TIM1_CH1

5340649d79989f71b.png
 楼主| 原来是wjc 发表于 2023-6-29 20:31 | 显示全部楼层
 楼主| 原来是wjc 发表于 2023-6-29 20:31 | 显示全部楼层
8、 这里我也开启了USART1串口,用来输出到电脑上
96186649d79ada62f6.png
 楼主| 原来是wjc 发表于 2023-6-29 20:31 | 显示全部楼层
9、 接下来我们进行项目相关信息的设置,这里我们可以进行项目名称,项目保存地址,开发环境的选择
注意:选择生成路径时,不能有中文路径
62493649d79b91b79c.png
 楼主| 原来是wjc 发表于 2023-6-29 20:32 | 显示全部楼层
 楼主| 原来是wjc 发表于 2023-6-29 20:32 | 显示全部楼层
37439649d79c587a60.png

点击生成 GENERATE CODE后会生成项目文件,生成后界面如下图。

在这里,我们可以直接点击OPEN PROJECT,也可以在项目创建目录下打开

接下来给大家介绍第二种从创建目录下打开的方法。
 楼主| 原来是wjc 发表于 2023-6-29 20:32 | 显示全部楼层
二、MDK5中的代码编写
我们首先需要了解文件夹结构
47774649d79dae88bf.png
86686649d79e3d4086.png
54712649d79ea01e5e.png
 楼主| 原来是wjc 发表于 2023-6-29 20:33 | 显示全部楼层
我们需要在Core文件夹中添加自定义的文件,添加教程在 通行闸机1 中

这是完整的文件样式,图一,图二,图三
95710649d79faf0650.png
 楼主| 原来是wjc 发表于 2023-6-29 20:33 | 显示全部楼层
(图一)
40450649d7a055639a.png
 楼主| 原来是wjc 发表于 2023-6-29 20:33 | 显示全部楼层
(图二)
10886649d7a122080c.png
 楼主| 原来是wjc 发表于 2023-6-29 20:33 | 显示全部楼层
(图三)

完成后,我们打开MDK-ARM文件,打开项目工程
 楼主| 原来是wjc 发表于 2023-6-29 20:33 | 显示全部楼层
超声波测距代码:
由于代码过于多,这里就直接给到大家,将下面的代码添加到HCSR04.c
 楼主| 原来是wjc 发表于 2023-6-29 20:34 | 显示全部楼层
HCSR04.c
  1. #include "stm32f1xx_hal.h"
  2. #include "HCSR04.h"

  3. float distant1;      //测量距离
  4. float distant2;      //测量距离
  5. uint32_t measure_Buf1[3] = {0};   //存放定时器计数值的数组
  6. uint32_t measure_Buf2[3] = {0};   //存放定时器计数值的数组
  7. uint8_t  measure_Cnt1 = 0;    //状态标志位
  8. uint8_t  measure_Cnt2 = 0;    //状态标志位
  9. uint32_t high_time1;   //超声波模块返回的高电平时间
  10. uint32_t high_time2;   //超声波模块返回的高电平时间

  11. //===============================================读取距离
  12. void SR04_GetData1(void)
  13. {
  14. switch (measure_Cnt1){
  15.         case 0:
  16.          TRIG1_H;
  17.          delay_us(30);
  18.          TRIG1_L;
  19.    
  20.                 measure_Cnt1++;
  21.                 __HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);
  22.                 HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);        //启动输入捕获       或者: __HAL_TIM_ENABLE(&htim5);                                                                                                   
  23.         break;
  24.         case 3:
  25.                 high_time1 = measure_Buf1[1]- measure_Buf1[0];    //高电平时间                                               
  26.                 distant1=(high_time1*0.034)/2;  //单位cm
  27.         printf("\r\n-超声波1检测距离为-%.2f-cm-\r\n",distant1);         
  28.                 measure_Cnt1 = 0;  //清空标志位
  29.         TIM2->CNT=0;     //清空计时器计数
  30.                 break;
  31.                                
  32.         }
  33.    HAL_Delay(100);
  34. }
  35. //===============================================读取距离
  36. void SR04_GetData2(void)
  37. {
  38. switch (measure_Cnt2){
  39.         case 0:
  40.          TRIG2_H;
  41.          delay_us(30);
  42.          TRIG2_L;
  43.    
  44.                 measure_Cnt2++;
  45.                 __HAL_TIM_SET_CAPTUREPOLARITY(&htim3, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);
  46.                 HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_1);        //启动输入捕获       或者: __HAL_TIM_ENABLE(&htim5);                                                                                                   
  47.         break;
  48.         case 3:
  49.                 high_time2 = measure_Buf2[1]- measure_Buf2[0];    //高电平时间                                               
  50.                 distant2=(high_time2*0.034)/2;  //单位cm
  51.         printf("\r\n-超声波2检测距离为-%.2f-cm-\r\n",distant2);         
  52.                 measure_Cnt2 = 0;  //清空标志位
  53.         TIM3->CNT=0;     //清空计时器计数
  54.                 break;
  55.                                
  56.         }
  57.    HAL_Delay(100);
  58. }


  59. //===============================================us延时函数
  60.     void delay_us(uint32_t us)//主频72M
  61. {
  62.     uint32_t delay = (HAL_RCC_GetHCLKFreq() / 4000000 * us);
  63.     while (delay--)
  64.         {
  65.                 ;
  66.         }
  67. }




由于代码过于多,这里就直接给到大家,将下面的代码添加到HCSR04.h
您需要登录后才可以回帖 登录 | 注册

本版积分规则

87

主题

1250

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部