打印
[活动]

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

[复制链接]
51|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#申请原创#
@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


使用特权

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

本版积分规则

473

主题

2813

帖子

38

粉丝