您好,欢迎访问本站!
商品分类

STC T12 PID 源码

作者: lazymike

1.编译环境
   Keil,优化级别 9
2.测试环境
   仅用12v和19v电源进行了测试
3.编码开关使用说明
   编码开关状态设计为三种状态:短按,长按和超长按。按下时开始计数,释放时停止计数。计数小于500为短按,超过1000为超长按(即使未释放),500和1000之间为长按。
4.PID说明
   这个到现在也稀里糊涂,PID实现完全是根据GoodCode大侠公布的源码而来,达到目前的效果完全出乎本人的意料之外,有瞎猫撞上死耗子之嫌。PID编码中使用的Kp/Ki/Kd照搬GoodCode的,其他相关参数完全是随意定下的,没有任何根据。具体的PID实现问题请大家不要浪费时间问我了,真的不懂。
5.PID收敛效果
  12v下震荡较小,19v下比较大,但都能趋于稳定状态,据此如果使用24v等更高电压,震荡会更强烈一些,空载设定温度下波动小于正负2度。
6.操作简单说明
  为简单起见,参数设置分为两个状态:参数编号选择状态和参数数值设置状态。
  上电后,长按编码开关进入参数编号选择状态,即LED显示P01信息,此时旋转编码开关,会依次显示P02,P03等。
  显示Pxx时,长按退出参数设置,短按进入该参数数值设置状态。
  参数数值设置状态下,旋转编码开关设置大小,短按或长按退回到参数编号选择状态。
7.特殊操作说明
  在正常加热或休眠状态下,超长按会进入持续加热模式,此模式下LED会闪烁,旋转编码开关设置持续加热的时间,再次超长按进行持续加热。此操作期间,短按或长按都会立即退回到正常加热状态。
  在偏置电压设置状态,设置值为0时,超长按会自动获取偏置电压数值,此时如果插有烙铁头,则最好常温下进行此操作,或者短路T12烙铁头进行操作。
  密码设置状态,短按选择位数,旋转设置该位数值,默认555为空密码,设置后也需要超长按进行保存操作并退出。
  在正常加热状态下,短按进入休眠状态。
8.参数
        P00:T12温度,默认值 200,取值范围200~480
        P01:密码,默认空密码 555,取值范围000~999,设置后需超长按保存
        P02:参考电压(V),默认2.49,取值范围0.01~5.00
        P03:PID Kp,默认值 64,取值范围0~255
        P04:PID Ki,默认值 4,取值范围0~255
        P05:PID Kd,默认值 16,取值范围0~255
        P06:T12温度系数,默认值 41,取值范围1~255
        P07:偏置电压,默认值 0,取值范围0~255,自动获取后需超长按保存
        P08:室温补偿(度),默认值 0,取值范围-30~+30
        P09:休眠温度,默认值 200,取值范围200~255
        P10:休眠等待时间(分钟),默认值 0,0代表不休眠,取值范围0~255
        P11:关断等待时间(分钟),默认值 0,0代表不关断,取值范围0~255
        P12:编码开关无操作超时时间(秒),默认值0,0代表禁止判断超时,取值范围0~255,不为0时,在设置状态下,超过设置的秒数后自动返回正常加热状态
        P13:T12温度调节控制,默认值 0,取值范围0~2。0-自由调节;1-固定不可调节,此时旋转编码器进入休眠状态;2-密码保护,需输入密码后才能调节温度
        P14:再次要求密码时间(分钟),默认值 0,0代表在上电期间输入一次密码即可,取值范围0~255
        P15:保存读取EEPROM,默认值 0,取值范围0和1,0-读取,1-保存。超长按后进行相应操作
9.其他说明
        a) 无操作超时进入休眠状态编程参考了金向维的方法,但还未购置水银开关,效果未验证。http://bbs.mydigit.cn/read.php?tid=1047116&ds=1#tpc
        b) 由于最近几年游离于C++和Java,自己写代码的风格已混乱不堪,为这个帖子已尽力修改了一下,不入眼之处请谅解。
        c) 无任何版权要求。
=========================================================
20160712 变更说明
1. 刚开始学习单片机时,大概了解了变量存储区域 data 和 idata,关于 idata 说是性能差一些,所以尽量避免使用,而data大小的限制导致了参数数组看起来其丑无比。今天将参数数组放到了 idata 区域,并都声明为 int32 类型,试用了一下,感官上并无性能差异,但程序可读性好不少。
2. main.c 中  增加了下面语句
    开机按下编码开关,清空 EEPROM
    if(!ENCODER_D)
        IapEraseSector(0x0000);

    这句是整合程序时,漏掉了,补上
    PRE_HIBER_STATE = !HIBER_STATE;
3. Pic.c 中,下列语句中的红色括号必须去掉,iTerm和dTerm也同样处理,下面压缩包没有包括此变更
    pTerm = (signed long)(error*PID_P) / 100;

更多内容详见一乐电子论坛: https://www.yleee.com.cn/thread-56040-1-1.html

发表回复

登录后才能评论