[活动专区] 【AT-START-F405测评】 3、GPIO口 控制HC-SR04

[复制链接]
 楼主| xu@xupt 发表于 2024-6-8 11:22 | 显示全部楼层 |阅读模式
#有奖活动#
目的:使用GPIO控制进行测距,根据测距结果控制LED亮灭
1、设计思路
旨在使用AT32F405的GPIO端口控制HC-SR04超声波传感器,以测量距离。程序包括三个主要部分:系统初始化、传感器初始化、距离测量。以下是详细的设计思路:
1. 包含头文件
- 这些头文件提供了开发板、时钟配置和延迟函数的相关接口。
2. 定义Trig和Echo引脚
- 定义Trig和Echo引脚,分别连接到PA0和PA1。
3. 函数声明
- 声明用于初始化HC-SR04传感器和读取距离值的函数。
4. 主函数`main`
- `system_clock_config()`:配置系统时钟。
- `at32_board_init()`:初始化开发板,设置GPIO等。
- `HCSR04_Init()`:初始化HC-SR04传感器的GPIO引脚。
- 无限循环中调用`HCSR04_Read()`读取距离值,并延迟500毫秒。
5. HC-SR04传感器初始化函数`HCSR04_Init`
- 使用`gpio_init_type`结构体配置GPIO。
- 将Trig引脚(PA0)配置为输出模式,推挽输出,无上下拉,驱动强度为较强。
- 将Echo引脚(PA1)配置为输入模式,无上下拉。
6. 读取距离函数`HCSR04_Read`
- 发送一个10微秒的高电平信号到Trig引脚。
- 等待Echo引脚变高,开始计时。
- 在Echo引脚高电平期间计时,每次递增计时变量,并延迟1微秒。
- 通过公式`distance = (echo_time * 0.034) / 2`计算距离,并返回结果。
2、程序
  1. #include "at32f402_405_board.h"  // 包含AT32F402/405开发板的头文件,提供GPIO控制和初始化等功能
  2. #include "at32f402_405_clock.h"  // 包含AT32F402/405的时钟配置头文件
  3. #include "at32f402_405_delay.h"  // 包含延迟函数的头文件

  4. #define TRIG_PIN GPIO_PINS_0  // 定义Trig引脚为PA0
  5. #define ECHO_PIN GPIO_PINS_1  // 定义Echo引脚为PA1

  6. void HCSR04_Init(void);  // 声明HC-SR04传感器初始化函数
  7. uint32_t HCSR04_Read(void);  // 声明读取HC-SR04传感器数据的函数

  8. int main(void)
  9. {
  10.     system_clock_config();  // 配置系统时钟
  11.     at32_board_init();  // 初始化开发板,设置GPIO等
  12.     HCSR04_Init();  // 初始化HC-SR04传感器的GPIO引脚

  13.     while(1)  // 无限循环
  14.     {
  15.         uint32_t distance = HCSR04_Read();  // 读取距离值
  16.         // 可以在此处使用测得的距离值进行其他操作
  17.         delay_ms(500);  // 延迟500毫秒
  18.     }
  19. }

  20. void HCSR04_Init(void)
  21. {
  22.     gpio_init_type gpio_init_struct;  // 定义一个GPIO初始化结构体

  23.     // 配置Trig引脚为输出
  24.     gpio_init_struct.gpio_pins = TRIG_PIN;  // 设置Trig引脚为PA0
  25.     gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;  // 设置模式为输出
  26.     gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;  // 设置为推挽输出
  27.     gpio_init_struct.gpio_pull = GPIO_PULL_NONE;  // 不使用上拉或下拉
  28.     gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;  // 设置驱动强度为较强
  29.     gpio_init(GPIOA, &gpio_init_struct);  // 初始化PA0引脚

  30.     // 配置Echo引脚为输入
  31.     gpio_init_struct.gpio_pins = ECHO_PIN;  // 设置Echo引脚为PA1
  32.     gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;  // 设置模式为输入
  33.     gpio_init_struct.gpio_pull = GPIO_PULL_NONE;  // 不使用上拉或下拉
  34.     gpio_init(GPIOA, &gpio_init_struct);  // 初始化PA1引脚
  35. }

  36. uint32_t HCSR04_Read(void)
  37. {
  38.     uint32_t echo_time;  // 定义一个变量用于存储Echo信号的高电平持续时间
  39.     uint32_t distance;  // 定义一个变量用于存储计算得到的距离值

  40.     // 发送Trig信号
  41.     gpio_bits_set(GPIOA, TRIG_PIN);  // 设置PA0引脚为高电平
  42.     delay_us(10);  // 延迟10微秒
  43.     gpio_bits_reset(GPIOA, TRIG_PIN);  // 设置PA0引脚为低电平

  44.     // 等待Echo引脚变高
  45.     while(gpio_input_data_bit_read(GPIOA, ECHO_PIN) == RESET);  // 等待PA1引脚变高

  46.     // 开始计时
  47.     echo_time = 0;  // 初始化计时变量
  48.     while(gpio_input_data_bit_read(GPIOA, ECHO_PIN) == SET)  // 当PA1引脚为高电平时
  49.     {
  50.         echo_time++;  // 计时变量递增
  51.         delay_us(1);  // 每次延迟1微秒
  52.     }

  53.     // 计算距离
  54.     distance = (echo_time * 0.034) / 2;  // 距离 = (时间 * 声速(0.034 cm/μs)) / 2

  55.     return distance;  // 返回计算得到的距离值
  56. }

3、效果

c43371c0b1b516b33d7a7d74fa8e8e11

LEDyyds 发表于 2024-6-17 15:41 | 显示全部楼层
这个需要滤波吗
gangong 发表于 2024-10-28 20:15 | 显示全部楼层
分享不错了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

134

主题

751

帖子

3

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

134

主题

751

帖子

3

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