STM32CubeMX 直流电机串级PID位置速度控制、HAL库、cubemx、PID、串级PID、位置控制、速度控制、双环控制

这篇具有很好参考价值的文章主要介绍了STM32CubeMX 直流电机串级PID位置速度控制、HAL库、cubemx、PID、串级PID、位置控制、速度控制、双环控制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

提示:本文章的串级PID位置速度控制,是在前两篇文章速度控制,位置控制的基础上实现的,这一章节中不需要额外的cubemx的配置,只需要写简单的代码即可,复杂的地方在于串级pid的调试过程。


前言

pid是我们在学习单片机中首先要学会的控制算法,而串级pid又是在单pid的基础上衍生出来的,他能更好的控制系统,这篇文章主要介绍stm32如何编写串级pid的代码,没有对pid进行分析和解释,要想了解串级原理的可以参考这篇文章。


一、代码

在之前的基础上我们已经能分别对电机的位置和电机的速度进行相应的控制了 ,那么现在的问题是当电机转到指定位置的过程中电机的速度不可控,所以我们就需要通过串级pid来进行速度的调节,我么把电机的位置环作为外环,电机的转速我们作为内环。

1.pid

和前面一节的区别就是多了一个Double_Loop_Control()函数,其实这个函数就是简单的把两个串在一起而已,代码阅读起来很简单,就不多说了。
pid.c

int Double_Loop_Control(int position, int target_position, int current_speed, int desired_speed)
{
    int target_speed;
    int pwm_output;

		// 位置环控制
		target_speed = Position_PID(position, target_position);
		/* 目标速度上限处理 */
		if (target_speed > desired_speed)// 目标速度的最大值
		{
			target_speed = desired_speed;
		}
		else if (target_speed < -desired_speed)
		{
			target_speed = -desired_speed;
		}


    // 速度环控制
    pwm_output = Incremental_PI(current_speed, target_speed);	
    return pwm_output;
}
/*											多环控制  										*/
/*
*	函数功能:位置式PID控制器
*	入口参数:编码器测量位置信息,目标位置
*	返回  值:电机PWM
*	根据位置式离散PID公式 
*	pwm=Kp*e(k)+Ki*∑e(k)+Kd[e(k)-e(k-1)]
*	e(k)代表本次偏差 
*	e(k-1)代表上一次的偏差  
*	∑e(k)代表e(k)以及之前的偏差的累积和;其中k为1,2,,k;
*	pwm代表输出
**************************************************************************/
int Position_PID (int position,int target)
{ 
	float Kp=0.5,Ki=0.005,Kd=1;	
	static float Bias,Pwm,Integral_bias,Last_Bias;
	Bias=target-position;                                  //计算偏差
	Integral_bias+=Bias;	                                 //求出偏差的积分
	if(Integral_bias>400)Integral_bias=400;				//对积分 限幅
	if(Integral_bias<-400)Integral_bias=-400;		//积分限幅 防止到达目标位置后过冲
	Pwm=Kp*Bias+Ki*Integral_bias+Kd*(Bias-Last_Bias);       //位置式PID控制器
	Last_Bias=Bias;                                       //保存上一次偏差 
	return Pwm;                                           //增量输出
}
/**************************************************************************
函数功能:增量PI控制器
入口参数:编码器测量值,目标速度
返回  值:电机PWM
根据增量式离散PID公式 
pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[e(k)-2e(k-1)+e(k-2)]
e(k)代表本次偏差 
e(k-1)代表上一次的偏差  以此类推 
pwm代表增量输出
在我们的速度控制闭环系统里面,只使用PI控制
pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)
**************************************************************************/
int Incremental_PI (int Encoder,int Target)
{ 	
	float Kp=30,Ki=10;	
	static int Bias,Pwm,Last_bias;
	Bias=Target-Encoder;                //计算偏差
	Pwm+=Kp*(Bias-Last_bias)+Ki*Bias;   //增量式PI控制器
	Last_bias=Bias;	                   //保存上一次偏差 
	return Pwm;                         //增量输出
}
/**************************************************************************
函数功能:限制PWM赋值 
入口参数:无
返回  值:无
**************************************************************************/
int Xianfu_Pwm(int moto) //限制幅度的函数
 {
   int Amplitude=7000;  //===PWM满幅是8400 限制7000
	 if(moto<-Amplitude)  moto = -Amplitude;
	 if(moto>Amplitude)   moto =  Amplitude;
	 return moto;
 }

pid.h

#ifndef __PID_H
#define __PID_H
#include "main.h"
#include "moto.h"
int Double_Loop_Control(int position, int target_position, int current_speed, int desired_speed);
int Position_PID (int position,int target);
int Incremental_PI (int Encoder,int Target);
int Xianfu_Pwm(int moto) ;//限制幅度的函数
#endif

