匿名无线串口使用教程
撰写人 广西大学机器人创新实验基地 ROBOT-Z实验室
感谢一位物理学院保研大佬前辈提供技术支持
前言
“匿名无线串口”有什么用?
它是一个方便的无线参数调试工具。
能够解决需要实时传输数据,实时远程观测调参具体效果,查看效果波形的需求,不需要整定一次参数,就重新编译、下载程序,然后再观测效果。
如:无线实时调试移动小车速度PID,实时更改发射机构的参数(力矩,速度,电流)并查看效果。
价格:120¥/个
淘宝连接:
https://item.taobao.com/item.htm?spm=a230r.1.14.16.8093628fK5OcyV&id=624766005093&ns=1&abbucket=20#detail
实例程序使用stm32f407的串口2进行测试
UART2 : PA2 PA3 ------>用于与上位机通信---->波特率使用:500000 TX RX
第一章 移植“无线串口”代码
1.1.移植文件
在代码工程中加入,这四个文件——“无线串口”驱动文件。
下面的值板级支持文件(BSP),根据单片机的情况进行设计。这里用作讲解。
1.2.移植“无线串口”需要的改动。
需要设置:
串口初始化;
串口发送、接收中断;
自定义发送数据函数设置
1.3.串口初始化
波特率:500000,其他参数参看配套文件。这里不做讲解;
void Usart2_init(u32 bound)
{
//GPIO端口设置
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
USART_ClockInitTypeDef USART_ClockInitStruct;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART2时钟
//串口2对应引脚复用映射
GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_USART2); //GPIOA2复用为USART2
GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_USART2); //GPIOA3复用为USART2
//USART2端口配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 ; //GPIOA2 TX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA3
/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //GPIOA3 RX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; //开漏
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA3
//USART2 初始化设置
USART_InitStructure.USART_BaudRate = bound;//波特率设置
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; //收发模式
//配置USART2时钟
USART_ClockInitStruct.USART_Clock = USART_Clock_Disable; //时钟低电平活动
USART_ClockInitStruct.USART_CPOL = USART_CPOL_Low; //SLCK引脚上时钟输出的极性->低电平
USART_ClockInitStruct.USART_CPHA = USART_CPHA_2Edge; //时钟第二个边沿进行数据捕获
USART_ClockInitStruct.USART_LastBit = USART_LastBit_Disable; //最后一位数据的时钟脉冲不从SCLK输出
//Usart2 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;//串口2中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=NVIC_UART2_P;//抢占优先级2
NVIC_InitStructure.NVIC_IRQChannelSubPriority =NVIC_UART2_S; //子优先级0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
USART_Init(USART2, &USART_InitStructure); //初始化串口2
USART_ClockInit ( USART2, &USART_ClockInitStruct );
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启接收相关中断
USART_Cmd(USART2, ENABLE); //使能串口2
}
1.3.1.串口发送中断设置
如图代码所示,文字加以说明。里面的函数名称如无说明,必须一致,不能更改。
Ano_DT.C:
MY_usart.c
1.3.2.串口接收中断设置
对于ORE溢出中断按照着下图处理就可以;接收中断如图讲解。
再下一层到ANO_DT_Data_Receive_Anl_Task()函数不需要深究,是属于“无线串口”的内部驱动文件。
1.3.3.自定义发送变量ANODT_SendF1()设置
根据协议,先设置参数类型,数量,再根据协议进行函数编写。
用以在上位机上查看的自定义数据。
协议:其他具体参看“ANO_XIEYI.xlsx”文件
1.3.4.ANO_DT_Data_Exchange(u8 dT_ms)函数说明
是用户需要每隔1ms时间调用的函数://1ms时间通过定时器,或者系统RTOS进行设定。
ANO_DT_Data_Exchange(u8 dT_ms)函数引用有ANODT_SendF1()函数。
1.4.相关变量说明
分为“32中PID输入参数”以及和“上位机显示的参数”。两者只是相差1000、100倍,其作用顾名思义。
1.4.1.“32中PID输入参数”
32中PID输入参数,如:Ano_Parame.set.pid_att_1level[ROL][KP]
(在PID_Rest()之中,可以进行数值初始化。)
这类变量,是直接带入32的PID参数之中的。
1.4.2.“上位机显示的参数”
上位机上显示的数据变量,如ParValList[PAR_PID_1_P]
1.4.3.两者转换关系
ANO_DT_ParListToParUsed(void)和ANO_DT_ParUsedToParList(void)函数对应转换,有的1000:1,有的100:1,具体参看文件Ano_Parameter.c。
第二章 上位机使用说明
完成上面软件的移植之后,进行如下操作。
2.1.硬件连接
准备两个“匿名无线串口”,一台电脑,一个stm32f407板,两条micro usb数据线——用来供电
2.1.1.电脑端
一个“匿名无线串口”通过micro usb线连接电脑。
需要查看电脑“设备管理器”中的“端口”是否有显示接入,因为有的数据线只能充电,无法进行数据传输。如果发现这个情况,只能换一根数据线(Micro USB公头)这点要检查好!
2.1.2.STM32端
另一个“匿名无线串口”,接上32软件设置的串口引脚,由于“匿名无线串口”的数据线不是杜邦线,所以需要间断焊上杜邦线母头,才可以接入32。
这里我使用的是f407的串口2,所以硬件连接如下:
UART2 : PA2 PA3 ------>用于与上位机通信---->波特率使用:500000 TX RX
然后开发板记得供电,并且开启。
③连接成功,蓝绿灯常亮。(闪烁说明连接不良)
2.2.“数据波形”显示设置步骤
2.2.1.设定端口号、波特率
选择的是连接电脑的“无线串口”的端口。波特率:500000.
2.2.2.设置“高级收码”
具体步骤
First进入第1帧,然后设置好数据的类型;
Second设置好“数据容器设置”的“数据来源”、”数据位置“,
这里由于我们使用的是第1帧来传入13个参数,所以
Third上位机串口接收顺序说明:
第一排数据是1-5
第二排数据是6-10,以此类推,对应这32软件的ANODT_SendF1()函数的参数, 可以看到这里每一帧一共可以带入30个参数,而用不到的参数不必设置。这里只用13个参数,所以14号之后的参数类型就不用管。
2.3.查看“数据波形”
获取变量的值,查看调整效果。
2.3.1.连接串口。
2.3.2.进入“数据波形”
本地例子:32软件上ANODT_SendF1()第一个变量的值设置为常量50,所以显示固定数值50,这里没有任何变化;
调试PID的时候,可以设置PID的参数作为传入的值进行查看。
第三章 PID参数调定方法
PID参数调定方法:向32输入PID值进行调参。
在32代码上的文件都移植完毕,上位机设置好了之后,进行如下操作。
3.1进入“飞控设置”
3.2“读取飞控”
如下图,先“读取飞控”,这里读取的值,就等于32中“上位机显示的参数”,如ParValList[PAR_PID_1_P]。
3.3“写入飞控”
读取成功之后,就可以“写入飞控”,
即在18对PID中输入参数,然后“写入参数”
然后“无线串口”将数据发送给32,在32中把“上位机显示的参数”改变,与此同时,调用ANO_DT_ParListToParUsed(void),把“32中PID输入参数”缩小1000或者100倍。
而我们要用PID中的参数,就是用“32中PID输入参数”作为输入,从而实现PID参数整定。
具体调整效果显示,如调整电机速度pid参数,则可以在ANODT_SendF1()中,加入实际速度的变量,然后通过“数据波形”,就可以看到波形效果了。
第四章 数据保存
最后的变量数据,其实需要在keil上更改烧录后才能真正留在程序之中,在PID参数整定中,参数数值只是临时保存的。
附件
链接:https://pan.baidu.com/s/1BugDKbb3E4iiHCnad5rfTQ
提取码:xyyx