STM32CubeMX 直流电机PID速度控制、HAL库、cubemx、PID、速度控制、增量式

提示:本文章中的cubemx配置可转到直流电机控制编码器测速


前言

pid是我们在学习单片机中首先要学会的控制算法,这篇文章主要介绍stm32如何编写pid的代码,没有对pid进行分析和解释,要想了解原理的可以参考这篇文章
对于增量式pid和位置式pid可以查看


一、代码

本文是使用PI增量式控制 – 控制电机的转速。
对于增量式pid和位置式pid的区别可以查看这篇文章

1.pid

创建一个pid.c和pid.h文件
pid.c

#include "pid.h"
/**************************************************************************
函数功能:增量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=50,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 Incremental_PI (int Encoder,int Target);
int Xianfu_Pwm(int moto) ;//限制幅度的函数
#endif

2. it.c文件

/* USER CODE BEGIN 1 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if(htim==(&htim9))//因为我采用的是定时器6
  {
		int setcc=50;
		int Encoder;
		int moto_pwm;
		Encoder=Read_Encoder();
		moto_pwm=Incremental_PI(Encoder,setcc);
		moto_pwm=Xianfu_Pwm(moto_pwm);
		Set_Pwm(moto_pwm);
		printf("samples: %d ,%d ,%d\n",Encoder,setcc,moto_pwm);
  }
}
/* USER CODE END 1 */

这里要注意我并未使用转/分钟作为pid输入的值,因为这样存在误差,不如直接使用编码器的值进行控制。

二、实现

在这里插入图片描述

总结

文件下载地址

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用STM32CubeMX结合HAL库进行直流有刷电机PID控制的步骤如下: 1. 配置PWM输出和相关引脚: - 在STM32CubeMX中,选择适当的引脚作为PWM输出引脚,并配置为输出模。 - 设置PWM的频率和占空比,以适应电机控制需求。 2. 编写代码: - 在HAL库中,使用相应的函数初始化PWM输出引脚。 - 设置PID控制所需的参数,如比例系数、积分系数和微分系数。 - 在主循环中,读取电机的实际位置反馈值。 - 根据PID算法计算出控制信号(电机的输出)。 - 将控制信号输出到PWM引脚上,以控制电机的转速或位置。 3. 对PID进行调整: - 可以通过修改PID参数来优化电机的响应速度和稳定性。 - 通过实验和调试,逐步调整比例系数、积分系数和微分系数,以达到预期的控制效果。 请注意,以上步骤仅提供了基本的框架和思路,具体的实现会根据具体的硬件和软件平台有所不同。具体的代码实现和调整参数的方法可以参考引用中提供的教程。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [stm32直流电机PID控制hal库(Cubemx)](https://blog.csdn.net/qq_59953808/article/details/128431703)[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^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值