[活动]

【APM32M3514开发板测评】+串口通讯与超声波测距

[复制链接]
401|2
手机看帖
扫描二维码
随时随地手机跟帖
jinglixixi|  楼主 | 2025-2-2 21:52 | 显示全部楼层 |阅读模式
#申请原创#
@21小跑堂

超声波测距模块是一种利用超声波的回声效应来检测距离,是通过收发信号的时间差来转化出距离值。
超声波测距模块可分为2类,一类是通过捕捉收发脉冲的时间差,另一类则是配有串行通讯功能,是以指令的方式来启动检测和读取检测值。
这里选用的是后者,见图1和图2所示。
a1a69f835dae7d3bffc69e223ea140d3
图1 整体构成

2cd1061f46850524ba0be472d4afb16a
图2 核心模块

在使用时,可对串行通讯的波特率进行选择,这里选取的是9600bps,其检测效果如图3所示。
启动检测的指令为:0x55
接收到的是一个4字节的返回值,其中第一和第二字节是检测值,第三字节则是校验码。
以返回值是FF 07 C5 CB 为例,0x7C5 = 1989,即检测值为 1989mm。
检测结果:FF 06 15 1A = 1557 mm
ec167c28f397f0d98e8ca1f28f8702d9
图3 测试结果

在APM32M3514开发板上,是使用串口1来连接超声波测距模块,具体的引脚功能为:
PC4---TX1
PC5---RX1
04b19b086cac2c9521d02a623ac7bee3
图4 串口引脚

此外,为了能显示检测值,所用的OLED屏其占用的引脚为:
SCLK----PB0
SDIN----PB10
0472b6ab307d83f9ec47588ea6f7b7f2
319f9978803fd2ca77587b7727180324
图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所示,说明在进入超声波测距模块后是可以运转起来的。
e92b9d124960ed2c3e190b79ff375b72
图6 测试效果1

603e90fe88d081bd8dc123df729fb3b6
图7 测试效果2


使用特权

评论回复
呐咯密密| | 2025-2-10 10:54 | 显示全部楼层
这是汽车上面的倒车雷达吗

使用特权

评论回复
jinglixixi|  楼主 | 2025-2-10 11:20 | 显示全部楼层
呐咯密密 发表于 2025-2-10 10:54
这是汽车上面的倒车雷达吗

应该是

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

474

主题

2816

帖子

38

粉丝