注意:通篇文章代码类型为英飞凌TC264逐飞开源库代码,对于其他芯片逻辑通用。
vofa+是博主大二为了搞比赛速学的,通篇代码也是那时候写的,现在看代码有很多可以简洁及优化的地方,但不影响使用,就没改。其中PID控制是根据这篇文章[调参神器]使用VOFA+上位机进行PID调参(附下位机代码)-优快云博客改编或抄来的,大家可以看一下这个博主写的博客,会有不一样的体会。
目录
注意:通篇文章代码类型为英飞凌TC264逐飞开源库代码,对于其他芯片逻辑通用。
一.vofa+介绍
vofa+是一个非常强大的上位机神器,对新手小白来说非常友好且非常适用,它不仅可以实现简单的串口数据收发,还可以实现数据转图形的绘制,更有多种控件使得我们与单片机交互更加方便,目前已支持波形图、按钮、状态灯、图片、滑动条、3D立方控件(可更换模型)等,而且还支持个人编写控件,为我们的嵌入式开发带来极大方便。
vofa+官网文档网址:介绍 | VOFA-Plus上位机
https://www.vofa.plus/docs/learning
二.vofa+两种常用数据协议介绍及应用
1.RawData协议
如果您只是想将vofa+当成串口助手使用,选择RawData协议即可实现。
1.下位机函数
无需配置(逐飞库已配置好)
2.vofa+的页面设置

3.使用示例
逐飞库函数示例代码:
(这个是逐飞库里已封装好的函数,括号里第一位是串口号,第二位是发送数据)
uart_write_byte(UART_2, 0x40);
2.FireWater协议
建议仅在通道数量不多、发送频率不高的时候使用。同时注意发送数据的格式,官网上有详细介绍,这里就不赘述了。
1.vofa+的页面设置

