STM32CubeMX 直流电机PID位置控制、HAL库、cubemx、PID、位置控制、位置式

提示:本文章的PID位置控制是在前一个的PID速度控制,的基础上实现的,这一章节中不需要额外的cubemx的配置,只需要写简单的代码即可。


前言

提示:这里可以添加本文要记录的大概内容:

前一节讲解了PID的速度控制,这节讲如何进行位置控制。


提示:以下是本篇文章正文内容,下面案例可供参考

一、代码

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

1.pid

在原有的代码上(pid.c)添加以下代码:

/*
*	函数功能:位置式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=30,Ki=0.1,Kd=10;	
	static float Bias,Pwm,Integral_bias,Last_Bias;
	Bias=target-position;                                  //计算偏差
	Integral_bias+=Bias;	                                 //求出偏差的积分
	if(Integral_bias>4000)Integral_bias=4000;				//对积分 限幅
	if(Integral_bias<-4000)Integral_bias=-4000;		//积分限幅 防止到达目标位置后过冲
	Pwm=Kp*Bias+Ki*Integral_bias+Kd*(Bias-Last_Bias);       //位置式PID控制器
	Last_Bias=Bias;                                       //保存上一次偏差 
	return Pwm;                                           //增量输出
}

pid.h

int Position_PID (int position,int target);

2. encode文件

由于速度环的时候只有编码器当前的速度,所以需要将编码器的值累计即可。
encode.c

long int CurrentPosition;
/**************************************************************************
函数功能:读取编码器总计数
入口参数:定时器
返回  值:位置
**************************************************************************/
long int Read_CurrentPosition(void)
{
	return CurrentPosition;
}

encode.h

#ifndef __ENCODE_H
#define __ENCODE_H
#include "main.h"
#define ENCODE_TIMX TIM4
int Read_Encoder(void);//读取计数器的值
long int Read_CurrentPosition(void);//读取编码器总计数
#endif

it.c文件

与速度控制的没多大变化,只是添加了CurrentPosition_

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//位置
{
  if(htim==(&htim9))//因为我采用的是定时器6
  {
		int setcc=2508;
		int moto_pwm;
		int CurrentPosition_;
		Read_Encoder();
		CurrentPosition_=Read_CurrentPosition();	
		moto_pwm=Position_PID(CurrentPosition_,setcc);
		moto_pwm=Xianfu_Pwm(moto_pwm);
		Set_Pwm(moto_pwm);
		printf("samples: %d ,%d ,%d\n",CurrentPosition_,setcc,moto_pwm);
  }
}

二、PID配置

pid.c中的pid的三个参数需要自己调整

根据我的最终为30 0.1 10 最优
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

总结

文件下载地址

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用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 ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值