STM32F4+超声波+蓝牙(STM32CUBEMX)

智能垃圾桶

这个小东西自己搞着玩,顺便锻炼一下自己。

首先,肯定是配置STM32CUBEMX:

第一步:配置系统时钟

第二步:配置RCC

 第三步:配置时钟

  至于怎么配置时钟建议看看这位大哥的

(59条消息) STM32CubeMX时钟配置详解_ouening的博客-CSDN博客_stm32cubemx时钟配置https://blog.csdn.net/ouening/article/details/79230276

 我这里用的是时钟3,主要是给超声波用的。

第四步:配置超声波

首先是给引脚 我这里是 Trig (PA4)Echo(PA5),他的原理请看图下:

测试距离=(高电平时间*声速(340M/S))/2

下面附上超声波代码

 第六步:配置蓝牙

  我用的蓝牙模块是JDY-31,其实蓝牙的用法和串口差不多的,配置的话也是配置串口:

 我这里用的是串口1,Mode:Asynchronous(异步通信),波特率便是 115200,Data Direction:我选的是接收并发送。

蓝牙配置的话

打开串口调试手(商家配的),用USB转TTL模块 插在电脑进行调配,接线的话和一般串口一样

RX ---------TX

TX -------- RX

随后根据AT指令进行调试即可

 还有一个手机APP用来连接蓝牙的去应用商店 搜 SPP即可。

接下来就是重定向printf 

打开usart.c  

复制上去  记得在 usart.h 文件上也要声明。

最重要的是。。。。。。。一定要加上头文件 #include <stdio.h>,要不然会报错!!!!!

还有就是 手机连上蓝牙之后,电脑就会发不出东西的了》》

第七步:舵机(SG-90)

舵机的话相对简单一点,只需要配置PWM 和调用2个函数就行

打开时钟2 ,选择内部时钟 ,选择通道1 , SG90这个舵机需要一个20ms 的时钟周期,来计算占空比。

.数据:

0.5ms-------------0度; 2.5% 对应函数中占空比为250
1.0ms------------45度; 5.0% 对应函数中占空比为500
1.5ms------------90度; 7.5% 对应函数中占空比为750
2.0ms-----------135度; 10.0% 对应函数中占空比为1000
2.5ms-----------180度; 12.5% 对应函数中占空比为1250
 

这个就是数据手册里面的数据。

可是我自己的项目实际调试中 占空比,比较不正常,有大佬看到的知道原因的话,希望可以告诉小弟一下。。谢谢各位老大!!!

随后调用一个函数 打开 PWM  

 最后一个函数是用来设置占空比的,

 __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,2300);// 我这是  0°

 到这里就配置搞好了,附上总图 

 至于具体代码各位大佬可以在这里下载:

https://github.com/hpjzzh/-smart-trash-canhttps://github.com/hpjzzh/-smart-trash-can

最后:感谢各位大佬观看完!!!小弟是第一次写博客,请大哥们给意见指点一下小弟。

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值