vofa控制的深刻解读题 | “朝闻道”知识分享大赛

鲁朗 2024-10-25 18:03:35

这是我参加朝闻道知识分享大赛的第2篇文章

在接下来的发表内容中,我将逐一深彻的介绍vofa软件的使用以及环境配置,该软件可以说对参加智能车、电赛、嵌入式、单片机等比赛进行代码调试时发挥重要作用。感兴趣的同学可以认真研读,内容如果错误或者您有任何疑问,请您在评论区进行发表,我将认真回复。

注:该内容为本人原创,其中配置环境的操作和代码也为本人网上自行学习总结,并非属于任何一个实验室或者集体!!!

注:该内容为本人原创,其中配置环境的操作和代码也为本人网上自行学习总结,并非属于任何一个实验室或者集体!!!

注:该内容为本人原创,其中配置环境的操作和代码也为本人网上自行学习总结,并非属于任何一个实验室或者集体!!!

 

目录

在接下来的发表内容中,我将逐一深彻的介绍vofa软件的使用以及环境配置,该软件可以说对参加智能车、电赛、嵌入式、单片机等比赛进行代码调试时发挥重要作用。感兴趣的同学可以认真研读,内容如果错误或者您有任何疑问,请您在评论区进行发表,我将认真回复。

二、vofa串口助手配置

一、PID上位调参

1、代码配置

(1)宏定义配置

(2)UART_INDEX 的接收中断处理函数 这个函数将在 UART_INDEX 对应的中断调用

(3) 将vofa中回传的数据解析

(4)将vofa中回传的数据解析分别赋值

(5)头文件配置

二、总结

提示:

1、vofa的介绍与代码配置,请参考第一篇文章 http://t.csdnimg.cn/GicvJ

2、vofa串口助手配置,请参考第二篇文章 http://t.csdnimg.cn/hiGrZ

3、vofa串口助手操作说明,请参考本篇文章 http://t.csdnimg.cn/2NOd9


二、vofa串口助手配置

一、PID上位调参

经典控制理论中的PID控制分为位置式和增量式,可分别设置调参。

1、代码配置

(1)宏定义配置

uint8 uart_get_data[64];                                                 // 串口接收数据缓冲区
uint8 fifo_get_data[64];                                                // fifo 输出读出缓冲区
uint8  get_data = 0;                                                  // 接收数据变量
uint32 fifo_data_count = 0;                                         // fifo 数据个数
fifo_struct uart_data_fifo;
void Init_uart(void)
{
fifo_init(&uart_data_fifo, FIFO_DATA_8BIT, uart_get_data, 64); // 初始化 fifo 挂载缓冲区
      uart_init(UART_INDEX, UART_BAUDRATE, UART_TX_PIN, UART_RX_PIN);   // 初始化串口
      uart_rx_interrupt(UART_INDEX, 1);                   // 开启 UART_INDEX 的接收中断
 
      uart_write_string(UART_INDEX, "UART Text.");                  // 输出测试信息
      uart_write_byte(UART_INDEX, '\r');                                   // 输出回车
      uart_write_byte(UART_INDEX, '\n');
}
void Send_test(void)
{
    fifo_data_count = fifo_used(&uart_data_fifo);             // 查看 fifo 是否有数据
            if(fifo_data_count != 0)                             // 读取到数据了
            {
                fifo_read_buffer(&uart_data_fifo, fifo_get_data, &fifo_data_count, FIFO_READ_AND_CLEAN);    // 将 fifo 中数据读出并清空 fifo 挂载的缓冲
                uart_write_string(UART_INDEX, "\r\nUART get data:");    // 输出测试信息
                uart_write_buffer(UART_INDEX, fifo_get_data, fifo_data_count);  // 将读取到的数据发送出去
            }
            system_delay_ms(10);
}

(2)UART_INDEX 的接收中断处理函数 这个函数将在 UART_INDEX 对应的中断调用

// 参数说明       void

// 返回参数       void

// 使用示例       uart_rx_interrupt_handler();