2.it.c文件

就是简单的得到的速度值和位置值进行赋值。

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//双环
{
  if(htim==(&htim9))//因为我采用的是定时器6
  {
    int target_position=20000;
		int desired_speed=70;		
		int moto_pwm;
		int Encoder;
		int CurrentPosition_;
		Encoder=Read_Encoder();
		CurrentPosition_=Read_CurrentPosition();
		moto_pwm=Double_Loop_Control(CurrentPosition_, target_position, Encoder, desired_speed);
		moto_pwm=Xianfu_Pwm(moto_pwm);
		Set_Pwm(moto_pwm);
		printf("samples: %d ,%d ,%d ,%d ,%d \n",CurrentPosition_,target_position, Encoder, desired_speed,moto_pwm);	
  }
}

二、串级调参的方法

其中位置环采用的是位置式PID控制器,速度环采用的是增量式PI控制器。在这种情况下,您需要分别调整位置环和速度环的PID参数,以下是一些基本的参考步骤:
调整位置环的PID参数:
a. 将Ki和Kd参数设为0,仅保留Kp参数。
b. 将目标位置值设置为一个较小的值(例如10),逐步增加Kp,直到系统开始出现持续振荡。记录此时的Kp值,称为临界增益Ku2。同时,记录振荡周期,称为临界周期Tu2。
c. 使用Ziegler-Nichols方法设置位置式PID控制器的参数。例如,可以使用以下参数:
Kp2 = 0.6 * Ku2
Ki2 = 2 * Kp2 / Tu2
Kd2 = Kp2 * Tu2 / 8
d. 应用调整后的位置环参数,并观察系统性能。如果仍然需要改进,请微调参数,直到获得满意的位置控制性能。
调整速度环的PID参数:
a. 将Kd参数设为0,仅保留Kp和Ki参数。
b. 将目标速度值设置为一个较小的值(例如50),逐步增加Kp,直到系统开始出现持续振荡。记录此时的Kp值,称为临界增益Ku1。同时,记录振荡周期,称为临界周期Tu1。
c. 使用Ziegler-Nichols方法设置增量式PI控制器的参数。例如,可以使用以下参数:
Kp1 = 0.6 * Ku1 / 20
Ki1 = 2 * Kp1 * 20 / Tu1
d. 应用调整后的速度环参数,并观察系统性能。如果仍然需要改进,请微调参数,直到获得满意的速度控制性能。
需要注意的是,在实际调试过程中,根据系统的实际需求和工作条件,可能需要在Ziegler-Nichols建议的参数基础上进行微调。您可以尝试修改各个参数,观察系统对其的敏感程度,并据此进行优化。同时,调整参数的过程中也需要密切关注系统的响应和性能,避免引起系统不稳定或控制性能不佳等问题。

下面介绍一下我的方法:
1.内环的参数整定
由于内环是速度环,要是前面你的速度环已经整定完毕以后你就可以直接使用那个值了,这时候千万不要让外环接入。
最简答的方法就是Double_Loop_Control()函数中的

    // 速度环控制
    pwm_output = Incremental_PI(current_speed, target_speed);

将其中的target_speed直接写成一个固定的值例如设置为15

    // 速度环控制
    pwm_output = Incremental_PI(current_speed, 15);

由此去整定速度环中p和i的值(因为用的是pi增量式所以没有d)。
2.外环的参数整定
当内环的整定完毕以后就可以把刚刚修改成15的那个改回原来的target_speed
这时候就先设置p为0.005,id都为0,这个时候来观察图像。
例如p为0.5时候图像
pid双环控制,stm32,stm32,单片机,嵌入式硬件
然后有些抖动我们就缩小p的值
pid双环控制,stm32,stm32,单片机,嵌入式硬件
这时候看来就好了很多,然后就需要对i的值进行整定
开的时候我把i设置为1,图像有明显的抖动
pid双环控制,stm32,stm32,单片机,嵌入式硬件
这种大的抖动就需要➗2或者➗10,接着我设定为0.5抖动没有丝毫的变化,接着我又设置为0.05
pid双环控制,stm32,stm32,单片机,嵌入式硬件
抖动基本消除,但是依然还有几个波动,接着减小为0.005
pid双环控制,stm32,stm32,单片机,嵌入式硬件
这个时候的基本没有抖动了大致已经是我么需要的样子了。
还需要调整一下d的值以次来抵御外部的干扰,我将其设置为1。文章来源地址https://www.toymoban.com/news/detail-633623.html

总结

文件下载地址

