vofa+软件的应用(适用于智能车上位机PID调参、车体控制等)基础版

注意:通篇文章代码类型为英飞凌TC264逐飞开源库代码,对于其他芯片逻辑通用。

vofa+是博主大二为了搞比赛速学的,通篇代码也是那时候写的,现在看代码有很多可以简洁及优化的地方,但不影响使用,就没改。其中PID控制是根据这篇文章[调参神器]使用VOFA+上位机进行PID调参(附下位机代码)-优快云博客改编或抄来的,大家可以看一下这个博主写的博客,会有不一样的体会。

目录

注意:通篇文章代码类型为英飞凌TC264逐飞开源库代码,对于其他芯片逻辑通用。

一.vofa+介绍

二.vofa+两种常用数据协议介绍及应用

1.RawData协议

1.下位机函数

2.vofa+的页面设置

3.使用示例

2.FireWater协议

1.vofa+的页面设置

2.下位机配置函数代码(以调试串口为例)

3.代码说明

​编辑

补充1:有线收发改无线收发(逐飞蓝牙模块为例)

补充2:参数应该怎么设置

补充3:博主速度环调试实际效果

一.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了。速度环不仅看图像,用手去感受车轮的阻尼感同样重要,车的阻尼感控制在什么范围内看自己,要知道对于速度环,太松或太紧肯定都是不行的,就像你开车,太松,你停车的时候他就会向前趋近一段距离;太紧,相当于急刹,会对我们的车电机等有损害甚至翻车,具体情况还是要看各位爱车的实际情况。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值