2.下位机配置函数代码(以调试串口为例)
uart.c文件
/*
* qz_vofa+.c
*
* Created on: 2024年8月7日
* Author: 33224
*/
#include "zf_common_headfile.h"
#define UART_INDEX (DEBUG_UART_INDEX) // 默认 UART_0 DEBUG_UART_INDEX (UART_2)
#define UART_BAUDRATE (115200) // 默认 115200
#define UART_TX_PIN (DEBUG_UART_TX_PIN) // 默认 UART0_TX_P14_0 DEBUG_UART_TX_PIN (UART2_TX_P10_5)
#define UART_RX_PIN (DEBUG_UART_RX_PIN) // 默认 UART0_RX_P14_1 DEBUG_UART_RX_PIN (UART2_RX_P10_6)
//
//#define UART_INDEX (UART_2) // 默认 UART_0 DEBUG_UART_INDEX (UART_2)
//#define UART_BAUDRATE (DEBUG_UART_BAUDRATE) // 默认 115200
//#define UART_TX_PIN (UART2_TX_P10_5) // 默认 UART0_TX_P14_0 DEBUG_UART_TX_PIN (UART2_TX_P10_5)
//#define UART_RX_PIN (UART2_RX_P10_6) // 默认 UART0_RX_P14_1 DEBUG_UART_RX_PIN (UART2_RX_P10_6)
typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus;
typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;
typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus;
uint8 uart_get_data[200];
uint8 fifo_get_data[200];
uint8 get_data = 0;
uint32 fifo_data_count = 0;
fifo_struct uart_data_fifo;
uint8_t USART_TX_BUF[200];
uint8_t rxIndex = 0;
float ceshi = 0.00;
float data_Get = 0.00;
void UART_INIT(void) //RX在上,TX在下
{
uart_init(UART_INDEX, UART_BAUDRATE, UART_TX_PIN, UART_RX_PIN); // 初始化串口
uart_rx_interrupt(UART_INDEX, 1); // 开启 UART_INDEX 的接收中断
memset(fifo_get_data,0,sizeof(fifo_get_data));//清除buffer
rxIndex = 0;
}
void u1_printf(char* fmt, ...)
{
uint8_t i, j;
va_list ap;
va_start(ap, fmt);
vsprintf((char*)USART_TX_BUF, fmt, ap);
va_end(ap);
i=strlen((const char*)USART_TX_BUF);//此次发送数据的长度
for (j = 0; j <i; j++) // 循环发送数据
{
uart_write_byte(UART_INDEX, USART_TX_BUF[j]);
}
}
//-------------------------------------------------------------------------------------------------------------------
// 函数简介 UART_INDEX 的接收中断处理函数 这个函数将在 UART_INDEX 对应的中断调用
// 参数说明 void
// 返回参数 void
// 使用示例 uart_rx_interrupt_handler();
//-------------------------------------------------------------------------------------------------------------------
void uart_rx_interrupt_handler (void)
{ uint8 Ress;
static uint8_t RxState=0;
if( uart_query_byte(UART_INDEX, &Ress) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
if(Ress==0x23)//
{
memset(fifo_get_data, 0, sizeof(fifo_get_data));
rxIndex=0;
RxState=1;
for(uint8 i=0;i<rxIndex-1;i++)
{fifo_get_data[i]='\0';}
}
else if(RxState==1)
{
if(Ress==0x21)//结束的帧尾
{
RxState=0;
}
else
{
fifo_get_data[rxIndex++]=Ress;//把数据放在数据包内
rxIndex %= USART_REC_LEN;
}
}
}
}
IFX_INTERRUPT(uart0_rx_isr, 0, UART0_RX_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
uart_rx_interrupt_handler(); // 串口接收处理
}
float Get_Data(void) //发送格式:例如:#P1=12.3@!~~~给左P加12.3
{
uint8_t data_Start_Num = 0; // 记录数据位开始的地方
uint8_t data_End_Num = 0; // 记录数据位结束的地方
uint8_t data_Num = 0; // 记录数据位数
uint8_t minus_Flag = 0; // 判断是不是负数
float data_return = 0; // 解析得到的数据
for(uint8_t i=0;i<200;i++) // 查找等号和!的位置
{
if(fifo_get_data[i] == '=') data_Start_Num = i + 1; // +1是直接定位到数据起始位
if(fifo_get_data[i]=='@')
{
data_End_Num = i - 1;
break;
}
}
if(fifo_get_data[data_Start_Num] == '-') // 如果是负数
{
data_Start_Num += 1; // 后移一位到数据位
minus_Flag = 1; // 负数flag
}
data_Num = data_End_Num - data_Start_Num + 1;
if(data_Num == 4) // 数据共4位
{
data_return = (fifo_get_data[data_Start_Num]-48) + (fifo_get_data[data_Start_Num+2]-48)*0.1f +
(fifo_get_data[data_Start_Num+3]-48)*0.01f;
}
else if(data_Num == 5) // 数据共5位
{
data_return = (fifo_get_data[data_Start_Num]-48)*10 + (fifo_get_data[data_Start_Num+1]-48) + (fifo_get_data[data_Start_Num+3]-48)*0.1f +
(fifo_get_data[data_Start_Num+4]-48)*0.01f;
}
else if(data_Num == 6) // 数据共6位
{
data_return = (fifo_get_data[data_Start_Num]-48)*100 + (fifo_get_data[data_Start_Num+1]-48)*10 + (fifo_get_data[data_Start_Num+2]-48) +
(fifo_get_data[data_Start_Num+4]-48)*0.1f + (fifo_get_data[data_Start_Num+5]-48)*0.01f;
}
else if(data_Num == 7) // 数据共7位
{
data_return = (fifo_get_data[data_Start_Num]-48)*1000 + (fifo_get_data[data_Start_Num+1]-48)*100 + (fifo_get_data[data_Start_Num+2]-48)*10 +
(fifo_get_data[data_Start_Num+3]-48) +(fifo_get_data[data_Start_Num+5]-48)*0.1f + (fifo_get_data[data_Start_Num+6]-48)*0.01f;
}
if(minus_Flag == 1) data_return = -data_return;
return data_return;
}
/*
* 根据串口信息进行PID调参
*/
void USART_PID_Adjust(void)
{
data_Get = Get_Data(); //
if(fifo_get_data[0]=='P' && fifo_get_data[1]=='1') //
ceshi = data_Get;
}
//
//
uart.h文件
/*
* qz_vofa+.h
*
* Created on: 2024年8月7日
* Author: 33224
*/
#ifndef CODE_QZ_VOFA__H_
#define CODE_QZ_VOFA__H_
#define USART_REC_LEN 200 //定义最大接收字节数 200
extern uint8 uart_get_data[200]; // 串口接收数据缓冲区
extern uint8 fifo_get_data[200];
extern uint8_t USART_TX_BUF[200];
extern uint8 USART_TX_BUF[USART_REC_LEN]; //发收缓冲,最大USART_REC_LEN个字节.末字节为换行符
extern uint8_t rxIndex;
void UART_INIT(void);
void u1_printf(char* fmt,...);
float Get_Data(void);
void USART_PID_Adjust(void);
extern float ceshi;
#endif /* CODE_QZ_VOFA__H_ */
isr.h中定时器配置
// **************************** PIT中断函数 ****************************
IFX_INTERRUPT(cc60_pit_ch0_isr, 0, CCU6_0_CH0_ISR_PRIORITY)
{
interrupt_global_enable(0); // 开启中断嵌套
pit_clear_flag(CCU60_CH0);
USART_PID_Adjust();
// blue_printf("%.2f,%.2f\n",pitch,yaw);
}
main函数
#include "zf_common_headfile.h"
#include "isr_config.h"
#pragma section all "cpu0_dsram"
int core0_main(void)
{
clock_init(); // 获取时钟频率<务必保留>
debug_init(); // 初始化默认调试串口
UART_INIT();
pit_ms_init(CCU60_CH0,10);
// 此处编写用户代码 例如外设初始化代码等
cpu_wait_event_ready(); // 等待所有核心初始化完毕
while (TRUE)
{
u1_printf("%.2f\n",ceshi_QQ);// 此处编写需要循环执行的代码
}
}
#pragma section all restore
3.代码说明
下位机一直发送ceshi(float类型数据),上位机接收。上位机可以改变ceshi的值并返回给下位机。
补充1:有线收发改无线收发(逐飞蓝牙模块为例)
有线收发改无线收发的原因及好处:
1.我们直接使用DEBUG口用英飞凌下载器联合调试一直连个线对距离有限制,比较难受;
2.我们调速度环的时候拿手上调不符合实际,因为我们的车在地上是有阻力的,故无线调试更符合实际;
3.通过无线调试,我们可以自己写代码控制车的运动,对于图像采集更加友好(某些喜欢通过上位机图像调车的同学)。
故博主在以下函数中做改动,通过逐飞蓝牙ch9141蓝牙模块,实现无线收发调试。(只要搞懂收发逻辑,使用逐飞无线模块一样)。
1.zf_device_bluetooth_ch9141.c函数中
#include "zf_common_debug.h"
#include "zf_common_fifo.h"
#include "zf_driver_gpio.h"
#include "zf_driver_uart.h"
#include "zf_driver_delay.h"
#include "zf_device_type.h"
#include "zf_device_camera.h"
#include "zf_device_bluetooth_ch9141.h"
#include "qz_vofa+.h"
static fifo_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义
static uint8 bluetooth_ch9141_buffer[BLUETOOTH_CH9141_BUFFER_SIZE]; // 数据存放数组
static uint8 bluetooth_ch9141_data = 0; // 数据临时存放变量
//-------------------------------------------------------------------------------------------------------------------
// 函数简介 蓝牙转串口模块 发送数据
// 参数说明 data 8bit 数据
// 返回参数 uint32 剩余发送长度
// 使用示例 bluetooth_ch9141_send_byte(0x5A);
// 备注信息
//-------------------------------------------------------------------------------------------------------------------
uint32 bluetooth_ch9141_send_byte (const uint8 data)
{
uint16 time_count = BLUETOOTH_CH9141_TIMEOUT_COUNT;
while(time_count)
{
if(!gpio_get_level(BLUETOOTH_CH9141_RTS_PIN))
{
uart_write_byte(BLUETOOTH_CH9141_INDEX, data); // 发送数据
break;
}
time_count --;
system_delay_ms(1);
}
return (0 < time_count);
}
uint8_t USART_TX_BUF1[200];
void blue_printf(char* fmt, ...)
{
uint8_t i, j;
va_list ap;
va_start(ap, fmt);
vsprintf((char*)USART_TX_BUF1, fmt, ap);
va_end(ap);
i=strlen((const char*)USART_TX_BUF1);//此次发送数据的长度
for (j = 0; j <i; j++) // 循环发送数据
{
bluetooth_ch9141_send_byte(USART_TX_BUF1[j]);
}
}
//-------------------------------------------------------------------------------------------------------------------
// 函数简介 蓝牙转串口模块 发送数组
// 参数说明 buff 需要发送的数据地址
// 返回参数 len 发送长度
// 使用示例 uint32 剩余未发送的字节数
// 使用示例 bluetooth_ch9141_send_buff(buff, 16);
// 备注信息
//-------------------------------------------------------------------------------------------------------------------
uint32 bluetooth_ch9141_send_buffer (const uint8 *buff, uint32 len)
{
zf_assert(NULL != buff);
uint16 time_count = 0;
while(0 != len)
{
if(!gpio_get_level(BLUETOOTH_CH9141_RTS_PIN)) // 如果RTS为低电平 则继续发送数据
{
if(30 <= len) // 数据分 30byte 每包发送
{
uart_write_buffer(BLUETOOTH_CH9141_INDEX, buff, 30); // 发送数据
buff += 30; // 地址偏移
len -= 30; // 数量
time_count = 0;
}
else // 不足 30byte 的数据一次性发送完毕
{
uart_write_buffer(BLUETOOTH_CH9141_INDEX, buff, len); // 发送数据
len = 0;
break;
}
}
else // 如果RTS为高电平 则模块忙
{
if(BLUETOOTH_CH9141_TIMEOUT_COUNT <= (++ time_count)) // 超出了最大等待时间
{
break; // 退出发送
}
system_delay_ms(1);
}
}
return len;
}
//-------------------------------------------------------------------------------------------------------------------
// 函数简介 蓝牙转串口模块 发送字符串
// 参数说明 *str 要发送的字符串地址
// 返回参数 uint32 剩余发送长度
// 使用示例 bluetooth_ch9141_send_string("Trust yourself.");
// 备注信息
//-------------------------------------------------------------------------------------------------------------------
uint32 bluetooth_ch9141_send_string (const char *str)
{
zf_assert(NULL != str);
uint16 time_count = 0;
uint32 len = strlen(str);
while(0 != len)
{
if(!gpio_get_level(BLUETOOTH_CH9141_RTS_PIN)) // 如果RTS为低电平 则继续发送数据
{
if(30 <= len) // 数据分 30byte 每包发送
{
uart_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, 30); // 发送数据
str += 30; // 地址偏移
len -= 30; // 数量
time_count = 0;
}
else // 不足 30byte 的数据一次性发送完毕
{
uart_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, len); // 发送数据
len = 0;
break;
}
}
else // 如果RTS为高电平 则模块忙
{
if(BLUETOOTH_CH9141_TIMEOUT_COUNT <= (++ time_count)) // 超出了最大等待时间
{
break; // 退出发送
}
system_delay_ms(1);
}
}
return len;
}
//-------------------------------------------------------------------------------------------------------------------
// 函数简介 蓝牙转串口模块 发送摄像头图像至上位机查看图像
// 参数说明 *image_addr 需要发送的图像地址
// 参数说明 image_size 图像的大小
// 返回参数 void
// 使用示例 bluetooth_ch9141_send_image(&mt9v03x_image[0][0], MT9V03X_IMAGE_SIZE);
// 备注信息
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size)
{
zf_assert(NULL != image_addr);
bluetooth_ch9141_send_buffer(camera_send_image_frame_header, 4);
bluetooth_ch9141_send_buffer((uint8 *)image_addr, image_size);
}
//-------------------------------------------------------------------------------------------------------------------
// 函数简介 蓝牙转串口模块 读取函数
// 参数说明 buff 存储的数据地址
// 参数说明 len 长度
// 返回参数 uint32 实际读取字节数
// 使用示例 bluetooth_ch9141_read_buffer(buff, 16);
// 备注信息
//-------------------------------------------------------------------------------------------------------------------
uint32 bluetooth_ch9141_read_buffer (uint8 *buff, uint32 len)
{
zf_assert(NULL != buff);
uint32 data_len = len;
fifo_read_buffer(&bluetooth_ch9141_fifo, buff, &data_len, FIFO_READ_AND_CLEAN);
return data_len;
}
typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus;
typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;
typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus;
//-------------------------------------------------------------------------------------------------------------------
// 函数简介 UART_INDEX 的接收中断处理函数 这个函数将在 UART_INDEX 对应的中断调用
// 参数说明 void
// 返回参数 void
// 使用示例 uart_rx_interrupt_handler();
//-------------------------------------------------------------------------------------------------------------------
void uart2_rx_interrupt_handler (void)
{ uint8 Ress;
static uint8_t RxState=0;
if( bluetooth_ch9141_read_buffer(&Ress, 1)!= RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
if(Ress==0x23)//
{
memset(fifo_get_data, 0, sizeof(fifo_get_data));
rxIndex=0;
RxState=1;
for(uint8 i=0;i<rxIndex-1;i++)
{fifo_get_data[i]='\0';}
}
else if(RxState==1)
{
if(Ress==0x21)//结束的帧尾
{
RxState=0;
}
else {
fifo_get_data[rxIndex++]=Ress;//把数据放在数据包内
rxIndex %= USART_REC_LEN;
}
}
}
}
//-------------------------------------------------------------------------------------------------------------------
// 函数简介 蓝牙转串口模块 串口中断回调函数
// 参数说明 void
// 返回参数 void
// 使用示例
// 备注信息 该函数在 ISR 文件的串口中断程序被调用
// 由串口中断服务函数调用 wireless_module_uart_handler() 函数
// 再由 wireless_module_uart_handler() 函数调用本函数
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_uart_callback (void)
{
uart_query_byte(BLUETOOTH_CH9141_INDEX, &bluetooth_ch9141_data); // 读取串口数据
fifo_write_buffer(&bluetooth_ch9141_fifo, &bluetooth_ch9141_data, 1); // 存入 FIFO
}
//-------------------------------------------------------------------------------------------------------------------
// 函数简介 蓝牙转串口模块 初始化
// 参数说明 void
// 返回参数 uint8 初始化状态 0-成功 1-失败
// 使用示例 bluetooth_ch9141_init();
// 备注信息
//-------------------------------------------------------------------------------------------------------------------
uint8 bluetooth_ch9141_init (void)
{
uint8 return_state = 0;
set_wireless_type(BLUETOOTH_CH9141, bluetooth_ch9141_uart_callback);
fifo_init(&bluetooth_ch9141_fifo, FIFO_DATA_8BIT, bluetooth_ch9141_buffer, BLUETOOTH_CH9141_BUFFER_SIZE);
// 本函数使用的波特率为115200 为蓝牙转串口模块的默认波特率 如需其他波特率请使用上位机修改模块参数
gpio_init(BLUETOOTH_CH9141_RTS_PIN, GPI, 1, GPI_PULL_UP); // 初始化流控引脚
uart_init(BLUETOOTH_CH9141_INDEX, BLUETOOTH_CH9141_BUAD_RATE, BLUETOOTH_CH9141_RX_PIN, BLUETOOTH_CH9141_TX_PIN);
uart_rx_interrupt(BLUETOOTH_CH9141_INDEX, 1);
memset(fifo_get_data,0,sizeof(fifo_get_data));//清除buffer
rxIndex = 0;
return return_state;
}
2.zf_device_bluetooth_ch9141.h函数中
#ifndef _zf_device_bluetooth_ch9141_h_
#define _zf_device_bluetooth_ch9141_h_
#include "zf_common_typedef.h"
//=================================================定义 9141蓝牙 基本配置================================================
#define BLUETOOTH_CH9141_INDEX (UART_2) // 蓝牙模块对应使用的串口号
#define BLUETOOTH_CH9141_BUAD_RATE (115200) // 蓝牙模块对应使用的串口波特率
#define BLUETOOTH_CH9141_TX_PIN (UART2_RX_P10_6) // 蓝牙模块对应模块的 TX 要接到单片机的 RX
#define BLUETOOTH_CH9141_RX_PIN (UART2_TX_P10_5) // 蓝牙模块对应模块的 RX 要接到单片机的 TX
#define BLUETOOTH_CH9141_RTS_PIN (P10_2) // 蓝牙模块对应模块的 RTS 引脚(流控位)
#define BLUETOOTH_CH9141_BUFFER_SIZE (64) // 接收数据的缓冲区大小
#define BLUETOOTH_CH9141_TIMEOUT_COUNT (500) // 执行操作的超时时间
//=================================================定义 9141蓝牙 基本配置================================================
//=================================================声明 9141蓝牙 基础函数================================================
uint32 bluetooth_ch9141_send_byte (const uint8 data); // 蓝牙转串口模块 发送数据
uint32 bluetooth_ch9141_send_buffer (const uint8 *buff, uint32 len); // 蓝牙转串口模块 发送数组
uint32 bluetooth_ch9141_send_string (const char *str); // 蓝牙转串口模块 发送字符串
void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size); // 蓝牙转串口模块 发送摄像头图像至上位机查看图像
uint32 bluetooth_ch9141_read_buffer (uint8 *buff, uint32 len); // 蓝牙转串口模块 读取函数
void bluetooth_ch9141_uart_callback (void); // 蓝牙转串口模块 串口中断回调函数
uint8 bluetooth_ch9141_init (void); // 蓝牙转串口模块 初始化
//=================================================声明 9141蓝牙 基础函数================================================
void blue_printf(char* fmt, ...);
#endif
3.isr.h函数中uart2_rx_isr
IFX_INTERRUPT(uart2_rx_isr, 0, UART2_RX_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
wireless_module_uart_handler(); // 无线模块统一回调函数
uart2_rx_interrupt_handler(); // 串口接收处理
}
uart.h函数中
UART配置改动
//#define UART_INDEX (DEBUG_UART_INDEX) // 默认 UART_0 DEBUG_UART_INDEX (UART_2)
//#define UART_BAUDRATE (115200) // 默认 115200
//#define UART_TX_PIN (DEBUG_UART_TX_PIN) // 默认 UART0_TX_P14_0 DEBUG_UART_TX_PIN (UART2_TX_P10_5)
//#define UART_RX_PIN (DEBUG_UART_RX_PIN) // 默认 UART0_RX_P14_1 DEBUG_UART_RX_PIN (UART2_RX_P10_6)
#define UART_INDEX (UART_2) // 默认 UART_0 DEBUG_UART_INDEX (UART_2)
#define UART_BAUDRATE (DEBUG_UART_BAUDRATE) // 默认 115200
#define UART_TX_PIN (UART2_TX_P10_5) // 默认 UART0_TX_P14_0 DEBUG_UART_TX_PIN (UART2_TX_P10_5)
#define UART_RX_PIN (UART2_RX_P10_6) // 默认 UART0_RX_P14_1 DEBUG_UART_RX_PIN (UART2_RX_P10_6)
此部分屏蔽
////-------------------------------------------------------------------------------------------------------------------
//// 函数简介 UART_INDEX 的接收中断处理函数 这个函数将在 UART_INDEX 对应的中断调用
//// 参数说明 void
//// 返回参数 void
//// 使用示例 uart_rx_interrupt_handler();
////-------------------------------------------------------------------------------------------------------------------
//void uart_rx_interrupt_handler (void)
//{ uint8 Ress;
// static uint8_t RxState=0;
// if( uart_query_byte(UART_INDEX, &Ress) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
// {
// if(Ress==0x23)//
// {
// memset(fifo_get_data, 0, sizeof(fifo_get_data));
// rxIndex=0;
// RxState=1;
// for(uint8 i=0;i<rxIndex-1;i++)
// {fifo_get_data[i]='\0';}
// }
// else if(RxState==1)
// {
// if(Ress==0x21)//结束的帧尾
// {
// RxState=0;
// }
// else {
// fifo_get_data[rxIndex++]=Ress;//把数据放在数据包内
// rxIndex %= USART_REC_LEN;
// }
// }
//}
//}
//
//
//IFX_INTERRUPT(uart0_rx_isr, 0, UART0_RX_INT_PRIO)
//{
// interrupt_global_enable(0); // 开启中断嵌套
// uart_rx_interrupt_handler(); // 串口接收处理
//}
//
main函数中
#include "zf_common_headfile.h"
#include "isr_config.h"
#pragma section all "cpu0_dsram"
int core0_main(void)
{
clock_init(); // 获取时钟频率<务必保留>
debug_init(); // 初始化默认调试串口
bluetooth_ch9141_init();
pit_ms_init(CCU60_CH0,10);
// 此处编写用户代码 例如外设初始化代码等
cpu_wait_event_ready(); // 等待所有核心初始化完毕
while (TRUE)
{
blue_printf("%.2f\n",ceshi_QQ);// 此处编写需要循环执行的代码
}
}
#pragma section all restore
补充2:参数应该怎么设置
博主调参时调参函数是这样设置的
void USART_PID_Adjust(void)
{
data_Get = Get_Data(); //
if(fifo_get_data[0]=='P' && fifo_get_data[1]=='1') //
Speed_P_l = data_Get; //左速度环参数P
else if(fifo_get_data[0]=='I' && fifo_get_data[1]=='1') //
Speed_I_l = data_Get; //左速度环参数I
else if(fifo_get_data[0]=='D' && fifo_get_data[1]=='1') //
Speed_D_l = data_Get; //左速度环参数D
else if(fifo_get_data[0]=='P' && fifo_get_data[1]=='2') //
Speed_P_r = data_Get; //右速度环参数P
else if(fifo_get_data[0]=='I' && fifo_get_data[1]=='2') //
Speed_I_r = data_Get; //右速度环参数I
else if(fifo_get_data[0]=='D' && fifo_get_data[1]=='2') //
Speed_D_r = data_Get; //右速度环参数D
else if(fifo_get_data[0]=='Q' && fifo_get_data[1]=='Q') //二次P的P
ceshi_QQ = data_Get; //测试
// else if(fifo_get_data[0]=='B' && fifo_get_data[1]=='T') //二次P的Dsteer_middle
// BT = data_Get;
// else if(fifo_get_data[0]=='Q' && fifo_get_data[1]=='T')
// blue_ztfg = (int)data_Get;
// else if(fifo_get_data[0]=='S' && fifo_get_data[1]=='T')
// steer_middle = (int)data_Get;
}
补充3:博主速度环调试实际效果
PS:这是单位比较大的时候两个线拟合的图像效果还是挺不错的,当然两条线放大后肯定还是稍微有差距的,这是正常的,只要不会差太多且车轮阻尼感合适就OK了。速度环不仅看图像,用手去感受车轮的阻尼感同样重要,车的阻尼感控制在什么范围内看自己,要知道对于速度环,太松或太紧肯定都是不行的,就像你开车,太松,你停车的时候他就会向前趋近一段距离;太紧,相当于急刹,会对我们的车电机等有损害甚至翻车,具体情况还是要看各位爱车的实际情况。


6277

被折叠的 条评论
为什么被折叠?



