0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32F103C8T6实现直流电机速度PID控制

CHANBAEK 来源:月月望归鸟 作者:K.Fire 2023-06-15 16:52 次阅读

01 前言

前面完成了基于STM32F103C8T6+L298N+MG513P30直流电机的PWM控制和两种方法的编码器实时速度反馈,拿到这个反馈值后我们就可以使用经典的PID算法,对电机的转速进行准确的控制了,这篇文章主要分享PID基本原理和Keil5的PID编程

02 PID的基本原理

PID算法是上个世纪30年代左右提出的控制算法,大至航空航天、小至家庭温度调控都可以使用PID算法,虽然PID算法从提出到现在已经历经了快一个世纪,其后也出现了很多现代的智能算法,比如蒙特卡洛、智能控制等等,但现在PID仍然经久不衰,可以说目前80%以上的控制仍然使用PID算法。

PID算法是自动控制原理课程学习的一部分,但在课程中老师讲解的是最基本的原理,没有任何拓展,更别提应用了,首先,先简单说一下PID控制算法的原理。

图片

上图为PID算法的控制框图,在我们控制电机速度时,期望输入就是电机的期望速度值,期望输入与由编码器测得的实际速度作差,求出的误差值传给PID的控制部分,算出需要输出的控制信号,将该控制信号传给控制器,也就是输出给电机驱动板L298N,这样形成一个循环,就实现了对电机速度的精准控制。

中间PID的控制部分的连续型公式如下:

图片

但是在计算机中计算机很难实现连续型变量的积分或者微分操作,因此在计算机中,我们使用离散型的积分和微分,就是取时间间隔T为1,离散型PID公式如下:

图片

各个项的主要作用及效果如下:

  • P:增加快速性,过大会引起震荡和超调,P单独作用会一直有静态误差
  • I:减少静态误差,过大会引起震荡
  • D:减小超调,过大会使响应速度变慢

在实际的应用中,有可能不需要PID同时使用,比如在速度控制中一般只使用PI控制就够了

03变式PID

PID算法有很多进化版本,分类别的简单阐述一下

增量式PID

在电机的速度PID控制算法中,因为我们一般使用PI算法就够了,所以我们可以使用增量式PID算法,这样可以让我们的公式和代码更加简洁。

图片

积分限幅

因为积分的效果是累加,随着时间的推移,积分项的值会升到很高,积分本来的作用是用来减小静态误差,但积分项过大会引起过大的震荡,所以我们可以加一个判断函数if,当积分项的值达到一定值后,就让积分项保持这个值,避免引起更大的震荡。

积分分离

如果刚开始的误差比较大,那么积分项则会在刚开始就累计到了一个很大的数值,那么当第一次实际输出达到期望值时,不会立刻停止,而是会产生一个很大的过冲。这时就需要用到积分分离,就是当误差值过大时,我们就不使用积分项,只让PD项单独作用,当误差值较小后,再加入积分项,以减小静态误差。

04 Keil5程序

为了使用方便,我们先定一个PID结构体,结构体储存左右轮的PID参数、限幅值、误差等参数。

typedefstruct
{
//相关速度PID参数
floatVelcity_Kp;
floatVelcity_Ki;
floatVelcity_Kd;
floatUr;//限幅值

u8PID_is_Enable;//PID使能
intUn;//期望输出值
intEn_1;//上一次的误差值
intEn_2;//上上次的误差值
intPWM;//输出PWM值

}PID_InitDefStruct;

在程序初始化部分,定义一个初始化函数,对其中的参数进行初始化配置。

voidPID_Init(PID_InitDefStruct*p)
{
p- >Velcity_Kp=5;
p- >Velcity_Ki=0.5;
p- >Velcity_Kd=0;
p- >Ur=7100;
p- >PID_is_Enable=1;
p- >Un=0;
p- >En_1=0;
p- >En_2=0;
p- >PWM=0;
}

当编码器的定时器,每隔10ms反馈一次编码器测出的实际速度后,调用PID函数,求解输出给电机驱动板的PWM值,然后通过Set_Pwm函数进行设置,以此控制电机转速。

voidVelocity_PID(intTargetVelocity,intCurrentVelocity,PID_InitDefStruct*p)
{
if(p- >PID_is_Enable==1)
{
intEn=TargetVelocity-CurrentVelocity;//误差值

p- >Un+=p- >Velcity_Kp*(En-p- >En_1)+p- >Velcity_Ki*En+p- >Velcity_Kd*(En-2*p- >En_1+p- >En_2);//增量式PID

p- >En_2=p- >En_1;
p- >En_1=En;

p- >PWM=p- >Un;

/*输出限幅*/
if(p- >PWM >p- >Ur)p- >PWM=p- >Ur;
if(p- >PWM< -p- >Ur)p- >PWM=-p- >Ur;
}
else
{
PID_Init(p);
}

}

测试给电机输入理想转速为1500mm/s,随便设置了一组PI参数,得到实验结果如下:

图片

可以通过上位机看一下波形,可以看到在稳定状态的静差是比较小的。

图片

05 总结

