[转]PID算法与直流电机的PWM技术控制()

37 篇文章 32 订阅
订阅专栏

 

   PID控制算法是工业控制领域使用最广泛的算法之一,嵌入式系统是工业领域和生活中最常见的智能控制系统之一。本文以单片机控制两个带编码器的直流电机使二者转速保持一致为例讲PID算法与直流电机的PWM技术控制。本文围绕下面几个问题展开:

 

什么是PID控制算法?

 

   PID控制算法即比例、积分、微分控制算法。PID控制分为两种:模拟PID和数字PID,前者处理的是连续信号,后者处理的是离散信号。因为单片机只能处理离散信号,本文主要谈后者。对于后者,又分为两种常用的算法即增量式数字PID和位置式数字PID,其中增量式用的更多,所以本文以增量式数字PID为例。PID控制的数学原理比较复杂,限于作者水平,大家可以点击 这里进一步了解其控制原理。另外,根据实际控制需求,PID控制算法不一定三个环节都要用,一般常用的还有PI控制、PD控制。
在这里插入图片描述

 

典型的闭环控制系统结构图

 

PID控制结构框图

 

PID控制算法的典型的结构图

  PID控制算法的设计过程中最重要的一个环节就是确定三个参数值的大小的确定,即PID参数整定。为了方便叙述,我们直接用上面的链接里的思路,即确定三个系数A、B、C的大小。其中 :

A = Kp + Ki + Kd,B = Kp + 2 * Kd,C = Kd。 ------- (1)
Kp,Ki,Kd分别是PID控制器的三个参数。
注:上图直接从链接中截取
注:上图直接从链接中截取
   从本人实际的调试经历中,对于电机控制,我一般设置三个参数的大小关系为:Kp>>Kd,Ki,至于具体的数值以及Kp,Ki的相对大小需要根据控制需求和调试过程中输出的情况做一些调整,必要的话,还可能需要做一些算法上的调整,下面分情况详述:

 

  1. 先定性分析比例、积分、微分三个环节的控制作用:
    比例环节:即时成比例地反应控制系统的偏差信号e(t),偏差一旦产生,控制器立即产生控制作用以减小误差。当偏差e=0时,控制作用也为0。因此,比例控制是基于偏差进行调节的,即有差调节。
    积分环节:能对误差进行记忆,主要用于消除静差,提高系统的无差度,积分作用的强弱取决于积分时间常数Ti,Ti越大,积分作用越弱,反之则越强。值得注意的是,积分作用不宜设置过强,否则控制器输出振荡,会出现两个电机一个转另一个不转或转的慢并轮流交替循环这种极端现象,如果这两个电机是某个小车的两个转向轮,那么小车将会一直走“S”曲线。
    微分环节:能反映偏差信号的变化趋势(变化速率),并能在偏差信号值变得太大之前,在系统中引入一个有效的早期修正信号,从而加快系统的动作速度,减小调节时间。微分系数同样不能太大,否则会降低系统的稳定性。按照上面举的小车的例子,微分作用过大表现在处于稳定状态(即小车保持直线行驶)的小车受到一点点扰动就需要花很长的时间调整回来甚至再也调整不回来了。
       从时间的角度讲,比例作用是针对系统当前误差进行控制,积分作用则针对系统误差的历史,而微分作用则反映了系统误差的变化趋势,这三者的组合是“过去、现在、未来”的完美结合。
  2. 根据上面的定性分析,可以把两个电机的转速差(有正负之分)以一定的频率记录下来并绘制响应曲线(即输出-时间曲线),这个过程可以在上位机上完成,只需要打开单片机的串口,把输出的数据发给上位机即可。然后根据响应曲线调节,三个环节的调节顺序是:先调Kp是输出曲线表现为等幅振荡或近似等幅振荡,然后加上Ki,使输出曲线收敛,最后加上Kd,使响应曲线完全达到控制要求(一般响应快、稳定时无误差、超调小为宜)。
  3. 讲一些特殊情况下的控制算法调整。
    1)控制器的输出溢出,这种情况可能控制作用过强导致,这时要按Ki,Kd,Kp的顺序一个一个地适当减小三个系数,极端情况下可使Ki=0,Kd=0,Kp很小,然后 再看输出曲线。
    2)输出一直在振荡,怎么调控制参数都没用,这时要考虑硬件的问题,或者其他软件问题。
    3)除了上面两种常见的情况,也可以事先了解一下常用的PID控制器的改进方法,比如:死区控制法、遇限削弱积分法、积分分离法、有效偏差法、微分先行法等。再复杂的情况,比如大滞后,可以用串级PID控制算法,对于某一种强扰动也可加上前馈控制算法等。

 

