stm32f103超声波测距代码
时间: 2023-09-30 14:02:36 浏览: 91
以下是使用STM32F103芯片进行超声波测距的代码示例:
```
#include "stm32f10x.h"
#define TRIG_Pin GPIO_Pin_1
#define ECHO_Pin GPIO_Pin_2
#define TRIG_Port GPIOA
#define ECHO_Port GPIOA
void delay_us(uint32_t time); // 微秒级延时函数
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_OCInitTypeDef TIM_OCInitStruct;
TIM_ICInitTypeDef TIM_ICInitStruct;
uint32_t capture = 0;
float distance = 0;
// 使能GPIOA和TIM2的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
// 配置GPIOA的PA1引脚为推挽输出
GPIO_InitStructure.GPIO_Pin = TRIG_Pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(TRIG_Port, &GPIO_InitStructure);
// 配置GPIOA的PA2引脚为输入模式
GPIO_InitStructure.GPIO_Pin = ECHO_Pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(ECHO_Port, &GPIO_InitStructure);
// 配置TIM2为计数模式
TIM_TimeBaseInitStruct.TIM_Period = 0xFFFF;
TIM_TimeBaseInitStruct.TIM_Prescaler = 71;
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
// 配置TIM2通道2为输入捕获模式
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);
// 配置TIM2通道3为输出比较模式
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStruct.TIM_Pulse = 0;
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC3Init(TIM2, &TIM_OCInitStruct);
while(1)
{
GPIO_ResetBits(TRIG_Port, TRIG_Pin); // 将触发引脚置为低电平
delay_us(2); // 延时2us
GPIO_SetBits(TRIG_Port, TRIG_Pin); // 将触发引脚置为高电平
delay_us(10); // 延时10us
GPIO_ResetBits(TRIG_Port, TRIG_Pin); // 将触发引脚置为低电平
while(!(TIM2->SR & TIM_SR_CC2IF)); // 等待捕获到上升沿
capture = TIM2->CCR2; // 获取上升沿捕获值
TIM2->SR &= ~TIM_SR_CC2IF; // 清除捕获中断标志位
while(!(TIM2->SR & TIM_SR_CC2IF)); // 等待捕获到下降沿
capture = TIM2->CCR2 - capture; // 计算高电平时间差
distance = (float)capture / 58.0; // 计算距离
TIM2->SR &= ~TIM_SR_CC2IF; // 清除捕获中断标志位
// 在这里可以将distance输出到串口或者OLED屏幕上
// ...
delay_us(50000); // 延时50ms
}
}
void delay_us(uint32_t time)
{
uint32_t i;
for(i = 0; i < time * 8; i++);
}
```
上面的代码中,使用了STM32F103的GPIO和TIM2模块实现了超声波测距。其中,PA1引脚用于输出超声波触发信号,PA2引脚用于输入超声波回波信号。TIM2的通道2用于捕获回波信号的上升沿和下降沿,TIM2的通道3用于输出PWM波形。通过计算回波信号的高电平时间差,可以计算出距离。
阅读全文