STM32 HAL库 超声波测距C++面向对象版

hc-sr04.c

#ifndef __HCSR04_H__
#define __HCSR04_H__
 
#include "tim.h"
 
#ifdef __cplusplus

class HCSR
{
   public:
	
	void HC04_id_init(char id_);
	void HC_Start();
    void HC_measure();
	float Distance;
   private:
	   
   char id;
   int Edge;
   unsigned  int t1,t2,T;
	  
};


extern HCSR hcsr_04[4];


#endif
void HC_init();
void HC_rise(char id);
void HC_falling(char id);
uint32_t HC_time(char id);
void HC_start(char id);
void TIM1_Delay_us(unsigned short  int n_us);  
#endif

hc-sr04.c

#include "tim.h"
#include "hc-sr04.h"
HCSR hcsr_04[4];


void HC_init(){
	HAL_TIM_Base_Start(&htim3);
	HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_1);
	HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_2);
	HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_3);
	HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_4);
	hcsr_04[0].HC04_id_init(0);
	hcsr_04[1].HC04_id_init(1);
	hcsr_04[2].HC04_id_init(2);
	hcsr_04[3].HC04_id_init(3);
}

void TIM1_Delay_us(uint16_t n_us)
{

	__HAL_TIM_ENABLE(&htim3);
	
	__HAL_TIM_SetCounter(&htim3, 0);
	
	while(__HAL_TIM_GetCounter(&htim3) < ((1 * n_us)-1) );

	__HAL_TIM_DISABLE(&htim3);
}
 
void  HCSR::HC04_id_init(char id_)
{
	id=id_;
}
	
void HCSR::HC_Start()
{	
	HC_start(id);
}
 

void HCSR::HC_measure()
{
	if(Edge == 0)
	{
		t1 = HC_time(id);
		HC_falling(id);
		Edge = 1;
	}
	else if(Edge == 1)
	{
		t2 = HC_time(id);	
		if(t2>t1)
		{
			T = t2 - t1;
		}
		else
		{
			T = t2 - t1 + 65535;
		}
			
		HC_rise(id);
		Distance = T * 0.00001 * 170 * 100 ; 
		Edge = 0;
	}
}


 void HC_falling(char id)
{
	if(id==0){__HAL_TIM_SET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_1,TIM_INPUTCHANNELPOLARITY_FALLING);}
	if(id==1){__HAL_TIM_SET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_2,TIM_INPUTCHANNELPOLARITY_FALLING);}
	if(id==2){__HAL_TIM_SET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_3,TIM_INPUTCHANNELPOLARITY_FALLING);}
	if(id==3){__HAL_TIM_SET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_4,TIM_INPUTCHANNELPOLARITY_FALLING);}
}
void HC_rise(char id)
{
	if(id==0){__HAL_TIM_SET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_1,TIM_INPUTCHANNELPOLARITY_RISING);}
	if(id==1){__HAL_TIM_SET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_2,TIM_INPUTCHANNELPOLARITY_RISING);}
	if(id==2){__HAL_TIM_SET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_3,TIM_INPUTCHANNELPOLARITY_RISING);}
	if(id==3){__HAL_TIM_SET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_4,TIM_INPUTCHANNELPOLARITY_RISING);}
}
uint32_t HC_time(char id)
{
	if(id==0){return HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_1);}
	if(id==1){return HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_2);}
	if(id==2){return HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_3);}
	if(id==3){return HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_4);}
}
void HC_start(char id)
{
	if(id==0)
	{
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
		TIM1_Delay_us(20);	
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
	}
	if(id==1)
	{
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET);
		TIM1_Delay_us(20);
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);
	}
	if(id==2)
	{
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);
		TIM1_Delay_us(20);
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);
	}
	if(id==3)
	{
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_SET);
		TIM1_Delay_us(20);
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_RESET);
	}
}
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
	if((htim->Instance == htim3.Instance) && (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)){hcsr_04[0].HC_measure();}
	if((htim->Instance == htim3.Instance) && (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)){hcsr_04[1].HC_measure();}
	if((htim->Instance == htim3.Instance) && (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3)){hcsr_04[2].HC_measure();}
	if((htim->Instance == htim3.Instance) && (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_4)){hcsr_04[3].HC_measure();}
}

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!对于使用STM32HAL库进行超声波测距,您可以按照以下步骤进行操作: 1. 配置超声波模块的引脚连接:将超声波模块的Trig引脚连接到STM32的一个GPIO输出引脚,将Echo引脚连接到另一个GPIO输入引脚。 2. 初始化GPIO引脚:使用HAL库的相应函数初始化Trig和Echo引脚所对应的GPIO引脚。 3. 发送触发信号:使用HAL库的GPIO输出函数将Trig引脚拉高一段时间(通常为10微秒),然后再拉低。 4. 接收回波信号:使用TIM定时器来测量Echo引脚的高电平持续时间,并将其转换为距离值。 下面是一个简单的示例代码,您可以根据您的具体硬件和需求进行修改: ```c #include "stm32f4xx_hal.h" #define TRIG_PIN GPIO_PIN_0 #define ECHO_PIN GPIO_PIN_1 void ultrasonic_init(void) { GPIO_InitTypeDef GPIO_InitStruct; // 初始化GPIO引脚 GPIO_InitStruct.Pin = TRIG_PIN; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.Pin = ECHO_PIN; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } float ultrasonic_measure_distance(void) { float distance; uint32_t pulse_width; // 发送触发信号 HAL_GPIO_WritePin(GPIOA, TRIG_PIN, GPIO_PIN_SET); HAL_Delay(10); HAL_GPIO_WritePin(GPIOA, TRIG_PIN, GPIO_PIN_RESET); // 等待Echo引脚变为高电平 while (HAL_GPIO_ReadPin(GPIOA, ECHO_PIN) == GPIO_PIN_RESET); // 使用TIM定时器测量高电平持续时间 HAL_TIM_Base_Start(&htim2); __HAL_TIM_SetCounter(&htim2, 0); while (HAL_GPIO_ReadPin(GPIOA, ECHO_PIN) == GPIO_PIN_SET); pulse_width = __HAL_TIM_GetCounter(&htim2); // 根据超声波传播速度计算距离 distance = pulse_width * 0.0343 / 2; return distance; } ``` 请注意,上述代码仅提供了一个基本的框架,您可能需要根据具体的硬件和需求进行适当的修改和调整。此外,您还需要根据您的开发板选择正确的GPIO引脚和TIM定时器。 希望这可以帮助到您!如有任何问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值