PID控制调参——cJSON+匿名上位机

一,闭环控制体验

主函数中

if(Motor1Speed>3.1) Motor1Pwm--;
if(Motor1Speed<2.9) Motor1Pwm++;
if(Motor2Speed>3.1) Motor2Pwm--;
if(Motor2Speed<2.9) Motor2Pwm++;
Motor_Set(Motor1Pwm,Motor2Pwm);
printf("Motor1Speed:%.2f Motor1Pwm:%d\r\n",Motor1Speed,Motor1Pwm);
printf("Motor2Speed:%.2f Motor2Pwm:%d\r\n",Motor2Speed,Motor2Pwm);
HAL_Delay(100);

二,上位机的使用

1,下载匿名上位机

匿名上位机官方下载 链接

2,了解协议

详细介绍如何从0开始写一个数据通信,将数据从单片机发送到上位机(或者虚拟示波器)进行数据或图像显示,以及常见问题或注意事项解答,本文主要以匿名上位机为例,适合新手和小白_慕羽★的博客-CSDN博客

//需要发送16位,32位数据,对数据拆分,之后每次发送单个字节
//拆分过程:对变量dwTemp 去地址然后将其转化成char类型指针,最后再取出指针所指向的内容
#define BYTE0(dwTemp) (*(char *)(&dwTemp))
#define BYTE1(dwTemp) (*((char *)(&dwTemp) + 1))
#define BYTE2(dwTemp) (*((char *)(&dwTemp) + 2))
#define BYTE3(dwTemp) (*((char *)(&dwTemp) + 3))
3,使用

编写协议函数

并使用收发信息

代码略(可以去看简介)

三,加入cJSON方便调参

代码8中有

1,STM32CubeMX配置

调大堆栈

软件开启中断

开启串口1接收中断     

  __HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);
2,代码
stm32fx.it.c中
uint8_t Usart1_ReadBuf[256]; //串口1 缓冲数组
uint8_t Usart1_ReadCount = 0; //串口1 接收字节计数
if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE))//判断huart1 是否读到字节
{
if(Usart1_ReadCount >= 255) Usart1_ReadCount = 0;
HAL_UART_Receive(&huart1,&Usart1_ReadBuf[Usart1_ReadCount++],1,1000);
}
usart.c中
extern uint8_t Usart1_ReadBuf[255]; //串口1 缓冲数组
extern uint8_t Usart1_ReadCount; //串口1 接收字节计数
//判断否接收完一帧数据
uint8_t Usart_WaitReasFinish(void)
{
    static uint16_t Usart_LastReadCount = 0;//记录上次的计数值
    if(Usart1_ReadCount == 0)
    {
        Usart_LastReadCount = 0;return 1;//表示没有在接收数据
    }
    if(Usart1_ReadCount == Usart_LastReadCount)//如果这次计数值等于上次计数值
    {
        Usart1_ReadCount = 0;
        Usart_LastReadCount = 0;
        return 0;//已经接收完成了
    }
    Usart_LastReadCount = Usart1_ReadCount;
    return 2;//表示正在接受中
}
下载cJSON新版 gtihub链接
#include "cJSON.h"
#include <string.h>
cJSON *cJsonData ,*cJsonVlaue;
if(Usart_WaitReasFinish() == 0)//是否接收完毕
{
    测试发送cJSON数据就会解析收到数据
    cJsonData = cJSON_Parse((const char *)Usart1_ReadBuf);
if(cJSON_GetObjectItem(cJsonData,"p") !=NULL)
{
    cJsonVlaue = cJSON_GetObjectItem(cJsonData,"p");
    p = cJsonVlaue->valuedouble;
    pidMotor1Speed.Kp = p;
}
if(cJSON_GetObjectItem(cJsonData,"i") !=NULL)
{
    cJsonVlaue = cJSON_GetObjectItem(cJsonData,"i");
    i = cJsonVlaue->valuedouble;
    pidMotor1Speed.Ki = i;
}
if(cJSON_GetObjectItem(cJsonData,"d") !=NULL)
{
    cJsonVlaue = cJSON_GetObjectItem(cJsonData,"d");
    d = cJsonVlaue->valuedouble;
    pidMotor1Speed.Kd = d;
}
if(cJSON_GetObjectItem(cJsonData,"a") !=NULL)
{
    cJsonVlaue = cJSON_GetObjectItem(cJsonData,"a");
    a = cJsonVlaue->valuedouble;
    pidMotor1Speed.target_val =a;
}
if(cJsonData != NULL)
{
    cJSON_Delete(cJsonData);//释放空间、但是不能删除cJsonVlaue不然会 出现异常错误
}
    memset(Usart1_ReadBuf,0,255);//清空接收buf,注意这里不能使用strlen
}
printf("P:%.3f I:%.3f D:%.3f A:%.3f\r\n",p,i,d,a);
3,用上位机调参

具体操作看笔记不好明确

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值