PID在控温状态时发热丝部位会吱吱响

[复制链接]
2739|56
 楼主| LKC134 发表于 2020-3-19 10:14 | 显示全部楼层
maowentao0416 发表于 2020-3-18 19:10
是因为开关的频率引起的吱吱响

是的,当PID介入控温时,就会不停的控制MOS管通断工作。
 楼主| LKC134 发表于 2020-3-19 10:22 | 显示全部楼层
一事无成就是我 发表于 2020-3-18 22:32
必须用大于30K频率,否则听不到响那是假的,如果你频率低,可以加电感个二极管处理,但都是有声音的,只是 ...

我将定时器频率设定10US(100KHZ)中断做PWM,然后同步给PID,在控温时还是会响,不会是PID那里有问题吧?
 楼主| LKC134 发表于 2020-3-19 10:48 来自手机 | 显示全部楼层
这是mos管在控温时的波形

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评论

xch
这个波形明显不对。应该是软件问题  发表于 2020-3-19 12:19
 楼主| LKC134 发表于 2020-3-19 11:04 | 显示全部楼层
  1. /***************定时器0***********/
  2. void timer0(void) interrupt 1  
  3. {
  4.                                    //10US中断(1T模式,自装载)
  5.    num++;   
  6.   if(num>=1)          
  7.    num=0;
  8.   if(num<ZKB)          //产生PWM
  9.    
  10.    PM_out=1;
  11.    else
  12.    PM_out=0;
  13.   
  14.   }
  15. /*****************PID初始化****************/
  16. void PID_Init()
  17. {
  18.   ZKB=0;   //输出占空比
  19.   e1=0;           //本次的温度差
  20.   e2=0;           //前一次温度差
  21.   e3=0;           //前两次温度差
  22.   kp=10;   //比例值
  23.   ki=0;           //积分值
  24.   kd=6;   //微分值
  25.   }          
  26. /******************PID运算*****************/
  27. void PID_isr(void)
  28. {
  29.    if(set_sum>temper)   //如果设定温度大于实际温度
  30.   {
  31.    if(set_sum-temper>5)  //如果相差5度
  32.    {
  33.      ZKB=10;                          //全速加热
  34.           }
  35.         else                                  //否则进行PID运算平滑加热
  36.           {
  37.             e1=set_sum-temper;
  38.                 duk=(kp*(e1-e2)+ki*e1+kd*(e1-e2*2+e3))/10;
  39.                 uk=uk+duk;
  40.                    if(uk>10)
  41.                 uk=10;
  42.          else
  43.             if(uk<-10)
  44.                 uk=-10;
  45.                 if(uk<0)
  46.                 {
  47.                  ZKB=-uk;
  48.            }
  49.         else
  50.            {
  51.             ZKB=uk;
  52.             }
  53.           e3=e2;
  54.           e2=e1;
  55.          }
  56.         }
  57.          if(temper>=set_sum)         //如果实际温度大于设定温度
  58.          {
  59.           if(temper-set_sum>0)   //如果实际温度与设定温度不相等
  60.           {
  61.                    ZKB=0;                                //停止加热
  62.                
  63.                 }
  64.          else
  65.          {
  66.            e1=temper-set_sum;
  67.            duk=(kp*(e1-e2)+ki*e1+kd*(e1-e2*2+e3));
  68.            uk=uk+duk;
  69.            if(uk>10)
  70.                    uk=10;
  71.           else
  72.             if(uk<-10)
  73.                 uk=-10;
  74.                 e3=e2;
  75.                 e2=e1;                 
  76.            }
  77.         }
  78. }          
这是PID部分,这样设置有没问题?
xch 发表于 2020-3-19 12:25 | 显示全部楼层
LKC134 发表于 2020-3-19 11:04
这是PID部分,这样设置有没问题?

if (num >=1)  错了吧?   

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| LKC134 发表于 2020-3-19 13:27 | 显示全部楼层
xch 发表于 2020-3-19 12:25
if (num >=1)  错了吧?

改if(num>=100)也是不行
xch 发表于 2020-3-19 16:41 | 显示全部楼层
LKC134 发表于 2020-3-19 11:04
这是PID部分,这样设置有没问题?

建议这么改:
/***************定时器0***********/
void timer0(void) interrupt 1  
{
   static uint8_t set=0;
   num++;   
  if(num>=10)
  {
   num=0;
   set = ZKB;
  }
   
  if(num<set)          //产生PWM
  {
   PM_out=1;
   }
   else
   {
   PM_out=0;
  }
}

