【PID】野火PID调试助手的协议移植与使用

[野火]电机应用开发实战指南 — [野火]电机应用开发实战指南—基于STM32 文档 (embedfire.com)Embedfire-motor: 野火电机项目组 (gitee.com) 野火pid助手协议的源代码

一、源代码的移植与使用

1.在移植之前首先拥有一个写好pid的电机调速代码,想要使用野火多功能pid调式助手,需要在写好的工程里面添加“下位机与上位机通信的协议”

2.①需要将【野火pid助手协议的源代码】中的protocol文件夹移植到你自己写好的工程里面,然后再需要修改其中的两个函数,因为函数调用了一些其他我们自己工程里面没有的函数

分别是这两个函数receiving_process(void)、
set_computer_value(uint8_t cmd, uint8_t ch, void *data, uint8_t num)
其他protocol文件里面的函数不用修改
在修改set_computer_value(uint8_t cmd, uint8_t ch, void *data, uint8_t num)
这个函数时,将里面的这三行:
  HAL_UART_Transmit(&UartHandle, (uint8_t *)&set_packet, sizeof(set_packet), 0xFFFFF);    // 发送数据头
  HAL_UART_Transmit(&UartHandle, (uint8_t *)data, num, 0xFFFFF);                          // 发送参数
  HAL_UART_Transmit(&UartHandle, (uint8_t *)&sum, sizeof(sum), 0xFFFFF);                  // 发送校验和

变成了这:
usart1_send((uint8_t *)&set_packet, sizeof(set_packet));    // 发送数据头
usart1_send((uint8_t *)data, num);                          // 发送参数
usart1_send((uint8_t *)&sum, sizeof(sum));                  // 发送校验和

void usart1_send(u8*data, u8 len)
{
    u8 i;
    for(i=0;i<len;i++)
    {
        while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); 
        USART_SendData(USART1,data[i]);   
    }
}
receiving_process这个函数修改了每个case下对应的操作,如SET_P_I_D_CMD,你要改成你自己的存pid的变量mypid,目标值你要对应你自己的目标值存储变量Target_Pulse
int8_t receiving_process(void)
{
  uint8_t frame_data[128];         // 要能放下最长的帧
  uint16_t frame_len = 0;          // 帧长度
  uint8_t cmd_type = CMD_NONE;     // 命令类型
  while(1)
  {
    cmd_type = protocol_frame_parse(frame_data, &frame_len);
    switch (cmd_type)
    {
      case CMD_NONE:
      {
        return -1;
      }

      case SET_P_I_D_CMD:
      {
        uint32_t temp0 = COMPOUND_32BIT(&frame_data[13]);
        uint32_t temp1 = COMPOUND_32BIT(&frame_data[17]);
        uint32_t temp2 = COMPOUND_32BIT(&frame_data[21]);
        
        float p_temp, i_temp, d_temp;
        
        p_temp = *(float *)&temp0;
        i_temp = *(float *)&temp1;
        d_temp = *(float *)&temp2;
        
		// 设置 P I D
		mypid.kp=p_temp;
		mypid.ki=i_temp;
		mypid.kd=d_temp;
				
      }
      break;

      case SET_TARGET_CMD:
      {
        int actual_temp = COMPOUND_32BIT(&frame_data[13]);    // 得到数据
        
        // 设置目标值
		Target_Pulse=actual_temp;
				

      }
      break;
      
      case START_CMD:
      {
        TIM_Cmd(TIM4, ENABLE); // 启动电机
				        
      }
      break;
      
      case STOP_CMD:
      {
        TIM_Cmd(TIM4, DISABLE);             // 停止电机
      }
      break;
      
      case RESET_CMD:
      {
        NVIC_SystemReset();          // 复位系统
      }
      break;
      
      case SET_PERIOD_CMD:
      {
//        uint32_t temp = COMPOUND_32BIT(&frame_data[13]);     // 周期数
        
//				TIM2->ARR=temp*100;// 设置定时器周期1~1000ms                             
      }
      break;

      default: 
        return -1;
    }
  }
}

②按照【野火pid助手协议的源代码】修改串口中断函数 

uint8_t a=USART1->DR;				
protocol_data_recv(&a, 1);

③在负责定时采集编码器数据的定时器中断函数与主函数中的while(1)中添加

while (1)                                                
{
    	receiving_process();
}

void TIM2_IRQHandler(void)   
{
	if(TIM_GetITStatus(TIM2,TIM_IT_Update))
	{
	  	gspeed=Read_EncoderB()*60/(SampleCircle_100*0.01*4*50);
		PID_Calc(&mypid,TargetVelocity,gspeed);
		carry_pid(mypid.output);
		set_computer_value(SEND_FACT_CMD, CURVES_CH1, &gspeed, 1);
	}
	TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
}

【发现:减小采样时间,可以加快响应时间!!!】 如下图“100倍采样时间”由45变成20

  • 6
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
野火PID调试助手是一个多功能调试工具,可以用于串口调试、网络调试、摄像头调试PID调试等功能。你可以从野火电子论坛上下载这个调试助手,并按照说明进行安装和配置。\[2\] 在使用野火PID调试助手之前,你需要先下载野火关于电机的相关例程,并将其中的通信协议移植到你自己的程序中。这些例程通常使用HAL库编写,所以如果你的电机程序也是使用HAL库编写的,移植通信协议会比较简单。如果你的电机程序是使用标准库编写的,那么将通信协议改成标准库可能会更加麻烦。\[3\] 一旦你将通信协议移植到你的程序中,你就可以在野火PID调试助手使用PID调试功能了。具体的使用方法可以参考野火电子论坛上的功能说明。\[2\]你可以通过该调试助手调试和优化你的PID算法,以达到更好的控制效果。 #### 引用[.reference_title] - *1* *3* [野火PID上位机通信移植](https://blog.csdn.net/qq_52684874/article/details/119706975)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [野火调试助手使用经验](https://blog.csdn.net/qq_33795842/article/details/122190894)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值