匿名无线串口使用教程
撰写人 广西大学机器人创新实验基地 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_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
USART_ClockInitTypeDef USART_ClockInitStruct;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_USART2);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_USART2);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA,&GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = bound;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
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;
USART_ClockInitStruct.USART_Clock = USART_Clock_Disable;
USART_ClockInitStruct.USART_CPOL = USART_CPOL_Low;
USART_ClockInitStruct.USART_CPHA = USART_CPHA_2Edge;
USART_ClockInitStruct.USART_LastBit = USART_LastBit_Disable;
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=NVIC_UART2_P;
NVIC_InitStructure.NVIC_IRQChannelSubPriority =NVIC_UART2_S;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_Init(USART2, &USART_InitStructure);
USART_ClockInit ( USART2, &USART_ClockInitStruct );
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
USART_Cmd(USART2, ENABLE);
}
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
|