好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

数字PID调节双闭环PWM调速系统的设计.doc

17页
  • 卖家[上传人]:pu****.1
  • 文档编号:505473178
  • 上传时间:2022-09-21
  • 文档格式:DOC
  • 文档大小:436KB
  • / 17 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 运动控制系统期中试题08级数字PI调节双闭环PWM调速系统设计 自动化 数字PID调节双闭环PWM调速系统设计摘要:以双极式可逆PWM直流调速系统为目标,采用STC89C51控制器PID算法实现两个PI调节器,分别构成转速、电流双闭环,采用TL094(PWM)脉宽调制器产生PWM波,再经过TPS2812 MOSFET驱动器放大,最终实现调节给定改变PWM占空比进而调节电机的运行状态关键字: 双闭环 数字PI 调节器 PWM 调速 1引言直流电动机因其可以方便地通过改变电枢电压和励磁电流实现宽范围的调速而得到广泛的应用,而PWM调速系统又因其优点,应用日益广泛。

      本文采用数字PID算法的双极式可逆PWM调速系统的方法及实现过程2 方案选择与论证2.1 概述PWM直流调速系统可分为微机控制的数字系统和模拟器件电路组成的模拟系统具体实现则又分为PID调节器和PWM脉宽调制的数字与模拟实现,而不同的方法其实现的难易程度及侧重点各不相同2.2方案选择2.1.1脉宽调制的方法①多谐振荡器或单稳态触发器组成的脉宽调制器②用比较器产生锯齿波或三角波统同可调的基准比较获得脉宽调制开关芯片TL494基本组成原理便属于这一种②数字脉宽调制采用微机控制系统,直接采用IO获得PWM波形,程序繁琐,通常采用带片上PWM资源的处理器,如C8051F040的PCA很容易产生PWM波形2.1.2 PI调节器①模拟PID特别容易实现,只需要用运算放大器构成比例、积分和微分电路即可,应用的意义已不太大②数字PID算法其使用已越来越广泛,而且更容易实现微机的数字控制,因此已成为主流2.1.3最终选择综合以上,本文选择数字PID算法实现PI调节器,用有固定频率的开关芯片的TL494,实现PWM波调制通过模拟与数字结合,最终完成双闭环直流调速系统图1.2 系统原理框图3参数计算3.1直接参数3.2电流环:3.2.1时间常数失控时间,即滞后时间:电流反馈滤波时间常数按小时间常数近似处理3.2.2选择电流调节器结构根据设计要求:,而且因此可按典型I型系统设计。

      电流调节器选用PI 型,其传递函数为:电流环开环增益:要求,按表2-2,应取, 因 此 于是ACR比例系数为:3.2.3检验近似条件:电流环截止频率① 脉宽调制器传递函数的近似条件: 现在,,满足近似条件忽略反电动势变化对对电流环动态影响的条件:现在,,满足近似条件③电流环小时间常数近似处理条件:现在,3.2.4计算调节器电阻电容, 取, 取,取按照上述参数,电流环可以达到的动态跟随性能指标为 图3-1 电压调节器3.3转速环:3.3.1 确定时间常数① 电流环等效时间常数为:=② 转速滤波时间常数 .根据所用测速发电机纹波情况,取③ 转速环小时间常数按小时间常数近似处理,取3.3.2 选择转速调节器结构 由于设计要求无静差,转速调节器必须含有积分环节,又根据动态要求,应该按典型II型系统设计转速环故ASR选用PI调节器,其传递函数为3.3.3 选择转速调节器参数按跟随和抗扰性都较好的原则,取h=5,则ASR的超前时间常数为转速环开环增益于是,ASR的比例系数为:3.3.4检验近似条件转速环截止频率为① 电流环传递函数简化条件:现在,,满足简化条件②转速环小时间常数近似处理条件:现在,,满足近似条件。

      3.3.5 计算调节器电阻和电容转速调节器原理如下图所示,取,则, 取, 取,取3.3.5校核转速超调量当h=5时,;而,因此图3-2 电流调节器4数字PI4.1程序算法: 算法是程序的核心,因此PID算法的实现至关重要 图4-1 PID算法框图 图4-2主程序流程框图在电流环和转速环的设计中,我选择的是PI调节器,我设计的是一个PID所有参数均可调的函数,所以使用时只要改变相应的参数即可得到所要的PI控制器,具体设置方法请参考主程序4.1.1 PID算法#include #include#include"PID.H"/*******************************************************************************功能:定义结构体变量******************************************************************************/struct _pid { int pv; /*integer that contains the process value*/ int sp; /*integer that contains the set point*/ float integral; float pgain; float igain; float dgain; int deadband; int last_error;}; struct _pid warm,*pid; int process_point, set_point,dead_band; float p_gain, i_gain, d_gain, integral_val,new_integ;/******************************************************************************* 函数名:pid_init 功能描述: PID初始化,通过设定*pv 、*sp赋值修改日期:20011.05.24******************************************************************************/void pid_init(struct _pid *warm, int process_point, int set_point) { struct _pid *pid; pid = warm; pid->pv = process_point; pid->sp = set_point; }/******************************************************************************* 函数名:pid_tune 功能描述:结构体变量一致.修改日期:20011.05.24******************************************************************************/void pid_tune(struct _pid *pid, float p_gain, float i_gain, float d_gain, int dead_band) { pid->pgain = p_gain; pid->igain = i_gain; pid->dgain = d_gain; pid->deadband = dead_band; pid->integral= integral_val; pid->last_error=0; }/******************************************************************************* 函数名:pid_setinteg功能描述://PID结构体中的偏差成员更新修改日期:20011.05.24******************************************************************************/void pid_setinteg(struct _pid *pid,float new_integ){ pid->integral = new_integ; pid->last_error = 0; }/******************************************************************************* 函数名:pid_bumpless 功能描述:修改日期:20011.05.24******************************************************************************/void pid_bumpless(struct _pid *pid) { pid->last_error = (pid->sp)-(pid->pv);}/******************************************************************************* 函数名:pid_calc 功能描述:PID核心计算 修改日期:20011.05.24******************************************************************************/float pid_calc(struct _pid *pid){ int err; float pterm, dterm, result, ferror; err = (pid->sp) - (pid->pv); if (abs(err) > pid->deadband) { ferror = (float) err; /*do integer to float conversion only once*/ pterm = pid->pgain * ferror; if (pterm > 100 || pterm < -100) {//积分分离 pid->integral = 0.0; } else{ pid->integral += pid->igain * ferror; if (pid->integral > 100.0) //抗积分饱和,防最大溢出 { pid->integral = 100.0; } else if (pid->integral < 0.0) pid->integral = 0.0; } //防最小溢出 dterm = (。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.