打印
[活动专区]

【AT-START-F405测评】 3、GPIO口 控制HC-SR04

[复制链接]
3597|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#有奖活动#
目的:使用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、程序
#include "at32f402_405_board.h"  // 包含AT32F402/405开发板的头文件,提供GPIO控制和初始化等功能
#include "at32f402_405_clock.h"  // 包含AT32F402/405的时钟配置头文件
#include "at32f402_405_delay.h"  // 包含延迟函数的头文件

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

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

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

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

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

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

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

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

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

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

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

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

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

3、效果



使用特权

评论回复
沙发
LEDyyds| | 2024-6-17 15:41 | 只看该作者
这个需要滤波吗

使用特权

评论回复
板凳
gangong| | 2024-10-28 20:15 | 只看该作者
分享不错了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

121

主题

713

帖子

3

粉丝