#申请原创#
@21小跑堂
超声波测距模块是一种利用超声波的回声效应来检测距离,是通过收发信号的时间差来转化出距离值。
超声波测距模块可分为2类,一类是通过捕捉收发脉冲的时间差,另一类则是配有串行通讯功能,是以指令的方式来启动检测和读取检测值。
这里选用的是后者,见图1和图2所示。
图1 整体构成
图2 核心模块
在使用时,可对串行通讯的波特率进行选择,这里选取的是9600bps,其检测效果如图3所示。
启动检测的指令为:0x55
接收到的是一个4字节的返回值,其中第一和第二字节是检测值,第三字节则是校验码。
以返回值是FF 07 C5 CB 为例,0x7C5 = 1989,即检测值为 1989mm。
检测结果:FF 06 15 1A = 1557 mm
图3 测试结果
在APM32M3514开发板上,是使用串口1来连接超声波测距模块,具体的引脚功能为:
PC4---TX1
PC5---RX1
图4 串口引脚
此外,为了能显示检测值,所用的OLED屏其占用的引脚为:
SCLK----PB0
SDIN----PB10
图5 显示用引脚
对OLED屏所用引脚的配置函数为:
- void OLED_config(void)
- {
- GPIO_Config_T gpioConfig;
- gpioConfig.mode = GPIO_MODE_OUT;
- gpioConfig.outtype = GPIO_OUT_TYPE_PP;
- gpioConfig.speed = GPIO_SPEED_50MHz;
- gpioConfig.pupd = GPIO_PUPD_NO;
- RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_GPIOB);
- gpioConfig.pin = GPIO_PIN_0| GPIO_PIN_10;
- GPIO_Config(GPIOB, &gpioConfig);
- }
为输出高低电平,所定义的语句为:
#define OLED_SCLK_Clr() GPIO_ClearBit(GPIOB, GPIO_PIN_0)
#define OLED_SCLK_Set() GPIO_SetBit(GPIOB, GPIO_PIN_0)
#define OLED_SDIN_Clr() GPIO_ClearBit(GPIOB, GPIO_PIN_10)
#define OLED_SDIN_Set() GPIO_SetBit(GPIOB, GPIO_PIN_10)
接收检测数据并进行显示的中断处理函数为:
- void USART_Receive_Isr(void)
- {
- uint8_t dat;
- uint16_t l;
- if (USART_ReadStatusFlag(MINI_COM1, USART_FLAG_RXBNE) == SET)
- {
- dat = (uint8_t)USART_RxData(MINI_COM1);
- sj[j]=dat;
- j=j+1;
- }
- if(j==4)
- {
- l=sj[1]*256+sj[2];
- OLED_ShowNum(16,4,l,4,16);
- j=0;
- printf("%c", 0x55);
- }
- }
在模拟I2C的方式下,实现距离检测与显示的主程序为:
- int main(void)
- {
- uint8_t dat,i;
- GPIO_Config_T gpioConfig;
- USART_Config_T usartConfig;
- APM_DelayInit();
- GPIO_Init();
- APM_DelayUs(100);
- OLED_Init();
- OLED_Clear();
- OLED_ShowString(0,0,"AMP32M3514",16);
- OLED_ShowString(0,2,"HC04 TEST",16);
- OLED_ShowString(0,4,"L=",16);
- APM_DelayUs(1000);
- APM_MINI_COMInit(COM1);
- RCM_EnableAHBPeriphClock(MINI_COM1_TX_GPIO_CLK | MINI_COM2_TX_GPIO_CLK);
- RCM_EnableAPB2PeriphClock(MINI_COM1_CLK);
- GPIO_ConfigPinAF(MINI_COM1_TX_GPIO_PORT, MINI_COM1_TX_SOURCE, MINI_COM1_TX_AF);
- GPIO_ConfigPinAF(MINI_COM1_RX_GPIO_PORT, MINI_COM1_RX_SOURCE, MINI_COM1_RX_AF);
- gpioConfig.mode = GPIO_MODE_AF;
- gpioConfig.pin = MINI_COM1_TX_PIN;
- gpioConfig.speed = GPIO_SPEED_50MHz;
- gpioConfig.outtype = GPIO_OUT_TYPE_PP;
- gpioConfig.pupd = GPIO_PUPD_PU;
- GPIO_Config(MINI_COM1_TX_GPIO_PORT, &gpioConfig);
- gpioConfig.pin = MINI_COM1_RX_PIN;
- GPIO_Config(MINI_COM1_RX_GPIO_PORT, &gpioConfig);
- usartConfig.baudRate = 9600;
- usartConfig.mode = USART_MODE_TX_RX;
- usartConfig.hardwareFlowCtrl = USART_FLOW_CTRL_NONE;
- usartConfig.parity = USART_PARITY_NONE;
- usartConfig.stopBits = USART_STOP_BIT_1;
- usartConfig.wordLength = USART_WORD_LEN_8B;
- USART_Config(MINI_COM1, &usartConfig);
- USART_EnableInterrupt(MINI_COM1, USART_INT_RXBNEIE);
- NVIC_EnableIRQRequest(MINI_COM1_IRQn, 2);
- USART_Enable(MINI_COM1);
- printf("%c", 0x55);
- while (1);
- }
经检测,其测试效果如图6和图7所示,说明在进入超声波测距模块后是可以运转起来的。
图6 测试效果1
图7 测试效果2
|