记学习超声波模块的过程
记学习超声波模块的过程
前几天亲身尝试了可怜的打工生活帮助同学搞了一辆智能车,看着上面要求的指标,我意识到似乎我该学一学超声波模块了。
关于HC-SR04的那些错误尝试(想看HC-SR04教程?请后翻)
当时手里拿的是HC-SR04模块,于是就去查了它的[资料]((2条消息) STM32—驱动HC-SR04超声波测距模块_肥宅快乐博客-CSDN博客_hcsr04超声波测距模块原理),通过CSDN上的一些博客得知它的工作原理之后,我便开始自行操作了。
错误示范
首先,我满怀信心的打开CubeMX,配置了Trig引脚作为输出引脚(下拉),Echo引脚作为输入引脚(下拉)。
接下来,打开一个定时器,纠结了一番后(别问为啥,问就是不会输入捕获。),我打开了定时器中断,别打了别打了,在改了在改了将PSC设置为83,将ARR设置为0,于是美滋滋的得到了一个1us触发一次的中断用于计时。只要在中断回调函数里面每次让一个计时变量加一,就可以做到计时了。
以下内容虽然整体是错误的,但是还是有一点有用的地方的
再接下来,我需要发出一个超过10us的信号来触发模块工作,于是就产生了一个有趣的问题:微秒级延时。在网上找了好多资料都由于我太菜看不懂无果,于是我开始向学姐长求助,从中了解到有一个计数频率等于单片机主频的寄存器,我们可以通过读取其中的值来获得微秒级别的延时。代码如下:
void Delay_us(int n)
{
int a;
a=SysTick->VAL;//读取寄存器的当前值
while(SysTick->VAL-a<84*n);//等待n us
}
好了好了,接下来就是敲一段简单的主函数代码之后享受胜利的喜悦了。
今天学会了超声波模块,真是开心的一天!
屁啦!Debug一下发现距离的值根本不会动啊!
询问了学长,得知是定时器中断的频率太快,这谁受得了啊建议用输入捕获来计时。
于是,我又回去卑微的看了一遍参考手册,加上学长的指导,自己有了一些体会:串口通信真香!
关于US-100的那些事
其实会有以上奇怪的体会还是因为学长满脸嫌弃细心认真的指导:干嘛用那种东西,US-100它不香嘛?
换了US-100之后我发现,串口模式的确很香。
模块拿到手,首先是万年不变的查[资料](US-100超声波模块介绍 - 百度文库 (baidu.com))过程。(PS:请注意观察模块的引脚连线部分内容,一般的串口通信都是Tx连接Rx,Rx连接Tx,而这个模块刚好相反。)
了解了模块的使用方法之后,我便开始操作(梅开二度)了:
首先,打开CubeMX进行引脚的配置,此处需要打开一组串口并使能串口中断以确保收发数据时不会被打断,我用的是USART1。
定义两个变量,一个用来发送触发信号,一个用来接收两个字节的反馈信息:
uint8_t receive[2];//存储接收的数据
double dis;//存储计算得到的距离
char buffer[256];//显示变量所需要的缓冲变量
uint8_t sign=0x55;//触发信号
在正确配置屏幕之后,在循环语句前后敲上以下代码:
/* USER CODE BEGIN WHILE */
u8g2_Setup_ssd1306_128x64_noname_1(&u8g2, U8G2_R0, u8x8_byte_4wire_hw_spi,
u8x8_gpio_and_delay);
u8g2_InitDisplay(&u8g2);
u8g2_SetPowerSave(&u8g2, 0); //u8g2屏幕的初始化
while (1)
{
HAL_UART_Transmit_IT