#有奖活动#
目的:使用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、效果
|