单片机学习小组
直播中

LL-LING宁

8年用户 1322经验值
擅长:电源/新能源
私信 关注

如何利用stm32f103rct6去实现pid算法控制电机的转角

如何利用STM32f103rct6去实现pid算法控制电机的转角?

回帖(1)

于佳

2022-2-17 11:06:09
本人使用的设备/驱动:




  • Windows10

  • 串口助手 4.3.25(其实啥都行)

  • 桃饱随处可买的u***-ttl(ch340G)

  • 桃饱随处可买的stlink

  • mpu6050(一个板载,一个通过I2C接插件连接外置)

  • cubeMX 5.6.1

  • PlatformIO

  • stm32f103rct6的storm32BGC

使用stm32f103rct6,实现pid算法控制电机的转角
本文直接从项目中加入相关功能说起,环境以及其他外设配置:
CubeMX配合PlatformIO开发STM32,
CubeMX配合PlatformIO开发STM32,
CubeMX配合PlatformIO开发STM32,
CubeMX配合PlatformIO开发STM32,
CubeMX配合PlatformIO开发STM32,
CubeMX配合PlatformIO开发STM32,
CubeMX配合PlatformIO开发STM32,
CubeMX配合PlatformIO开发STM32,
CubeMX配合PlatformIO开发STM32,
正文


耳熟能详pid:
设计方便
不需要知道被控对象的传递函数
只需要调整参数,可以很好的控制很多的系统

在控制系统中,pid作为控制器,根据需求角度和实际角度的角度差,控制过程电机以一定速度转动,来跟随需求角度。
PID的连续函数:
因为要在计算机中实现,所以要进行离散化:

因为main算法以200Hz的频率刷新,所以delta_t可以求出,I和D直接整合进I和D进行调整即可

#define cutoff_coefficent   ((float)1/(2*MATH_PI*30.0f))
#define delta_t             ((float)SYSTEM_PERIOD*0.001)


static float pitchPPara = 130.0;
static float pitchIPara = 1.0;
static float pitchDPara = 10.0;
static float rollPPara = 130.0;
static float rollIPara = 1.0;
static float rollDPara = 10.0;
static float yawPPara = 80.0;
static float yawIPara = 0.0;
static float yawDPara = 8.0;


float PID_Motor1(float actAngle, float expAngle)    // return electric angular speed
{
static float expAngle_old = 0.0, et = 0.0, et_pre = 0.0, et_sum = 0.0, et_diff = 0.0,et_diff_last =0, dpid = 0.0;
static float dP = 0.0, dI = 0.0, dD = 0.0;


et = actAngle - expAngle; //error
dP = rollPPara * et; //


et_sum += et;
dI = rollIPara * et_sum;


et_diff_last=et_diff;
et_diff = et - et_pre;


// low-pass filter
et_diff = cutoff_coefficent / (cutoff_coefficent + delta_t) * et_diff_last + delta_t / (cutoff_coefficent + delta_t) * et_diff;


et_pre = et;
dD = rollDPara * et_diff;


dpid = dP + dI + dD;


return dpid;
}
在实验中发现信号的噪声会使D参数的波动较大,影响控制的性能,所以增加了一个低通滤波器。
其中,截止频率选择为30rad/s,因为通过建模,得出系统的wn大约是22rad/s。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分