ACM32F070开发板配有3个串行口,其引脚分配及波特率设置如下:
UART1 :打印调试串口,支持printf,管脚:A9:Tx、A10:Rx,波特率:115200。
UART2 :用户串口,管脚:A2:Tx、A3:Rx ,波特率:115200。
UART3 :用户串口,管脚:B10:Tx、B11:Rx,波特率: 9600。
充分利用好这些串口,可控制各种串口设备和器件来有效地扩展系统的功能。
这里以一款串口控制的超声波距离检测模块为例来介绍串口的使用,所使用的是UART2,其线路构成如图1所示。
图1 线路构成
该测距模块的使用方法是,以串口发送采集指令“0x55”,则可接收到一个4字节的反馈数据。
设反馈数据的数据为:“FF 07 A1 A7”,则0x FF 为引导符,0x07 为距离的高位数值,0xA1 为距离的低位数值,0xA7是校验码。
其中校验码的计算方法为: SUM=A7=(0x07+0xA1+0Xff)&0x00ff
距离值0x07A1转换成十进制则是 1953,其单位是毫米。
该测距模块的最近检测距离约 21cm,最远检测距离约 600cm。
在串口调试工具的帮助,可直接对测距模块进行检测,其测试结果如图2所示。
图2 串口测试
在OLED屏的配合下,实现图3和图4所示检测效果的主程序如下:
int main(void)
{
int l;
uint8_t gu8_TxBuffer1[1]={0X55};
uint8_t gu8_RxBuffer1[5];
System_Init();
Uart_Init(9600);
app_OLED_Init();
OLED_Init();
OLED_Clear();
OLED_ShowString(0,0,"ACM32F070 ",16);
OLED_ShowString(0,2,"OLED & DYP_A06 ",16);
OLED_ShowString(0,4,"distance:",16);
OLED_ShowString(48,6,"(mm)",16);
HAL_UART_Transmit(&Uart2_Handle, gu8_TxBuffer1, 1, 0);
while(1)
{
HAL_UART_Receive(&Uart2_Handle, gu8_RxBuffer1, 4, 200);
if(gu8_RxBuffer1[0]==0XFF)
{
l=gu8_RxBuffer1[1]*256+gu8_RxBuffer1[2];
OLED_ShowNum(0,6,l,4,16);
System_Delay_MS(500);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_3, GPIO_PIN_CLEAR);
gu8_RxBuffer1[0]=0XEE;
gu8_RxBuffer1[1]=0;
gu8_RxBuffer1[2]=0;
HAL_UART_Transmit(&Uart2_Handle, gu8_TxBuffer1, 1, 0);
}
}
}
当然,也可以同功能扩展板上的LCD屏相配合来显示检测结果。
引用: 秦天qintian0303 发表于 2022-11-1 06:54 超声波测距用的探头是哪个频段的?有没有尝试过测气体浓度
哪个频段手头没有相关的资料介绍,要测气体浓度恐怕要求气体对声波的速度影响比较明显才能反映出时间差。