直流编码电机的控制与转速的检测

 

先上图看一下它长什么样子:
带编码器的直流减速电机

 

带编码器的直流减速电机

 

   编码器:所谓编码,就是它可以把电机的角位移或者角速度信号转换为电脉冲信号,通过对脉冲信号的检测可以确定电机的转速。在上面的结构图中,编码器就是传感器,它将电机转速经测量变速传给单片机。
编码器的驱动:我们用stm32f10xxx系列的单片机作为主控芯片,stm32单片机的定时器外设资源丰富,并且它的通用定时器本身就带有控制编码电机的工作模式,简直就是“量身定做”!
   直流电机的控制:直流电机的转速控制用PWM技术实现,调节PWM的占空比可以线性地改变电机两端的电压,从而控制电机的转速,控制结构图如下:
在这里插入图片描述

 

直流电机的控制流程

   上面的电机驱动本质是一个功率放大器,将单片机产生的、一定占空比的PWM矩形波转为一定电压电流的模拟信号,进而驱动电机。

程序实现的问题

 

程序流程如下:
程序流程
下面挑重要的几步讲一下,然后总的源代码程序工程会以压缩包的形式共享出来。

 

1. 初始化
   初始化这一步主要完成一些全局变量、外设的赋值和配置工作。具体是:PID控制相关参数的初始化,定时器、串口等其他辅助性的外设的配置:

 

	delay_init(); //延时函数初始化
	TIM5_PWM_Init(1000,9); //PWM初始化 8KHz	
	TIM3_ENC_Init();  //编码器初始化
	TIM4_ENC_Init();  //编码器初始化
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断优先级配置
	pid_init();
	uart_init(115200); //初始化串口,波特率设置为115200

 

2. PID参数设置

 

	do //下面的循环语句是为了调节PID参数,串口接收到'0',跳出循环
	{
			switch(go) //注意大小写
			{
				case 'P': mts.Kp += val; go = 0; break;
				case 'I': mts.Ki += val; go = 0; break;
				case 'D': mts.Kd += val; go = 0; break;
				case 'p': mts.Kp -= val; go = 0; break;
				case 'i': mts.Ki -= val; go = 0; break;
				case 'd': mts.Kd -= val; go = 0; break;
				default: break;
			}
			delay_ms(10);
	}while(go != '0');

 

   这一步是为了后面程序复位后方便调整PID参数,即便于PID参数整定。
3. 循环体

 

	while(1)
	{
			detPID_PWM_out();//调用PID函数,计算控制增量
			if(sendFlag) //每刷新一次控制输出,往上位机发一次数据
			{
					send_intData(mts.detPWM_out); 
					sendFlag = 0;
			}
			TIM_SetCompare1(TIM5,BASE_SPEED - mts.detPWM_out);	//注意电机的正反转,这里的4个通道可以控制两个电机正反转
			TIM_SetCompare2(TIM5,BASE_SPEED + mts.detPWM_out);		
			TIM_SetCompare3(TIM5,0); //通道3、4为0,此时假设两个电机刚好往同一个方向转,如果转向不一致,请对调硬件或再修改代码,这里只举例说明
			TIM_SetCompare4(TIM5,0);
	}
}

 

   循环体里面计算控制输出,并根据控制输出调整PWM矩形波的占空比。
4. 中断

 

/*下面是中断服务函数,定时器中断的优先级高于串口中断*/

void USART1_IRQHandler(void)                	//串口1中断服务程序
	{
		
		if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d(回车) 0x0a(换行)结尾)
			{
				if(sendFlag%2)
				{
						val = USART_ReceiveData(USART1);	//读取接收到的数据
				}
				else
				{
						go = USART_ReceiveData(USART1);	//读取接收到的数据		
				}
				sendFlag = ++sendFlag >= 255?1:sendFlag;						 
			} 
} 
	