到了这里,关于STM32CubeMX 直流电机串级PID位置速度控制、HAL库、cubemx、PID、串级PID、位置控制、速度控制、双环控制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [proteus]STM32F103单片机直流电机PID算法PWM波电机调速正反转Proteus仿真

    1、实现功能: (1)、基于STM32F103单片机PID算法PWM控制直流电机正反转调速,LCD1602显示转速等。可通过“加速”、“减速”按键修改“目标转速”并实时测量“实际转速”送到LCD1602上显示。 (2)、“启动”按键控制电机启动,默认启动电机是正转(示波器上的黄色PWM波)。 (3)、“

    2024年02月06日
    浏览(50)
  • 【STM32】cubeMX配置HAL库驱动L298N控制直流有刷电机

    目录 1.电机为什么需要驱动板呢?为什么不能用控制器直接控制电机呢? 2.H桥电路介绍 3.L298N原理介绍 4.实物接线图 5.CUBEMX配置 6.代码 7. 演示视频 L298N是常用来驱动小型直流有刷电机(两个)和步进电机(一个)的电机驱动板,其电路原理就是两个H桥电路,控制原理是使用

    2024年02月16日
    浏览(52)
  • 直流有刷电机位置环控制与位置速度双环控制(位置式PID)流程解析

    今天看野火的直流有刷电机pid控制的教程视频,整个代码实现过程看了好几遍后还是感觉云里雾里,尤其是速度环、位置环、位置速度双环这样看下来,虽然老师视频里该说的都说了,自己也能明确感受到位置环与位置速度双环是有区别的,但不好好捋一下还真没一下领略到

    2023年04月12日
    浏览(48)
  • STM32控制直流电机转向

    一、所需硬件模块 1.主控芯片:STM32F103C8T6 2.程序下载器:STLINK 3.电机:直流电机 4.电机驱动模块:L298N 二、模块介绍 1、主控芯片采用的是STM32系列的最小系统板,通过控制其引脚的输出进而实现对电机的控制; 2、STLINK下载器是用于烧录程序,其中的SWCLK、SWDLO、GND、3.3V引脚

    2024年02月07日
    浏览(37)
  • STM32PWM控制直流电机

    PWM介绍 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用 微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽 度的控制 PWM的原理: 假定定时器工作在向上计数 PWM 模式,且当 CNT=CCRx 时输出 1。那么就可以

    2024年02月08日
    浏览(49)
  • stm32+TB6612驱动直流电机

            因为单片机的不可以直接的驱动电机,所以需要在他们之间加上一个电机的驱动模块,之前的文章里面用过L298N电机驱动模块,现在再给大家推荐一个新的电机驱动模块,他比L298N好用许多,而且占用体积小,发热也少。TB6612可以一次驱动两个直流电机,输出PWM也

    2024年02月15日
    浏览(47)
  • 基于STM32的智能巡检小车系统设计--STM32最小系统、直流电机、直流电源模块设计

    作者:车 邮箱:692604135@qq.com 学校:西安工程大学硕士研究生 方向:机器视觉、图像分割、深度学习 在介绍具体实现功能之前,需要介绍以下模块。 本课题选择的单片机是ST(意法半导体)开发的STM32F407VET6。 这是一款采用Corte-M4为内核的高性能32位ARM微控制器。该芯片支持

    2024年02月10日
    浏览(54)
  • STM32第八课:PWM控制直流电机

            TB6612FNG是一款新型驱动器件,能独立双向控制2个直流电机,它具有很高的集成度,同时能提供足够的输出能力,运行性能和能耗方面也具有优势因此在集成化、小型化的电机控制系统中,它可以作为理想的电机驱动器件。                           

    2024年03月24日
    浏览(52)
  • STM32-微项目03-pwm控制直流电机运行

    一,项目目标 实现利用STM32F103C8T6+TB6612,输出不同占空比输出的PWM波,从而实现电机不同转速的运行、正反转的功能;    二、硬件涉及 1,STM32核心板 2,TB6612直流电机驱动模块 3,直流电机  三、硬件接线涉及 1,先看TB6612直流电机驱动模块: ①驱动模块是具备两路PWM输入

    2024年02月04日
    浏览(49)
  • stm32——pwm驱动LED灯、舵机、直流电机

    改为PA15,选择重映射方式1或完全重映射 在时钟开启后写入 PWM频率=计数器更新频率 比如要产生一个频率为1KHz,占空比为50%,分辨率为1%的PWM波形 72M/(PSC+1)/ (ARR+1)=1000 CCR/(ARR+1)=0.5 1/(ARR+1)=0.01 计算得:ARR=99,CCR=50, PSC=720-1; 常用模式为 PWM1模式1 PWM.c PWM.h main.c 参数计算 PWM.c Servo.

    2024年02月04日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包