评论

xch
if(num>=100) ,1khz 应该不会很响。控制精度高些  发表于 2020-3-19 16:56
xch 发表于 2020-3-19 16:51 | 显示全部楼层
LKC134 发表于 2020-3-19 13:27
改if(num>=100)也是不行

你那个温控PID算法不建议使用。温控系统不是线性系统, 因为牵涉知识产权,不好跟你说。


PWM输出最好用高速定时器硬件输出,可以万分之一微调。控制分辨率高,温度很容易稳定。
 楼主| LKC134 发表于 2020-3-19 17:06 来自手机 | 显示全部楼层
明白,多谢了!刚才试了还是会响,我再重新整理下。
xch 发表于 2020-3-20 09:42 | 显示全部楼层
本帖最后由 xch 于 2020-3-20 09:59 编辑
LKC134 发表于 2020-3-19 17:06
明白,多谢了!刚才试了还是会响,我再重新整理下。

你那个PID 干脆化简,ZKB 只需 加/减一 ;每1ms 对比一次温度大小,
void timer0(void) interrupt 1  
{
   static uint8_t set=0;
   num++;   
  if(num>=100)
  {
   num=0;
   if(( ZKB>set) &&(set<100))
      set++;
  else if(( ZKB<set)&&(set))
    set --   ;
  }
   
  if(num<set)          //产生PWM
  {
   PM_out=1;
   }
   else
   {
   PM_out=0;
  }
}
更多操作
 楼主| LKC134 发表于 2020-3-20 10:00 | 显示全部楼层
xch 发表于 2020-3-20 09:42
你那个PID 干脆化简,ZKB 只需 加/减一 ;每1ms 对比一次温度大小,
void timer0(void) interrupt 1  
{ ...

刚才我尝试单独用PWM控温,不用PID,当实际温度与目标温度相等时占空比50%就会吱吱响,波形频率只有3KHZ.

评论

xch
可能mcu 出卖你了。它不够快,来不及响应10uS的中断。软件PWM方式不可用  发表于 2020-3-20 11:24
 楼主| LKC134 发表于 2020-3-20 10:01 | 显示全部楼层
PWM占空比的频率搞不上去始终会响。
xch 发表于 2020-3-20 11:26 | 显示全部楼层
LKC134 发表于 2020-3-20 10:01
PWM占空比的频率搞不上去始终会响。

你得改用定时器的PWM输出功能
 楼主| LKC134 发表于 2020-3-20 11:41 | 显示全部楼层
xch 发表于 2020-3-20 11:26
你得改用定时器的PWM输出功能

用定时器搞PWM,占空比的频率不高呀。

评论

@xch :讨论了几天,多谢热心解答。有空来东莞长安这边喝茶,多交流指点下。  发表于 2020-3-21 11:28
@xch :如果PID不修改也会响的  发表于 2020-3-21 11:25
@xch :已弄好了,现在不会响了,用5US定时,累加2,在PID修改下参数就可以了。谢谢!  发表于 2020-3-21 11:25
xch
@LKC134 :你软件错了吧?50uS* 100 = 5ms; 应该200hz。如果是50uS *10 ,是2khz。  发表于 2020-3-20 23:03
@xch :用50US中断,控温时占空比频率在255HZ,低频声叫  发表于 2020-3-20 16:25
xch
@LKC134 :既然能输出2K ,那么说明你的MCU 和固件也就只能跑到2k,丢了许多次10uS中断。干脆将错就错就使用50uS timer0 中断  发表于 2020-3-20 15:33
@xch :现在的状况就是控温时PWM的占空比只有30%,频率是2K,定时器设置是时间是5US,真是见鬼了,我另外一个产品也是这样用,却没有响声出来。  发表于 2020-3-20 15:27
xch
@LKC134 :调占空比不是PFM,是PWM。就是频率不变  发表于 2020-3-20 15:18
@xch :占空比不一样,频率就不一样了  发表于 2020-3-20 14:40
@xch :我是说当控温时,占空比如在30%或50%时候,频率就不是几十K而是几K频率了。  发表于 2020-3-20 14:39
cjseng 发表于 2020-3-21 13:32 | 显示全部楼层
用带PWM的单片机吧。
 楼主| LKC134 发表于 2020-3-21 16:57 | 显示全部楼层
cjseng 发表于 2020-3-21 13:32
用带PWM的单片机吧。

已经弄好了.
jrcsh 发表于 2020-3-21 17:30 | 显示全部楼层
提高电压, 多绕线,减少电流
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部