对于PID算法这才是万里长征的第一步吧,想要调出完美的控制程序,还需要复杂的PID参数整定,这里可以配合上位机进行调试。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 直流电机
    +关注

    关注

    35

    文章

    1626

    浏览量

    69480
  • PWM
    PWM
    +关注

    关注

    114

    文章

    4905

    浏览量

    209999
  • STM32
    +关注

    关注

    2240

    文章

    10675

    浏览量

    348882
  • PID
    PID
    +关注

    关注

    35

    文章

    1446

    浏览量

    83850
  • STM32F103C8T6
    +关注

    关注

    104

    文章

    150

    浏览量

    80996
收藏 人收藏

    评论

    相关推荐

    STM32F103C8T6STM32F103C6T6

    开发板STM32F103STM32F103C8T6学习开发板
    btsostudio
    发布于 :2022年06月16日 17:58:17

    深圳高价回收STM32F103C8T6 收购STM32F103C8T6

    大量收购工厂库存ST电子芯片STM32F103C8T6 ,实力收购工厂库存ST芯片STM32F103C8T6 ,回收价格高!!财富热线 帝欧电子 赵先生 ***同步微信 )QQ:879821252
    发表于 08-30 16:10

    如何实现STM32f103C8T6 bootloader设计?

    如何实现STM32f103C8T6 bootloader设计?
    发表于 12-14 08:03

    基于模糊规则的无刷直流电机免疫PID控制

    基于模糊规则的无刷直流电机免疫PID控制_夏长亮
    发表于 01-13 14:28 0次下载

    基于STM32直流电机PID调速系统设计与实现

    本文主要介绍了一种基于STM32直流电机PID调速系统设计与实现,该调速系统能够实现电机的启
    发表于 12-25 15:20 5.2w次阅读
    基于<b class='flag-5'>STM32</b>的<b class='flag-5'>直流电机</b><b class='flag-5'>PID</b>调速系统设计与<b class='flag-5'>实现</b>

    直流电机PID控制

    直流电机PID控制(固纬3030电源)-该文档为 直流电机PID控制资料,讲解的还不错,感兴趣的
    发表于 07-26 11:55 49次下载
    <b class='flag-5'>直流电机</b><b class='flag-5'>PID</b><b class='flag-5'>控制</b>

    PID控制直流电机速度

    PID控制直流电机速度(emi开关电源是什么意思)-该文档为PID控制
    发表于 07-26 12:03 35次下载
    <b class='flag-5'>PID</b><b class='flag-5'>控制</b><b class='flag-5'>直流电机</b><b class='flag-5'>速度</b>

    PID控制PWM调节直流电机速度简介

    PID控制PWM调节直流电机速度简介(电源缺相什么意思)-该文档为PID控制PWM调节
    发表于 07-26 12:04 21次下载
    <b class='flag-5'>PID</b><b class='flag-5'>控制</b>PWM调节<b class='flag-5'>直流电机</b><b class='flag-5'>速度</b>简介

    PID控制PWM调节直流电机速度

    PID控制PWM调节直流电机速度(安徽理士电源技术有限公司图片)-PID控制PWM调节
    发表于 09-15 14:02 90次下载
    <b class='flag-5'>PID</b><b class='flag-5'>控制</b>PWM调节<b class='flag-5'>直流电机</b><b class='flag-5'>速度</b>

    基于STM32F103VET6的无刷直流电机控制程序和资料还有原理图

    基于STM32F103VET6的无刷直流电机控制程序和资料还有原理图(电源技术期刊是收费吗)-  基于STM32F103VET6的无刷直流电机
    发表于 09-23 13:34 205次下载
    基于<b class='flag-5'>STM32F103</b>VET6的无刷<b class='flag-5'>直流电机</b><b class='flag-5'>控制</b>程序和资料还有原理图

    PID自动调节直流电机速度

    PID自动调节直流电机速度(电源技术的现状)-PID自动调节直流电机速度。认为规定
    发表于 09-24 12:50 51次下载
    <b class='flag-5'>PID</b>自动调节<b class='flag-5'>直流电机</b>的<b class='flag-5'>速度</b>

    stm32F103 基于HAL库的直流电机驱动(一)

    stm32F103 基于HAL库的直流电机驱动目录stm32F103 基于HAL库的直流电机驱动硬件连接Cube配置HAL代码编写硬件连接Cube配置HAL代码编写
    发表于 01-12 19:48 33次下载
    <b class='flag-5'>stm32F103</b> 基于HAL库的<b class='flag-5'>直流电机</b>驱动(一)

    F103直流电机双轴双闭环PID控制

    F103 - 直流电机双轴双闭环PID控制
    发表于 09-22 15:09 3次下载

    STM32F103C8T6实现直流电机速度PID控制

    前面完成了基于STM32F103C8T6+L298N+MG513P30直流电机的PWM控制和两种方法的编码器实时速度反馈,拿到这个反馈值后我们就可以使用经典的
    发表于 03-31 11:26 2次下载
    <b class='flag-5'>STM32F103C8T6</b><b class='flag-5'>实现</b><b class='flag-5'>直流电机</b><b class='flag-5'>速度</b><b class='flag-5'>PID</b><b class='flag-5'>控制</b>

    基于STM32F103直流电机pid调节闭环控制

    基于STM32F103直流电机pid调节的闭环控制,主要模块:NOKIA5110显示屏红外测速模块
    发表于 11-27 16:50 5次下载