PID源代码

更新时间:2023-07-09 18:15:03 阅读: 评论:0

电机PID控制算法
// 闭环控制算法
// 功能:
// 输入:*p PID控制结构体
// 输出:电机控制输出值——PWM波脉冲宽度
int count=0;
unsigned int speed_PID_Calc( struct PID *p )
{
  int ek;
  int tmpValue = p->ControlValue;
  int deltaValue = 0;
    ek = p->Reference - p->FeedBack; // 本次误差 = 参考值 - 反馈值
   
  //将PID公式离散化后,采用增量式PID控制,更新电机控制输出值
  // 遇限削弱积分法,如果进入饱和区,并且积分增加,则不进行积分运算,尽快离开饱和。
  // 增量的范围(0~10)*(1+10+10)*256=53760)线性转换为(0~550),移位数, 在4~7之间为好
  if  ( ( p->ControlValue >=550 && ek>0 ) || ( p->ControlValue <= 0 && ek<0  ))
过年还有多少天
  //进入饱和区则不再进行积分运算
  deltaValue = ((int)( p->Ka *  ((ek - p->ek_1) +  p->Kc * ( (ek - p->ek_1) - (p->ek_1 - p->ek_2) ))))>>5 ;
  el//不在饱和区,则按正常离散的PID公式计算 
  deltaValue = ((int)( p->Ka *  ((ek - p->ek_1) + p->Kb * ek + p->Kc * ( (ek - p->ek_1) - (p->ek_1 - p->ek_2) ))))>>5 ;
  // 更新前两次误差
  p->ek_2 = p->ek_1;
  p->ek_1 = ek;
   
  tmpValue = p->ControlValue + deltaValue;
   
  // 返回值
  if ( tmpValue >= 551 ) 
  return 550;
台式电脑的功率
  el 
  if ( tmpValue <= 0 )
      return 1;
      el return tmpValue;
}
主要原理是上面的,如果需要和实际应用结合起来,那就依据所留I/O口进行适当的修改参数。
PID控制直流电机编程
2009-04-23 19:46
仔细的仔还能组什么词
DMC界面:
Speed1_Cmd:设置电机运转的速度
Speed1_Now:电机当前反馈速度
Speed1_Kp:2.5节自校正PID控制器中提到的Kp值
Ur_R0:当前P_TMR3_TGRA寄存器的值
Ur_R1:设置速度与电机实际转速的差值
Motor 1 Start 和Motor 1 Stop 控制启停
PID 调节控制做电机速度控制
子程序说明
PIDInit ( )
原形:void PIDInit (void)
我是一只鸡
描述:PID所用到的RAM清零
输入参数:无
输出参数:无
头 文 件:Spmc75_PID.h
库文 件:DigitalPID_V100
注意事项:请在设置参数前使用。
例 子:PIDInit ();
PID 调节控制做电机速度控制
PIDSetPoint ( )
原形:void PIDSetPoint(int)
描述:设置PID调节的目标值
输入参数:期望值
输出参数:无
头 文 件:Spmc75_PID.h
库文 件:DigitalPID_V100
注意事项
例 子:PIDSetPoint (2000); //期望电动机的转速为2000rpm
PIDGetSetpoint ( )
原形:int PIDGetSetpoint(void)
描述:读取PID调节设置的目标值
输入参数:无
输出参数:所设置的期望值
头 文 件:Spmc75_PID.h
库文 件:DigitalPID_V100
注意事项:得到的期望值将和数值的是同一个数值
例 子:uiSpeed = PIDSetPoint (); //读取所设置的期望电动机转速
PID 调节控制做电机速度控制
新西兰北岛PIDSetKp ( )
原形:void PIDSetKp(double)
描述:设置PID的Kp值
输入参数:Kp数值
输出参数:无
头 文 件:Spmc75_PID.h
库文 件:DigitalPID_V100
注意事项:这个参数在增量PID和位置PID的计算中代表着不同的意思。
(式2-4)所示位置式PID中Kp就是比例系数
(式2-5)所示增量式PID中Kp相当于的系数ke)1(TTdTiTKp++
例 子:PIDSetKp (0.257); //设置Kp=0.257
PIDGetKp ( )
原形:double PIDGetKp(void)
描述:读取PID中所设置的Kp值
输入参数:无
输出参数:Kp数值
头 文 件:Spmc75_PID.h
库文 件:DigitalPID_V100
注意事项:这个参数在增量PID和位置PID的计算中代表着不同的意思。
(式2-4)所示位置式PID中Kp就是比例系数
(式2-5)所示增量式PID中Kp相当于的系数ke)1(TTdTiTKp++
例 子:dKp = PIDSetKp ();
PID 调节控制做电机速度控制
PIDSetKi( )
原形:void PIDSetKi(double dKii)
描述:设置PID的Ki值
输入参数:Ki数值
输出参数:无
头 文 件:Spmc75_PID.h
库文 件:DigitalPID_V100
注意事项:这个参数在增量PID和位置PID的计算中代表着不同的意思。
(式2-4)所示位置式PID中Ki是积分系数TiTKp
(式2-5)所示增量式PID中Ki是的系数1ke)21(TTdKp+
例 子:PIDSetKi (0.367); //设置Ki=0.367
PIDGetKi( )
原形:double PIDGetKi(void)
描述:读取PID中所设置的Ki值
输入参数:无
输出参数:Ki数值
头 文 件:Spmc75_PID.h
库文 件:DigitalPID_V100
注意事项:这个参数在增量PID和位置PID的计算中代表着不同的意思。
(式2-4)所示位置式PID中Ki是积分系数TiTKp
(式2-5)所示增量式PID中Ki是的系数1ke)21(TTdKp+
例 子:dKi = PIDSetKi ();
PID 调节控制做电机速度控制
PIDSetKd ( )
原形:void PIDSetKd(double dKdd)
描述:设置PID的Kd值
输入参数:Kd数值
输出参数:无
头 文 件:Spmc75_PID.h
库文 件:DigitalPID_V100
注意事项:这个参数在增量PID和位置PID的计算中代表着不同的意思。
(式2-4)所示位置式PID中Kd是积分系数TTdKp
(式2-5)所示增量式PID中Kd是的系数2keTTdKp
例 子:PIDSetKd (0.157); //设置Kd=0.157
PIDGetKd ( )
原形:void PIDGetKd(double dKdd)
描述:读取PID中所设置的Kd值
输入参数:无
输出参数:Kd数值
头 文 件:Spmc75_PID.h
库文 件:DigitalPID_V100
注意事项:这个参数在增量PID和位置PID的计算中代表着不同的意思。
(式2-4)所示位置式PID中Kd是积分系数TTdKp
(式2-5)所示增量式PID中Kd是的系数2keTTdKp
例 子:dKd = PIDSetKd ();
PID 调节控制做电机速度控制
IncPIDCalc ( )
原形:int IncPIDCalc(int)
描述:增量式PID计算
输入参数:PID调节当前采样值
输出参数:计算增量
头 文 件:Spmc75_PID.h
库文 件:DigitalPID_V100
注意事项:(式2-5)增量式PID算法的实现。
例 子:uiGoalvalue += IncPIDCalc (1998); //位置式PID控制算法通过增量式控制算法递推实现,当前采样得到转速1998rpm。
PID 调节控制做电机速度控制
LocPIDCalc ( )
原形:unsigned int LocPIDCalc(int)
描述:位置式PID计算
输入参数:PID调节当前采样值
输出参数:位置式PID计算出的绝对位置值
头 文 件:Spmc75_PID.h
库文 件:DigitalPID_V100
注意事项:(式2-4)位置式式PID算法的实现。
例 子:uiGoalvalue = LocPIDCalc (1998); //位置式PID控制算法,当前采样得到转速1998rpm。
其它应用函数式对BLDC驱动的实现,不再一一赘述,可以参考【AN_SPMC75_0003】应用例的介绍。
PID 调节控制做电机速度控制
程序范例
DEMO程序
/*=============================================*/
//应用范例
/*=============================================*/
#include "Spmc75_regs.h"
#include "Spmc_typedef.h"
#include "unspmacro.h"
#include "Spmc75_BLDC.h"
main()
{
P_IOA_SPE->W = 0x0000;
P_IOB_SPE->W = 0x0000;
P_IOC_SPE->W = 0x0000;
Spmc75_System_Init(); //Spmc75系统初始化
while(1)
{
BLDC_Run_Service(); //启停监控
NOP();
}
}
//=================================================================
// Description: IRQ0 interrupt source is XXX,ud to XXX
// Notes:错误保护
//=================================================================
void IRQ0(void) __attribute__ ((ISR));
void IRQ0(void)
{
IPM_Fault_Protect();
}
//=================================================================
// Description: IRQ1 interrupt source is XXX,ud to XXX
// Notes:BLDC启动及正常运行服务
//=================================================================
void IRQ1(void) __attribute__ ((ISR));
PID 调节控制做电机速度控制
© Sunplus Technology Co., Ltd. PAGE 17 V1.1 – Jan 23, 2006
void IRQ1(void)
{
猪蹄的卤制方法/*=============================================================*/
/*Position detection change interrupt
/*=============================================================*/
if(P_TMR0_Status->B.PDCIF && P_TMR0_INT->B.PDCIE)
{
BLDC_Motor_Normalrun();
}
/*=============================================================*/
/*Timer Counter Overflow
/*=============================================================*/
if(P_TMR0_Status->B.TCVIF && P_TMR0_INT->B.TCVIE)
{
BLDC_Motor_Startup();
}
P_TMR0_Status->W = P_TMR0_Status->W;
}
//=================================================================
// Description: IRQ6 interrupt source is XXX,ud to XXX
// Notes:DMC接收中断服务函数
//=================================================================
void IRQ6(void) __attribute__ ((ISR));
void IRQ6(void)
{
if(P_INT_Status->B.UARTIF)
{
if(P_UART_Status->B.RXIF) MC75_DMC_RcvStream();
if(P_UART_Status->B.TXIF && P_UART_Ctrl->B.TXIE);
}
}
//=================================================================
// Description: IRQ7 interrupt source is XXX,ud to XXX
// Notes:512Hz定时中断完成PID调节速度
//=================================================================
void IRQ7(void) __attribute__ ((ISR));
void IRQ7(void)
{
if(P_INT_Status->B.CMTIF)
{
if(PCMTCtrl->B.CM0IF && PCMTCtrl->B.CM0IE)
PID 调节控制做电机速度控制
© Sunplus Technology Co., Ltd. PAGE 18 V1.1 – Jan 23, 2006
{
BLDC_Motor_Actiyator();
}
P_CMT_Ctrl->W = P_CMT_Ctrl->W;
}
}
PID计算子函数:
//数据结构
长袖善舞
typedef struct PID
{
int SetPoint; //设定目标 Desired Value
long SumError; //误差累计
double Proportion; //比例常数 Proportional Const
double Integral; //积分常数 Integral Const
double Derivative; //微分常数 Derivative Const
int LastError; //Error[-1]
int PrevError; //Error[-2]
} PID;
static PID sPID;
static PID *sptr = &sPID;
//PID参数初始化
void IncPIDInit(void)
{
sptr->SumError = 0;
sptr->LastError = 0; //Error[-1]
sptr->PrevError = 0; //Error[-2]
什么形什么状sptr->Proportion = 0; //比例常数 Proportional Const
sptr->Integral = 0; //积分常数Integral Const
sptr->Derivative = 0; //微分常数 Derivative Const
sptr->SetPoint = 0;
}
PID 调节控制做电机速度控制
//增量式PID控制设计
int IncPIDCalc(int NextPoint)
{
register int iError, iIncpid;
//当前误差
iError = sptr->SetPoint - NextPoint;
//增量计算
iIncpid = sptr->Proportion * iError //E[k]项
- sptr->Integral * sptr->LastError //E[k-1]项
+ sptr->Derivative * sptr->PrevError; //E[k-2]项
//存储误差,用于下次计算
sptr->PrevError = sptr->LastError;
sptr->LastError = iError;
//返回增量值
return(iIncpid);
}
//位置式PID控制设计
unsigned int LocPIDCalc(int NextPoint)
{
register int iError,dError;
iError = sptr->SetPoint - NextPoint; //偏差
sptr->SumError += iError; //积分
dError = iError - sptr->LastError; //微分
sptr->LastError = iError;
return(sptr->Proportion * iError //比例项
+ sptr->Integral * sptr->SumError //积分项
+ sptr->Derivative * dError); //微分项
}
程序流程与说明
主程序主要完成系统必要的初始化,而对电动机的实时处理基本上是在中断中完成的,其中涉及到的中断主要有:IRQ0的错误输入和输出中断、IRQ1的PDC和TCV中断、IRQ6的UART RXD中断及CMT0的定时中断。如图5-1所示主程序设计流程图。
PID 调节控制做电机速度控制
系统初始化【API:Spmc75_System_Init()】开始启停命令监控【API:BLDC_Run_Service()】
图-1 BLDC主程序操作流程
中断子流程与说明
故障输入、输出短路、PDC、TCV、RXD和CMT0等中断协助完成了对BLDC的启动、运行、速度调节和错误保护的控制。其中如果使用默认各个中断源的使用都按照初始化设置已经相应的固定下来。这里只对PDC、TCV中断流程示出,以便使用者参考。如图-2 PDC、TCV中断操作流程:
实验测试
测试主要是针对120度上相PWM方波驱动带霍尔位置传感的直流无刷电动机并应用PID控制来进行对电动机的速度调节。硬件原理图及关于BLDC驱动请参照【AN_SPMC75_0003】。Kp参数的调整,在源程序中是可以用预编译定义的。如果定义的话就可以在DMC下对Kp参数调整,但请注意,DMC下的参数需要是扩大一千倍的。例如:Kp=0.105,DMC参数就应该是105。这样Kp的范围就可以在(400,10),对于这个范围的参数只能说是能正常的工作。如果说最适合,那么还请您根据系统的需要,按照各种整定方法对其进行全面的评估。
【注意】 1、在这里PID参数的选择和PWM的载波频率也有一定的关系,载波频率越高则【P_TMRx_TGRA】所设置的范围就越小,调节就比较的快。这种种因数希望到能考虑在内,得到最适合的PID参数。
【注意】 2、如果选择使用DMC来调整PID的Kp参数,请先设置转速(Speed1_Cmd)和Kp(Speed1_Kp)的数值再启动Motor1;若是使用固定的PID的Kp参数(在程序中固定),请先设置转速(Speed1_Cmd)再启动Motor1。
【注意】 3、在DMC下PID参数的时候Speed1_Kp与Kp的关系是Speed1_Kp=1000Kp,就是说如果要设置Kp为0.125,DMC的Speed1_Kp应该给出125。
PID控制C源程序
常在心中 发表于2008-04-15 23:22 浏览(23) 评论(0) 分类:我的专业      举报
      #i nclude <stdio.h>
  #i nclude<math.h>
 
  struct _pid {
  int pv; /×integer that contains the process value*/
  int sp; /×integer that contains the t point*/
  float integral;
  float pgain;
  float igain;
  float dgain;
  int deadband;
  int last_error;
  };
 
  struct _pid warm,*pid;
  int process_point, t_point,dead_band;
  float p_gain, i_gain, d_gain, integral_val,new_integ;;
 
 
 
  /×————————————————————————————————————————————————————————————————————————
  pid_init
 
  DESCRIPTION This function initializes the pointers in the _pid structure
  to the process variable and the tpoint. *pv and *sp are
  integer pointers.
  ————————————————————————————————————————————————————————————————————————*/
  void pid_init(struct _pid *warm, int process_point, int t_point)

本文发布于:2023-07-09 18:15:03,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1087766.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:控制   参数   速度   调节   电机   增量   位置   中断
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图