STM32CUBEMX LL库驱动HC-SR04超声波测距

本文介绍HC-SR04超声波模块的工作原理与STM32微控制器的连接配置方法。该模块能在2cm至700cm范围内实现高精度的距离测量,文中详细展示了使用STM32Cubemx进行测距编程的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


HC-SR资料

1、典型工作用电压:5V
2、超小静态工作电流:小于 5mA
3、感应角度(R3 电阻越大,增益越高,探测角度越大):
R3 电阻为 392,不大于 15 度
R3 电阻为 472, 不大于 30 度
4、探测距离(R3 电阻可调节增益,即调节探测距离):
R3 电阻为 392 2cm-450cm
R3 电阻为 472 2cm-700cm
5、高精度:可达 0.3cm
6、盲区(2cm)超近
HC_SR04电路原理图

HC-SR04时序图

超声模测距模块时序图

一、驱动方式

本产品使用方法:控制口发一个 10US 以上的高电平*[控制口可使用延时函数完成],就可以在接收口等待高电平输出*[判断接收口读取的电平是否处于高电平]。一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离.如此不断的周期测,就可以达到你移动测量的值了。

(1)采用 IO 触发测距,给至少 10us 的高电平信号;
(2)模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回;
(3)有信号返回,通过 IO 输出一高电平,高电平持续的时间就是
(4)超声波从发射到返回的时间.测试距离=(高电平时间*声速(340M/S))/2;

二、接口定义

Vcc:电源正极
Trig(控制端):(GPIO口推挽模式模式)使用ODR寄存器,高低电平切换中延时至少10MS
Echo(接收端):(GPIO口推挽模式模式)使用IDR寄存器,判断引脚是于高电平
Gnd:电源负极\地

三、STM32Cubemx

1、开启GPIO口,输入输出口各一个。输入定义为Echo,输出为Trig
2、开启TIM定时器,TIME=((prescaler[分频器]+1)×(period[周期]+1)/ Timeclock[时钟频率])
3、开启USART串口发送

Printf重定义(示例):

int fputc(int ch,FILE *f)

{

LL_USART_TransmitData8(USART1,ch);

while(!LL_USART_IsActiveFlag_TC(USART1));

return ch;

} 

Trig控制口代码(示例):

void HC_SR()
{
	LL_GPIO_SetOutputPin(GPIOC,Trig_Pin);//置Trig高电平
	LL_mDelay(20);//延时20ms,可以自己切换成10ms
	LL_GPIO_ResetOutputPin(GPIOC,Trig_Pin);//置Trig低电平
}

测距代码

代码如下(示例):

float HC_SRvalue(void)   //
{
    while(LL_GPIO_IsInputPinSet(GPIOC,Echo_Pin)==1);//echo为高电平时,则等待至低电平,才启动超声波
	HC_SR(); //启动超声波			
	while(LL_GPIO_IsInputPinSet(GPIOC,Echo_Pin) == 0);//等待echo的高电平到来	
	LL_TIM_SetCounter(TIM2,0); //清零计数器
	LL_TIM_EnableCounter(TIM2);  //使能定时器2,开始计数
	while(LL_GPIO_IsInputPinSet(GPIOC,Echo_Pin) ==1);//等待echo的高电平结束
    LL_TIM_DisableCounter(TIM2);	//失能定时器2,截止计数	
	count=LL_TIM_GetCounter(TIM2);//count全局变量
    temp=count/1000000*340/2 *100;	//此处单位转换为cm,temp全局变量
/* Private typedef -----------------------------------------------------------*/
}

main代码

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */

  LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_AFIO);
  LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_PWR);

  NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);

  /* System interrupt init*/

  /** NOJTAG: JTAG-DP Disabled and SW-DP Enabled
  */
  LL_GPIO_AF_Remap_SWJ_NOJTAG();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */
//float HC_Value;
  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();//GPIO初始化,由MX自动生成
  MX_USART1_UART_Init();//USART1初始化,由MX自动生成
  MX_TIM2_Init();//TIM2初始化,由MX自动生成
  /* USER CODE BEGIN 2 */
  HC_SRvalue();//HC—SR04测距函数
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
	LL_GPIO_TogglePin(GPIOE,LED_Pin);
	HC_SRvalue();
//	HC_Value=HC_SRvalue();
	LL_mDelay(500);
    printf("distance:%5.2f\r\n ",temp);
	 
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}


总结

无STM32CUBEMX的操作图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值