基于stm32f103rct6的超声波测距代码
时间: 2023-10-09 10:16:04 浏览: 31
以下是基于stm32f103rct6的超声波测距代码的参考实现。需要注意的是,本代码仅供参考,具体实现应根据硬件和应用场景进行调整和优化。
```c
#include "stm32f10x.h"
#define TRIG_PIN GPIO_Pin_12 // 超声波发射引脚
#define ECHO_PIN GPIO_Pin_13 // 超声波接收引脚
#define TIMER_PRESCALER 72 // 定时器预分频器
#define SOUND_SPEED 340 // 声速,单位:m/s
void delay_us(uint32_t us)
{
SysTick->LOAD = 9 * us; // 设置定时器重载值,每个计数器时钟为9MHz
SysTick->VAL = 0x00; // 清空当前值寄存器
SysTick->CTRL = SysTick_CTRL_ENABLE_Msk; // 启用定时器
while((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0); // 等待定时器计数完成
SysTick->CTRL = 0; // 关闭定时器
}
float measure_distance()
{
GPIO_SetBits(GPIOA, TRIG_PIN); // 设置发射引脚高电平
delay_us(10); // 发射引脚需保持高电平超过10us
GPIO_ResetBits(GPIOA, TRIG_PIN); // 设置发射引脚低电平
TIM_Cmd(TIM2, ENABLE); // 启用定时器2
while(GPIO_ReadInputDataBit(GPIOA, ECHO_PIN) == RESET); // 等待接收引脚变为高电平
TIM_SetCounter(TIM2, 0); // 重置定时器计数器
while(GPIO_ReadInputDataBit(GPIOA, ECHO_PIN) == SET); // 等待接收引脚变为低电平
TIM_Cmd(TIM2, DISABLE); // 关闭定时器2
float elapsed_time = TIM_GetCounter(TIM2) * 1.0 / (72 * 1000000); // 计算超声波行程时间
float distance = elapsed_time * SOUND_SPEED / 2; // 计算距离,除以2是因为超声波是双向传播的
return distance;
}
int main(void)
{
// 初始化GPIOA和TIM2
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_ICInitTypeDef TIM_ICInitStruct;
GPIO_InitStructure.GPIO_Pin = TRIG_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = ECHO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM2, ENABLE);
TIM_TimeBaseInitStruct.TIM_Period = 0xFFFF;
TIM_TimeBaseInitStruct.TIM_Prescaler = TIMER_PRESCALER - 1;
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
TIM_ICInitStruct.TIM_Channel = TIM_Channel_2;
TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStruct.TIM_ICFilter = 0x0;
TIM_ICInit(TIM2, &TIM_ICInitStruct);
float distance;
while(1)
{
distance = measure_distance();
// 处理测量结果
}
}
```
在本例中,PA12和PA13分别连接超声波模块的发射和接收引脚。定时器2的通道2连接PA13,用于测量超声波行程时间。通过计算行程时间和声速,可以得到距离。需要注意的是,本例中使用的定时器时钟为72MHz,计数器时钟为9MHz,因此需要根据实际情况调整计时函数 `delay_us()` 的实现。