#申请原创#
@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
|