发新帖我要提问
12
返回列表
打印

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

[复制链接]
楼主: LKC134
手机看帖
扫描二维码
随时随地手机跟帖
21
LKC134|  楼主 | 2020-3-19 10:14 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
maowentao0416 发表于 2020-3-18 19:10
是因为开关的频率引起的吱吱响

是的,当PID介入控温时,就会不停的控制MOS管通断工作。

使用特权

评论回复
22
LKC134|  楼主 | 2020-3-19 10:22 | 只看该作者
一事无成就是我 发表于 2020-3-18 22:32
必须用大于30K频率,否则听不到响那是假的,如果你频率低,可以加电感个二极管处理,但都是有声音的,只是 ...

我将定时器频率设定10US(100KHZ)中断做PWM,然后同步给PID,在控温时还是会响,不会是PID那里有问题吧?

使用特权

评论回复
23
LKC134|  楼主 | 2020-3-19 10:48 | 只看该作者
这是mos管在控温时的波形

IMG_20200319_103558.jpg (137.62 KB )

IMG_20200319_103558.jpg

使用特权

评论回复
评论
xch 2020-3-19 12:19 回复TA
这个波形明显不对。应该是软件问题 
24
LKC134|  楼主 | 2020-3-19 11:04 | 只看该作者
/***************定时器0***********/
void timer0(void) interrupt 1  
{
                                   //10US中断(1T模式,自装载)
   num++;   
  if(num>=1)          
   num=0;
  if(num<ZKB)          //产生PWM
   
   PM_out=1;
   else
   PM_out=0;
  
  }
/*****************PID初始化****************/
void PID_Init()
{
  ZKB=0;   //输出占空比
  e1=0;           //本次的温度差
  e2=0;           //前一次温度差
  e3=0;           //前两次温度差
  kp=10;   //比例值
  ki=0;           //积分值
  kd=6;   //微分值
  }          
/******************PID运算*****************/
void PID_isr(void)
{
   if(set_sum>temper)   //如果设定温度大于实际温度
  {
   if(set_sum-temper>5)  //如果相差5度
   {
     ZKB=10;                          //全速加热
          }
        else                                  //否则进行PID运算平滑加热
          {
            e1=set_sum-temper;
                duk=(kp*(e1-e2)+ki*e1+kd*(e1-e2*2+e3))/10;
                uk=uk+duk;
                   if(uk>10)
                uk=10;
         else
            if(uk<-10)
                uk=-10;
                if(uk<0)
                {
                 ZKB=-uk;
           }
        else
           {
            ZKB=uk;
            }
          e3=e2;
          e2=e1;
         }
        }
         if(temper>=set_sum)         //如果实际温度大于设定温度
         {
          if(temper-set_sum>0)   //如果实际温度与设定温度不相等
          {
                   ZKB=0;                                //停止加热
               
                }
         else
         {
           e1=temper-set_sum;
           duk=(kp*(e1-e2)+ki*e1+kd*(e1-e2*2+e3));
           uk=uk+duk;
           if(uk>10)
                   uk=10;
          else
            if(uk<-10)
                uk=-10;
                e3=e2;
                e2=e1;                 
           }
        }
}          
这是PID部分,这样设置有没问题?

使用特权

评论回复
25
xch| | 2020-3-19 12:25 | 只看该作者
LKC134 发表于 2020-3-19 11:04
这是PID部分,这样设置有没问题?

if (num >=1)  错了吧?   

使用特权

评论回复
26
LKC134|  楼主 | 2020-3-19 13:27 | 只看该作者
xch 发表于 2020-3-19 12:25
if (num >=1)  错了吧?

改if(num>=100)也是不行

使用特权

评论回复
27
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 2020-3-19 16:56 回复TA
if(num>=100) ,1khz 应该不会很响。控制精度高些 
28
xch| | 2020-3-19 16:51 | 只看该作者
LKC134 发表于 2020-3-19 13:27
改if(num>=100)也是不行

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


PWM输出最好用高速定时器硬件输出,可以万分之一微调。控制分辨率高,温度很容易稳定。

使用特权

评论回复
29
LKC134|  楼主 | 2020-3-19 17:06 | 只看该作者
明白,多谢了!刚才试了还是会响,我再重新整理下。

使用特权

评论回复
30
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;
  }
}
更多操作

使用特权

评论回复
31
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 2020-3-20 11:24 回复TA
可能mcu 出卖你了。它不够快,来不及响应10uS的中断。软件PWM方式不可用 
32
LKC134|  楼主 | 2020-3-20 10:01 | 只看该作者
PWM占空比的频率搞不上去始终会响。

使用特权

评论回复
33
xch| | 2020-3-20 11:26 | 只看该作者
LKC134 发表于 2020-3-20 10:01
PWM占空比的频率搞不上去始终会响。

你得改用定时器的PWM输出功能

使用特权

评论回复
34
LKC134|  楼主 | 2020-3-20 11:41 | 只看该作者
xch 发表于 2020-3-20 11:26
你得改用定时器的PWM输出功能

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

使用特权

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

使用特权

评论回复
36
LKC134|  楼主 | 2020-3-21 16:57 | 只看该作者
cjseng 发表于 2020-3-21 13:32
用带PWM的单片机吧。

已经弄好了.

使用特权

评论回复
37
jrcsh| | 2020-3-21 17:30 | 只看该作者
提高电压, 多绕线,减少电流

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则