void TIM6_IRQHandler(void)   //TIM6中断
{
	if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
		{
			TIM_ClearITPendingBit(TIM6, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源 
//			(u_16) = TIM_GetCounter(TIM4);
//			(U_16) = TIM_GetCounter(TIM3);
			mts.Ek_2 = mts.Ek_1;
			mts.Ek_1 = mts.Ek;
			mts.Ek = TIM_GetCounter(TIM3) - TIM_GetCounter(TIM4); //计算偏差
			sendFlag = 1;
		}
			
}

 

   程序中只用了两个中断,一个是串口接收中断,用于接收上位机的命令和数据,以便调试或者监控程序里面一些变量的变化;另一个是定时器中断,为了以50Hz的频率采集编码器反馈的速度信号,同时计算偏差。

 

总结

 

   本文只介绍了最简单的PID控制算法C语言实现,上面提到的那几种常用的PID改进算法每一个都可以单独拿出来讲一下如何实现,但限于篇幅且本文重点不是这个所以大家感兴趣的话可以先查查相关的文章,后面有机会我会再单独讲一下我个人对这些算法的理解和实际应用中的实现。本文的基于uKeil的C源码工程共享在公众号“24K纯学渣”上面,回复“PID电机控制”即可获取。另外,限于作者水平,如有描述错误或不妥之处,欢迎大家在下面评论指出。如果希望进一步的交流学习,可以在公众号上联系作者,任何学习上的交流本人都非常欢迎!


---------------------
作者:24K纯学渣
来源:CSDN
原文:https://blog.csdn.net/qq_42144047/article/details/103871970?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control
 

DSP28335永磁同步电机代码:CCS编辑,支持PI控制、双闭环控制,方波和反电势过零点算法,多种感应和编码器选项,滑模观测器的实现
AICcmcpPK的博客
04-19 419
通过对DSP28335永磁同步电机控制代码的深入分析和应用,帮助开发者更好地理解和应用该平台,实现对永磁同步电机的精确控制。我们提供的代码不仅具备双闭环控制的实现功能,还提供了代码分析和调试的服务,帮助开发者解决实际应用中的问题。方波算法适用于简单的开关控制场景,感应算法则利用电机自带的感应器实现控制,而无感算法则通过滑模观测器实现对电机的精确控制。我们提供的代码不仅包含了PI控制算法的实现细节,还通过详细的注释和说明,帮助开发者理解其原理和运行机制。除了提供代码和原理图,我们还提供代码分析和调试的服务。
大神教你如何将PID输出结果与PWM占空比一起玩起来
01-27
大神教你如何将PID输出结果与PWM占空比一起玩起来,主要讲述实际操作经验
PID控制电机输出作为电机PWM占空比输入的理解
qq_26972441的博客
08-05 1万+
PID控制电机输出作为电机PWM占空比输入的理解
通过PID算法控制STM32的PWM输出
03-29
通过PID算法控制STM32的PWM输出,简洁的PID控制PWM输出的版本
stm32 利用PID调整PWM
最新发布
petertang1975的博客
08-16 950
stm32 利用PID调整PWM值。
PID算法直流电机PWM技术控制
热门推荐
qq_42144047的博客
01-10 2万+
PID控制算法是工业控制领域使用最广泛的算法之一,嵌入式系统是工业领域和生活中最常见的智能系统之一。本文介绍了PID控制算法在嵌入式系统中的直流电机控制的一些最常用、最有效的一些场景。
stm32程序(Keil)直流电机算法控制PID控制
04-16
运用Keil软件基于stm32f103系列嵌入式芯片编写的程序,用于对直流电机进行PID可调控制
PID控制PWM调节直流电机速度
11-14
本设计以上面提到的数字PID为基本控制算法,以AT89S51单片机为控制核心,产生占空比受数字PID算法控制PWM脉冲实现对直流电机速的控制。同时利用光电传感器将电机速度换成脉冲频率反馈到单片机中,实现速闭环...
基于51单片机的直流电机PID控制
11-15
51单片机PID控制直流电机 里面含增量式PID算法程序 12864液晶显示驱动程序
基于51单片机PID算法直流电机测速控速设计
02-27
基于51单片机PID算法直流电机测速控速设计,测量精度很高,控制精度也很高,误差在1r/min内,这是经过本人长期调试所得出的成果!程序里的PID参数是在大量实验过程得到的,很具有参考价值!希望对大家有所帮助!
直流电机调速(PID算法).wps
07-09
直流电机调速(PID算法) 本设计以MSP430G2553为控制核心,红外遥控设置电机速,通过光电传感器进行测量给单片机处理,以金典的数字PID算法形成闭环控制系统调节PWM的输出,从而达到控制电机速的目的,测试的结果...
基于PID算法PWM波温度控制实现代码
10-11
基于STC系列单片机完成,温度传感器利用的是负温度系数热敏电阻,通过PID算法进行温度控制,输出为PWM波,利用三位数码管进行温度显示,包括三个按键,设定键,温度增加和温度减小。
pid输出结果与pwm占空比的对应关系.rar
07-22
pid输出结果与pwm占空比的对应关系
PID算法控制PWM调速
lihe的博客
12-02 1万+
参考: https://www.docin.com/p-49742941.html https://www.arduino.cn/thread-17754-1-1.html 以PID为基本控制算法,以ATMega2560(Arduino Mega 2560)单片机为控制核心,产生占空比受PID算法控制PWM脉冲实现对电机速的控制。同时利用编码器将电机速度换成脉冲频率反馈到单片机中,实现速闭环控制。 Arduino 板上标有波浪线的引脚可以输出模拟信号,常用于控制电机、呼吸灯等器件。控制模拟信号输出的
基于PID控制参数法改变PWM的占空比的STM32F4温控实例
winnerandgeouce的博客
07-27 1万+
基于PID控制参数法改变PWM的占空比的STM32F4温控实例,比较适合不了解PID算法但是要结合STM32做温控的小伙伴。
PID控制输出PWM核心代码(基于STM32F103)
The_sunlight_的博客
08-01 1万+
//全局变量 float target=30.0;//目标温度 float error_all=0; unsigned int show_zkb=0; //PID算法 int PID(float input_wendu)//反馈输入温度 { float Kp=200.0,Ki=10.0,Kd=50.0; float error,d1; static unsigned char x=0; int output_pwm;//反馈输出PWM error=input_wendu-target;/...
温控PID调节PWM输出
LY1941514572的博客
05-21 6679
PWM有两个重要参数:占空比和频率。 (1)占空比不多讲,由PID计算得出。 (2)另一个重要的参数就是频率(尽管不能计算出这个值到底是多少,但也不能随意设置) 原因: 1.频率过高:开关损耗增大,发热严重。 2.频率过低:输出响应速度变慢,系统达到稳定的时间增长。 1)低频工作状态: 1.原理:电热丝:通电,就加热;断电,就不加热。因此,用PWM控制开关器件,调节PWM的占空比就可以达到调节通电时间和断电时间的目的。 2.原因:因为在频率很低的情况下,电热丝的通电时间或者断电时间就会变得很长。(例如:如果
08 TIM输出PWM_PID控制算法
☜@_@达奚黑雁的博客
03-06 660
TIM输出PWM控制电机 PS:所有的芯片端口,最多耐压5V 打开PWM波,设定一个波形作为PWM波的输出。300设为100,速从111将为30rpm PID算法 为什么有PID算法? 在电机体质不可能相同 相同的pwm加在多个电机,怎么保持相同速 外力作用,负载变化问题 闭环控制电机速 测速->误差计算->pwm调整 缺点:没有明确的优化准则,基本用经验进行调试。 比例(P)控制:力度值 积分(I)控制:响应速度 微分(D)控制:达到目标值的时候,抑制惯性过调 例...
pwm控制的基本原理_PID控制
weixin_39841572的博客
11-30 4577
【目录】(由目录看更新进度) 1.二位式控制器 2.PID控制器 -2.1.理论分析 --(1)比例项 --(2)积分项 --(3)微分项 --(4)比例积分微分控制 --(5)数学模型中Sk、Dk的确定 --(6)PID数学模型 -2.2 位置PID控制器代码1、二位式控制器Sv:用户设定值(给定信号)Pv:控制对象当前状态值(反馈信号)E:偏差值(偏差信号)二位式控制:当Sv>Pv:系统...
stm32直流减速电机PWM驱动与pid算法控制稳定输出代码
07-22
下面是一个基于PID算法控制STM32直流减速电机的PWM驱动的代码示例: ```C #include "stm32f4xx.h" // PID参数 float Kp = 1.0; float Ki = 0.5; float Kd = 0.2; // 电机速度设定值 int targetSpeed = 1000; // ...

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 遗传算法(一) 遗传算法的基本原理 61889
  • 美赛备赛资料大全 42421
  • latex入门(二) 字体字号的设置 40867
  • 用 Python 让 Excel 快速按条件筛选数据 36307
  • (五)汇编实现流水灯 33202

分类专栏

  • GIS空间分析 53篇
  • kaggle 4篇
  • ArcGIS 25篇
  • 列车运行控制 6篇
  • life 8篇
  • 深度学习 2篇
  • 复杂网络建模 8篇
  • 数据挖掘 14篇
  • 算法 25篇
  • leetcode 14篇
  • Linux基础 10篇
  • Web 13篇
  • Django 9篇
  • 机器学习 8篇
  • 智能车 12篇
  • matlab实践 8篇
  • 笔记 32篇
  • 随笔 25篇
  • latex 12篇
  • 数据分析 11篇
  • 数电实验 5篇
  • 单片机 37篇

最新评论

  • Applied Spatial Statistics(六)线性回归 II(模型选择)

    CSDN-Ada助手: 推荐 算法 技能树:https://edu.csdn.net/skill/algorithm?utm_source=AI_act_algorithm

  • 带小数点数码管的显示

    ZMJ8051: 十六进制或上0x80;十进制加上128

  • 带小数点数码管的显示

    ZMJ8051: 我的思路是:定义两个数组,一个数组存放不带小数点的,另一个存放带小数点的;除了第二位拿带小数点的数组元素外,其他三位拿不带小数点的数组元素。目前只是我的想法,但是还没有验证过。

  • 蓝桥杯单片机(二) 数码管与按键

    2401_83387043: 哥,怎么写数码管,发现led会有残影,该怎么解决呀

  • ESDA in PySal (5):空间数据的探索性分析:空间自相关

    m0_68500203: 你好,我想请问一下,这最后能得出什么结论呢

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • Applied Spatial Statistics(六)线性回归 II(模型选择)
  • Applied Spatial Statistics(五)线性回归 I
  • Applied Spatial Statistics(四)点模式分析-KDE 分析和距离函数
2024年35篇
2023年59篇
2022年63篇
2021年91篇
2020年90篇
2019年5篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

哆哆女性网女双胞胎起名奈德丽皮肤给姓童的男孩起名错位关系一个人一个工黄梅时节家家雨的下一句木鱼天服装店起名大全很帅的网名录取通知下载cctv2直播惨不忍睹的意思楼盘起名字高端大气的宝宝在线起名网免费取名英文名起名规则小程序起名张伟丽二番战罗斯直播带木带水起名写给合作社起个名字大排档起名张馨予微博远大前程电视剧起名学在五行中字典为钻石戒指起名字养老院的名字起什么好呢起名起名软件下载起名专家连山店铺起测名字打分中国水电十五局春天生的女孩起人名淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻不负春光新的一天从800个哈欠开始有个姐真把千机伞做出来了国产伟哥去年销售近13亿充个话费竟沦为间接洗钱工具重庆警方辟谣“男子杀人焚尸”男子给前妻转账 现任妻子起诉要回春分繁花正当时呼北高速交通事故已致14人死亡杨洋拄拐现身医院月嫂回应掌掴婴儿是在赶虫子男孩疑遭霸凌 家长讨说法被踢出群因自嘲式简历走红的教授更新简介网友建议重庆地铁不准乘客携带菜筐清明节放假3天调休1天郑州一火锅店爆改成麻辣烫店19岁小伙救下5人后溺亡 多方发声两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#青海通报栏杆断裂小学生跌落住进ICU代拍被何赛飞拿着魔杖追着打315晚会后胖东来又人满为患了当地回应沈阳致3死车祸车主疑毒驾武汉大学樱花即将进入盛花期张立群任西安交通大学校长为江西彩礼“减负”的“试婚人”网友洛杉矶偶遇贾玲倪萍分享减重40斤方法男孩8年未见母亲被告知被遗忘小米汽车超级工厂正式揭幕周杰伦一审败诉网易特朗普谈“凯特王妃P图照”考生莫言也上北大硕士复试名单了妈妈回应孩子在校撞护栏坠楼恒大被罚41.75亿到底怎么缴男子持台球杆殴打2名女店员被抓校方回应护栏损坏小学生课间坠楼外国人感慨凌晨的中国很安全火箭最近9战8胜1负王树国3次鞠躬告别西交大师生房客欠租失踪 房东直发愁萧美琴窜访捷克 外交部回应山西省委原副书记商黎光被逮捕阿根廷将发行1万与2万面值的纸币英国王室又一合照被质疑P图男子被猫抓伤后确诊“猫抓病”

哆哆女性网 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化