STM32 超声波测距模块HCSR-04 驱动程序

超声波测距原理见:超声波测距原理
超声波测距模块:HC-SR04
采用定时器及外部中断方式

/*******************************************************************************
	Driver for HC-SR04 
  测试平台:STM32F103ZET6最小系统
  引脚连接:TRIG--PC0   ECHO--PC1
*******************************************************************************/
#include "sonar_hcsr04.h"
#include "systime.h"

#define SONAR_PORT  GPIOC
#define TRIG_PIN    GPIO_Pin_0
#define ECHO_PIN    GPIO_Pin_1

static volatile uint32_t measurement;


void hcsr04Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;	
	EXTI_InitTypeDef EXTI_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseInitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);
	
	GPIO_InitStructure.GPIO_Pin = TRIG_PIN;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(SONAR_PORT, &GPIO_InitStructure);

	GPIO_InitStructure.GPIO_Pin = ECHO_PIN;				      
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;		  
	GPIO_Init(SONAR_PORT, &GPIO_InitStructure);	
	GPIO_ResetBits(SONAR_PORT, ECHO_PIN);
	
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource1);  // 中断线以及中断初始化配置
	
	EXTI_ClearITPendingBit(EXTI_Line1);
	
	EXTI_InitStructure.EXTI_Line = EXTI_Line1;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;	
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTI_InitStructure);		

	/* Enable TIM5 clock */
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);

	/* TIME5 base configuration */
	TIM_TimeBaseInitStructure.TIM_Period = 0xFFFF;                   //  计数65536溢出
	TIM_TimeBaseInitStructure.TIM_Prescaler = 72-1;                  // 设置预分频,F=72MHz/72=1MHz,T=1us
	TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;                 // 设置时钟分频系数,不分频
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;  // 向上计数模式
	TIM_TimeBaseInit(TIM5, &TIM_TimeBaseInitStructure);              // 初始化TIME5

	TIM_Cmd(TIM5, DISABLE); 
}

/**
 * 发出测量信号
 */
void hcsr04StartRanging(void)
{
	GPIO_SetBits(SONAR_PORT, TRIG_PIN);
    delay_us(20);   //  The width of trig signal must be greater than 10us
	GPIO_ResetBits(SONAR_PORT, TRIG_PIN);
}

/**
 * 根据公式计算距离 
 * @return distance units:cm 
 */
float hcsr04GetDistance(void)
{
	// distance = measurement/2/1000000*340*100 = measurement/59 (cm)  measurement-units:us  注意单位转换
    float distance = measurement / 58.8;   // measurement-units:us
	
    return distance;
}

static void ECHO_EXTI_IRQHandler(void)
{
	if (EXTI_GetITStatus(EXTI_Line1) != RESET) {
		if (GPIO_ReadInputDataBit(SONAR_PORT, ECHO_PIN) != 0) {  // 等待高电平回波
			TIM_Cmd(TIM5, ENABLE); 	
		} else {
	 		TIM_Cmd(TIM5, DISABLE);  
			measurement = TIM_GetCounter(TIM5);
			TIM_SetCounter(TIM5, 0); 
		}
	}
    EXTI_ClearITPendingBit(EXTI_Line1);
}

void EXTI1_IRQHandler(void)
{
    ECHO_EXTI_IRQHandler();
}



  • 21
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
好的,以下是HCSR04超声波测距模块STM32的C语言代码: ```C #include "stm32f10x.h" #include "stdio.h" #include "delay.h" #define Trig GPIO_Pin_2 #define Echo GPIO_Pin_3 void HC_SR04_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = Trig; 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; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_ResetBits(GPIOA, Trig); } void HC_SR04_Trig(void) { GPIO_SetBits(GPIOA, Trig); delay_us(10); GPIO_ResetBits(GPIOA, Trig); } float HC_SR04_Get_Distance(void) { uint16_t i = 0; float Distance = 0; uint32_t temp = 0; HC_SR04_Trig(); while(GPIO_ReadInputDataBit(GPIOA, Echo) == RESET) { i++; delay_us(1); if(i > 8000) return -1; } TIM_Cmd(TIM2, ENABLE); TIM_SetCounter(TIM2, 0); while(GPIO_ReadInputDataBit(GPIOA, Echo) == SET) { temp = TIM_GetCounter(TIM2); if(temp > 58000) break; } TIM_Cmd(TIM2, DISABLE); Distance = (float)temp / 58.0; return Distance; } int main(void) { float distance = 0; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = 0xFFFF; TIM_TimeBaseStructure.TIM_Prescaler = 71; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); HC_SR04_Init(); delay_init(); while(1) { distance = HC_SR04_Get_Distance(); if(distance != -1) { printf("distance: %.2f cm\n", distance); } delay_ms(500); } } ``` 这段代码使用了STM32的定时器来测量超声波从发送到接收的时间,并通过简单的公式将时间转换为距离。同时,这个例子也演示了如何使用USART向电脑终端输出距离信息。同样需要注意超声波测距模块STM32的接线,以及Trig和Echo的定义是否正确。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值