void uart_rx_interrupt_handler (void)
{
//    get_data = uart_read_byte(UART_INDEX); // 接收数据 while 等待式 不建议在中断使用
    uart_query_byte(UART_INDEX, &get_data);  // 接收数据 查询式 有数据会返回 TRUE 没有数据会返回 FALSE
    fifo_write_buffer(&uart_data_fifo, &get_data, 1);// 将数据写入 fifo 中
}

(3) 将vofa中回传的数据解析

// 参数说明       void

// 返回参数       void

// 使用示例      data=Get_Data();

float Get_Data(void)
{
    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<64;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;
       }
       if(minus_Flag == 1)  data_return = -data_return;
  //    printf("data=%.2f\r\n",data_return);
       return data_return;
   }
 

(4)将vofa中回传的数据解析分别赋值

// 参数说明       void

// 返回参数       void

// 使用示例      USART_PID_Adjust(1)(以左电机为例)

void USART_PID_Adjust(uint8_t Motor_n)
{
    float data_Get = Get_Data(); // 存放接收到的数据
//    printf("data=%.2f\r\n",data_Get);
    if(Motor_n == 1)//左边电机
    {
 
         if(fifo_get_data[0]=='P' && fifo_get_data[1]=='2') // 速度环P
            speedP = data_Get;
        else if(fifo_get_data[0]=='I' && fifo_get_data[1]=='2') // 速度环I
            speedI = data_Get*0.01;
        else if(fifo_get_data[0]=='D' && fifo_get_data[1]=='2') // 速度环D
            speedD = data_Get;
        else if(fifo_get_data[0]=='S' && fifo_get_data[1]=='2') //目标速度
            expSpeedL = data_Get*10;
        }
 }

(5)头文件配置

void Init_uart(void);
void Send_test(void);
void uart_rx_interrupt_handler (void);
float Get_Data(void);
void USART_PID_Adjust(uint8_t Motor_n);

extern uint8 uart_get_data[64];                                                        // 串口接收数据缓冲区
extern uint8 fifo_get_data[64];                                                        // fifo 输出读出缓冲区
 
extern uint8  get_data;                                                      // 接收数据变量
extern uint32 fifo_data_count;                                        // fifo 数据个数
 
extern fifo_struct uart_data_fifo;
#define UART_INDEX              (DEBUG_UART_INDEX   )                           // 默认 UART_0
#define UART_BAUDRATE           (DEBUG_UART_BAUDRATE)                           // 默认 115200
#define UART_TX_PIN             (DEBUG_UART_TX_PIN  )                           // 默认 UART0_TX_P14_0
#define UART_RX_PIN             (DEBUG_UART_RX_PIN  )

二、总结

该篇文章PID代码配置内容较多,请认真观看代码含义,下一篇内容将详细介绍串口助手操作部分

提示:

1、vofa的介绍与代码配置,请参考第一篇文章 http://t.csdnimg.cn/GicvJ

2、vofa串口助手配置,请参考第二篇文章 http://t.csdnimg.cn/hiGrZ

3、vofa串口助手操作说明,请参考本篇文章 http://t.csdnimg.cn/2NOd9

...全文
204 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

1,042

社区成员

发帖
与我相关
我的任务
社区描述
中南民族大学CSDN高校俱乐部聚焦校内IT技术爱好者,通过构建系统化的内容和运营体系,旨在将中南民族大学CSDN社区变成校内最大的技术交流沟通平台。
经验分享 高校 湖北省·武汉市
社区管理员
  • c_university_1575
  • WhiteGlint666
  • wzh_scuec
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

欢迎各位加入中南民族大学&&CSDN高校俱乐部社区(官方QQ群:908527260),成为CSDN高校俱乐部的成员具体步骤(必填),填写如下表单,表单链接如下:
人才储备数据库及线上礼品发放表单邀请人吴钟昊:https://ddz.red/CSDN
CSDN高校俱乐部是给大家提供技术分享交流的平台,会不定期的给大家分享CSDN方面的相关比赛以及活动或实习报名链接,希望大家一起努力加油!共同建设中南民族大学良好的技术知识分享社区。

注意:

1.社区成员不得在社区发布违反社会主义核心价值观的言论。

2.社区成员不得在社区内谈及政治敏感话题。

3.该社区为知识分享的平台,可以相互探讨、交流学习经验,尽量不在社区谈论其他无关话题。

试试用AI创作助手写篇文章吧