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是的系数1−ke)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是的系数1−ke)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是的系数2−keTTdKp 例 子: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是的系数2−keTTdKp 例 子: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。 |
本文发布于:2023-07-09 18:15:03,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/fan/82/1087766.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |