lucsunny 发表于 2009-4-13 14:49:35

PID 学习中

xiaoyuanlu 发表于 2009-4-13 21:18:18

MARK!

warmonkey 发表于 2009-4-29 20:45:14

mark

xiake017 发表于 2009-4-29 22:27:03

你好,看了你的资料,我也准备做一个白光焊台,但是烙铁芯里的电热偶还不是很清楚,还有你那个电热偶软件我看了,里面有很多种类型,不知道这个烙铁芯里的电热偶是哪种类型的,希望向你请教,QQ314825127加我好吗·?

huwuzhao 发表于 2009-4-30 14:54:35

顶一下,别沉了。

ndust 发表于 2009-4-30 15:00:02

jh

winmcu 发表于 2009-4-30 15:56:28

mark

qd118 发表于 2009-5-6 23:24:25

mark

cuikai12345 发表于 2009-5-7 12:48:22

正要学习PID控制.顶一下

yaojinhao 发表于 2009-5-7 15:49:50

顶起!~正想学习下PID

yuanshi3 发表于 2009-6-8 21:26:13

兄弟 你的全部写好了吗 想参考下 能否传上面一起共享下

chinamanzhong 发表于 2009-6-30 20:43:23

mark

346675655 发表于 2009-9-16 11:19:42

我也mark

mghy201 发表于 2009-9-16 16:19:04

我写了一个 设定部分的,但是怎么传啊??

51hubao 发表于 2009-9-20 14:12:52

m

googse 发表于 2009-9-20 14:23:55

马克

yaonui 发表于 2009-10-21 22:46:33

mark

hesun 发表于 2009-10-22 08:49:20

这好贴也被挖出来了?省了偶滴事儿咯,呵呵。

qilin3 发表于 2009-10-26 17:46:05

mark

2124890 发表于 2009-10-27 07:21:34

弄个开源的自动温度控制焊台,DIY套件供应如何.   QQ:332884364

xxs2004 发表于 2009-10-27 09:07:06

楼主:你好

假设用你现在试验的PID控制,如果要自整定P、I、D三个数值值,应该怎么做?

oldmen 发表于 2009-12-13 09:27:22

记好

wjc1956 发表于 2009-12-13 10:11:43

mark

seckuola 发表于 2009-12-13 11:00:04

mark!

bbsniua 发表于 2009-12-13 14:10:18

弄个RC滤波后直接用同相放大就可以了,
再说那个加热速度反映那么慢,
还有补偿可以在程序上加!

jeffryhao 发表于 2010-1-1 09:56:42

936焊台用的恒温控制,这个确实需要, 希望能搞个开源项目, 大家一起共享.

AVR-GCC 发表于 2010-1-1 11:15:47

mark

gxy508 发表于 2010-1-1 12:04:45

mark

ringan865 发表于 2010-1-1 16:09:18

mark

sc133 发表于 2010-1-2 10:54:09

马克

lengmo 发表于 2010-1-4 00:28:11

我有几块拆下来的板子的呵呵

gtel 发表于 2010-1-31 22:49:17

记号,学习PID

so00 发表于 2010-3-11 13:13:41

学习中

chen3bing 发表于 2010-3-12 09:09:29

这个坛子自己做东西的强人很多,我很羡慕!

chen3bing 发表于 2010-3-12 09:51:07

原理图打不开。

cochy410 发表于 2010-3-12 21:39:05

好象用个LM324就能完成一个PID控制电路了,原来的老式仪表都是用运放来做pid的可以实现比例积分微分,mcu可以用来测量显示和设定温度。当然了用mcu数字pid就更好了,可以参考下DCS或PLC中的pid模型,里面讲的还是很详细的

gpzdc986 发表于 2010-3-31 19:51:05

mark

SBFQQK 发表于 2010-3-31 21:18:17

楼主周远锋:能把我做的焊台电路图和详细资料发给我吗?谢谢!(871958879@qq.com)

SBFQQK 发表于 2010-4-1 12:23:22

楼主周远锋:能把你做的焊台电路图和详细资料发给我吗?谢谢!(871958879@qq.com)

xychf 发表于 2010-4-6 23:26:51

学习

zwj269 发表于 2010-5-14 10:46:33

楼主 能加下QQ吗?本人正在做相关毕业设计 希望得到指教 QQ 402174983

he969240 发表于 2010-7-26 11:39:06

我有白光937的

he969240 发表于 2010-7-26 11:41:00

http://cache.amobbs.com/bbs_upload782111/files_31/ourdev_570769.jpg
就是这种,不过没源程序只有电路图,和HEX (原文件名:937.jpg)

poet_lee 发表于 2010-7-26 20:07:06

谢谢分享~

boy364100 发表于 2010-7-26 21:14:55

VERY GOOD!!!

kelos3000 发表于 2010-8-9 22:12:00

ddddd

swenlin 发表于 2010-8-13 12:12:10

mark

skyxjh 发表于 2010-9-4 00:04:35

PID控制,MARK

luojiyin 发表于 2010-9-4 09:15:48

mark

jack_yu 发表于 2010-9-14 16:06:12

mark!

jyiucexx 发表于 2010-11-15 21:30:36

pid控制,我也将要学了,看来还是很重要的,在这预习一下!

sailing8 发表于 2011-4-11 21:09:47

mark

luojihao24669 发表于 2011-4-13 14:09:50

标记

GZLJZ 发表于 2011-4-13 14:40:32

mark

wanderer8885 发表于 2011-4-28 00:03:53

回复【楼主位】153290557 啊峰
-----------------------------------------------------------------------

MARK

jom520 发表于 2011-5-13 17:02:42

MARK

ddcchh 发表于 2011-6-4 11:33:58

MARK

cuit4017 发表于 2011-6-4 20:53:37

现在才看到这个帖子。为了diy个白光在网上转了好久,
mark一下,慢慢看。

rafaa 发表于 2011-6-5 19:31:29

MARK!

rogerllg 发表于 2011-6-7 10:37:30

MARK下。

zhh620 发表于 2011-7-5 22:43:04

回复【1楼】lanshuitianxia 黑蚂蚁
-----------------------------------------------------------------------

好!MARK!

Bicycle 发表于 2011-7-5 23:55:29

偶的936闲置了N久

starsun 发表于 2011-7-6 00:00:38

观注中,

wxlwxwxlwx 发表于 2011-7-6 09:26:08

mark

jyjmaster 发表于 2011-7-6 10:02:48

mark....

Garvian 发表于 2011-7-9 17:07:10

PID很早就想学了Mark下..

spark123 发表于 2011-7-9 17:25:15

闭环控制不好搞呢,关键是参数不好调节!!我之前有搞过,但效果不理想

GDYJ 发表于 2011-7-9 21:56:04

我觉得要快速升温,最好不要用PWM,直接持续加热,然后温度快接近设定温度了,再加pwm,PID控制主要用于热惯性大的对象,烙铁热熔那么小,就算持续加温到设定温度,也不会超过太多,更何况在焊接过程中温度波动肯定很大,这个时候可以加pwm,进行PID控制

liangyurongde 发表于 2011-7-9 22:36:38

mark

antking 发表于 2011-7-14 08:36:45

支持

_bobo 发表于 2011-7-17 15:27:19

也在搞,加重感冒,头都大了,哎呀,,,

youmeng 发表于 2011-8-5 15:31:58

mark

albert_w 发表于 2011-8-5 16:08:53

回复【170楼】GDYJ
我觉得要快速升温,最好不要用pwm,直接持续加热,然后温度快接近设定温度了,再加pwm,pid控制主要用于热惯性大的对象,烙铁热熔那么小,就算持续加温到设定温度,也不会超过太多,更何况在焊接过程中温度波动肯定很大,这个时候可以加pwm,进行pid控制
-----------------------------------------------------------------------

会的,真的会的,至少要P控制吧。
加温到接近比如差10度,切换到PID这样也不会引入太多早期的累积误差

a1381111 发表于 2011-8-6 14:39:31

好像不太适合吧。加热应该简单至上。

参考一下数显的969电路,效果可能更好一点。

那是成熟的产品了,不用自己浪费很多时间的。

jinjin_xia 发表于 2011-8-8 13:18:36

标记

dahai168 发表于 2011-8-31 17:25:47

谢谢lz的贡献

bingshuihuo888 发表于 2011-8-31 21:32:48

MARK一下

liuying 发表于 2011-9-24 16:41:27

今天刚淘了一个,哈哈,刚好改装一下

dragonbbc 发表于 2011-9-24 16:50:49

mark

zhu555 发表于 2011-9-24 17:16:04

上传937源码有需要找我,可发一份参考
-----------------------------------------------------------------------

zhu555 发表于 2011-9-24 17:17:40

回复【182楼】zhu555
-----------------------------------------------------------------------

/****************************************************
This program was produced by the
CodeWizardAVR V1.24.1d Standard
Automatic Program Generator
?Copyright 1998-2004 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.ro
e-mail:office@hpinfotech.ro



Chip type         : ATmega8L
Program type      : Application
Clock frequency   : 1.000000 MHz
Memory model      : Small
External SRAM size: 0
Data Stack size   : 256
*****************************************************/

#include <mega8.h>   

void SaveSetPara(void);
void ShowSetPara(void);
void ShowSetTemp(void);
void CheckReceive(void);                        
void ClosePowerProc(void);
void TempAdj(void);

unsigned charcReadTime;      
unsigned char b40ms,c40ms,b500ms,c500ms,bHeatEn,bHeatDisable,cZphOld, cZphNew;         
unsigned char bt10ms = 0,b10ms = 0,c10ms = 0,b100ms,bUpLimit = 0;
unsigned char c200ms = 0,cDispBit = 0,cSetBit,cBlinkTime;
unsigned char cDispBuf,cKeyTime = 0,cKeyShiftTime = 0;
unsigned char bSetTemp = 0,bShowType,cKeyInputTime = 0;
unsigned char bInputAdjust = 0,bSetPara = 0,cSetParaNo = 0;
unsigned char cOldPINB,cDataPINB,cSpeakTime,bHeatOK = 0;
unsigned char bAlarm,bCloseCount,bClosePower = 0,bDownLimit = 0;
unsigned char cSpeakOnTimer = 0,bSleep = 0,bHeatError = 0;
unsigned char bShowAdjust = 0,cShowAdjustTime = 0;      
unsigned char cFirstOpen, bFirstOpen,cDownLimit,bTempDown;
unsigned int cSlpTimer = 0,cOldTemp;
unsigned int cMidleTime = 200;
unsigned int cSetPara,cControlTemp,cCloseTime = 0;
unsigned int cControlVal,cSampleVal;
unsigned int eeprom *ptr_to_eeprom;

//                                                        '0' '1''2''3''4''5''6''7'
const char cDispTab = {0x81,0xdd,0x13,0x19,0x4d,0x29,0x21,0x9d,
//                        '8''9' '-''-1' 'C''F''S'
                                                        0x1,0x9,0x7f,0x5d,0xa3,0x27,0x29,
//                                                        'L''P''H' 'E'        ' '                                                
                                                        0xe3,0x7,0x45,0x23,0xff,0x00};
               
#define RunLedBlink() PORTB ^= 0x20
#define HeatDisable() PORTB &= ~0x10
#define HeatEnable() PORTB |= 0x10
#define SpeakOn() PORTB &= ~ 0x80
#define SpeakOff() PORTB |= 0x80
#define SpeakBlink() PORTB ^= 0x80

interrupt void ext_int0_isr(void)
{
// Place your code here
HeatDisable();
bHeatDisable = 1;


}




// Timer 1 overflow interrupt service routine
interrupt void timer1_ovf_isr(void)
{
        // Reinitialize Timer 1 value   
        TCNT1H = 0xfc;
        TCNT1L = 0x17;
        // Place your code here
        if(++c10ms >= 10)
        {
                c10ms = 0;
                bt10ms = 1;
/*               
                if(--cMidleTime == 0)
                {
                        cMidleTime = 200;
                        if(cSlpTimer >= 50)
                        {
                                bCloseCount = 0;
                                cCloseTime = 0;
                        }
                        else
                                bCloseCount = 1;
                        cSlpTimer = 0;
                }                */
        }                  
        // Led display
       
              
        PORTD = 0xff;
        PORTB |= 0x7;
        if(bSetTemp)
        {
                if(cSetBit == cDispBit)
                {
                        if(cBlinkTime & 0x80)
                       
                                PORTD = cDispTab];        
                }
                else
                       
                        PORTD = cDispTab];
        }
        else   
       
                PORTD = cDispTab];
               
        if(cDispBit == 0)          //1
        {
                if(PORTB & 0x10)
                        PORTD &= 0xfe;        
                PORTB &= ~0x1;
        }
        else if(cDispBit == 1)        //10
                PORTB &= ~0x2;
        else if(cDispBit == 2)        //100
                PORTB &= ~0x4;               
        if(++cDispBit >= 3)
                cDispBit = 0;               
}

#define ADC_VREF_TYPE 0xc0
// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
        ADMUX=adc_input|ADC_VREF_TYPE;
        // Start the AD conversion
        ADCSRA|=0x40;
        // Wait for the AD conversion to complete
        while ((ADCSRA & 0x10)==0);
        ADCSRA|=0x10;
        return ADCW;
}

void TimeProc(void)
{                  
        b10ms = 0;         
        b100ms = 0;
        b40ms = 0;
        if(bt10ms)
        {
                bt10ms = 0;
                b10ms = 1;
                if( ++c40ms > 4 )
                {
                        c40ms = 0;
                        b40ms = 1;
                }
                if(++c500ms > 12)
                {
                        c500ms = 0;
                        b500ms = 1;
                        if((bHeatOK == 1)&&(bTempDown == 0)&&(bDownLimit == 0))
                        {
                              if(bHeatEn == 0)
                                        bHeatEn = 1;
                              else
                                        bHeatEn = 0;
                        }
                        else
                              bHeatEn = 1;
                }
                if(++c200ms > 20)
                {
                        b100ms = 1;
                        if(cFirstOpen > 0)
                                {
                                             cFirstOpen--;
                                        if(cFirstOpen == 0)
                                             {
                               
                                                     bFirstOpen = 0;
                                               
                                       
                                       
                                             }
                                  }
                        cBlinkTime = ~ cBlinkTime;
                        c200ms = 0;
                        RunLedBlink();
                        //if(bAlarm || bHeatError)
                        if(bHeatError)
                                SpeakBlink();
                        else if((!(bAlarm || bHeatError)) && (cSpeakTime == 0))
                                SpeakOff();                       
                        if(cShowAdjustTime > 0)
                        {
                                if((--cShowAdjustTime) == 0)
                                        bShowAdjust = 0;
                        }      
                }                  
                if(cSpeakTime > 0)
                {
                        cSpeakTime--;
                        if(cSpeakTime == 0)
                        {
                                SpeakOff();
                                if(cSpeakOnTimer > 0)
                                {                  
                                        cSpeakOnTimer--;
                                        cSpeakTime = 20;
                                        if((cSpeakOnTimer % 2) == 1)
                                                SpeakOn();
                                }
                        }
                }            
        }
}   


void KeyUpProc(void)
{                    
        if(bSetTemp)
        {
                if((cSetBit == 2) && (bSetPara == 0))
                {
                        if(bShowType == 1)      
                        {               
                                if(bInputAdjust == 1)
                                {
                                        if(cDispBuf == 0)
                                                cDispBuf = 10 ;        // display '-'
                                        else if(cDispBuf == 10)
                                                cDispBuf = 11 ;                                               
                                        else if(cDispBuf == 11)
                                                cDispBuf = 1 ;                                               
                                        else if(cDispBuf == 1)
                                                cDispBuf = 0 ;                                               
                                }
                                else
                                {
                                        cDispBuf++;
                                        if(cDispBuf > 8)
                                                cDispBuf = 3;
                                }                                       
                        }
                        else
                        {
                                if(bInputAdjust == 1)
                                {
                                        if(cDispBuf == 0)
                                                cDispBuf = 10 ;        // display '-1'
                                        else
                                                cDispBuf = 0 ;                                               
                                }
                                else
                                {
                                        cDispBuf++;
                                        if(cDispBuf >= 5)
                                                cDispBuf = 2 ;                                       
                                }
                        }
                }
                else               
                {
                        cDispBuf++;
                        if(cDispBuf >= 10)
                                cDispBuf = 0;
                }
        }
        else if(bSetPara == 1)
        {
                switch(cSetParaNo)
                {
                        case 0:   
                                cSetPara++;
                                cSetPara &= 0x1;                               
                                break;
                        case 3:   
                                cSetPara++;
                                cSetPara &= 0x1;                               
                                break;
                        case 1:   
                                cSetPara++;
                                if(cSetPara >= 3)
                                        cSetPara = 0;
                                break;                               
                        default :
                                break;
                }       
                ShowSetPara();
        }
}                  

void KeyDownProc(void)
{       
        if(bSetTemp)
        {
                if((cSetBit == 2) && (bSetPara == 0))
                {
                        if(bShowType == 1)
                        {
                                if(bInputAdjust == 1)
                                {
                                        if(cDispBuf == 0)
                                                cDispBuf = 1 ;        // display '1'
                                        else if(cDispBuf == 1)
                                                cDispBuf = 11 ;// display '-1'
                                        else if(cDispBuf == 11)
                                                cDispBuf = 10 ;                                               
                                        else if(cDispBuf == 10)
                                                cDispBuf = 0 ;                                               
                                }
                                else
                                {
                                        cDispBuf--;
                                        if(cDispBuf < 3)
                                                cDispBuf = 8 ;       
                                }
                        }
                        else
                        {
                                if(bInputAdjust == 1)
                                {
                                        if(cDispBuf == 0)
                                                cDispBuf = 10 ;        // display '-'
                                        else
                                                cDispBuf = 0 ;                                               
                                }
                                else
                                {                        
                                        cDispBuf--;                       
                                        if(cDispBuf <= 1)
                                                cDispBuf = 4 ;                                       
                                }
                        }
                }
                else               
                {
                        cDispBuf--;
                        if(cDispBuf == 255)
                                cDispBuf = 9;
                }
        }
        else if(bSetPara == 1)
        {
                switch(cSetParaNo)
                {
                        case 0:   
                                cSetPara--;
                                cSetPara &= 0x1;
                                break;
                        case 3:   
                                cSetPara--;
                                cSetPara &= 0x1;                               
                                break;
                        case 1:   
                                cSetPara--;
                                if(cSetPara >= 3)
                                        cSetPara = 2;
                                break;                               
                        default :
                                break;
                }       
                ShowSetPara();
        }
}

void KeyShiftProc(void)
{                                 
        unsigned int i;

        if(bSetTemp)
        {   
                cSetBit--;
                if(cSetBit == 255)
                {
                        cSetBit = 2;
                        if(bInputAdjust == 1)
                        {
//                                bHeatOK = 0;
                                if(cDispBuf == 10)
                                        i = 1000;
                                else if(cDispBuf == 11)
                                        i = 1100;
                                else if(cDispBuf == 1)
                                        i = 100;
                                else
                                        i = 0;
                                cSetPara = cDispBuf + (unsigned int)cDispBuf * 10;
                                if(((cDispBuf & 0x1) == 0) || (((cDispBuf & 0x1) == 1) && (cSetPara <= 78)))
                                {                                                          
                                        cSetPara += i;
                                        bSetTemp = 0;
                                        bInputAdjust = 0;         
                                        ptr_to_eeprom = 2;
                                        *ptr_to_eeprom = cSetPara;                       
                                        bHeatOK = 0;                                       
                                }
                        }
                        else if(bSetPara == 1)
                        {
                                cSetPara = cDispBuf + (unsigned int)cDispBuf * 10
                                                       + (unsigned int)cDispBuf * 100;
                                if(((cSetPara <= 150) && (cSetPara >= 30) && (bShowType == 0))
                                        || ((cSetPara <= 300) && (cSetPara >= 50) && (bShowType == 1)))
                                {
                                        bSetTemp = 0;
                                        cSetParaNo++;
                                        ptr_to_eeprom = 8;
                                        *ptr_to_eeprom = cSetPara;
                                        ShowSetPara();
                                }
                                                       
                        }
                        else
                        {
                                cSetPara = cDispBuf + (unsigned int)cDispBuf * 10
                                                       + (unsigned int)cDispBuf * 100;
                                if((cSetPara == 0) && (cSetPara >= 200) && (cSetPara <= 450)
                                        || ((cSetPara == 1) && (cSetPara >= 392) && (cSetPara <= 842)))
                                {
                                        bSetTemp = 0;
                                        bHeatOK = 0;
                                        ptr_to_eeprom = 0;
                                        *ptr_to_eeprom = cSetPara;
                                }
                        }
                }               
        }
        else if(bSetPara == 1)
        {
                if(bShowType != cSetPara)
                {
                        //bHeatOK = 0;
                        if(cSetPara == 0)
                        {
                                i = (cSetPara - 32)*5 / 9;
                                cSetPara = i;
                                i = cSetPara*5 / 9;
                                cSetPara = i;
                                if(cSetPara >= 1000)
                                {                  
                                        cSetPara -= 1000;
                                        i = cSetPara*5 / 9;
                                        cSetPara = i + 1000;
                                }
                                else
                                {
                                        i = cSetPara*5 / 9;
                                        cSetPara = i;
                                }
                        }
                        else
                        {
                                i = (cSetPara *9)/5 + 32;
                                cSetPara = i;
                                i = cSetPara*9 / 5;
                                cSetPara = i;
                                if(cSetPara >= 1000)
                                {                  
                                        cSetPara -= 1000;
                                        i = cSetPara*9 / 5;
                                        cSetPara = i + 1000;
                                }
                                else
                                {
                                        i = cSetPara*9 / 5;
                                        cSetPara = i;
                                }
                        }
                        ptr_to_eeprom = 0;
                        *ptr_to_eeprom = cSetPara;
                        ptr_to_eeprom = 2;
                        *ptr_to_eeprom = cSetPara;
                }
                SaveSetPara();
                bShowType = cSetPara;
                cSetParaNo++;
                if(cSetParaNo == 2)
                {
                        cSetBit = 2;
                        bSetTemp = 1;
                }
                if(cSetParaNo >= 4)
                {
                        cSetParaNo = 0;
                        bSetPara = 0;
                        ShowSetTemp();
                }
                else
                        ShowSetPara();       
        }
        else
                cKeyShiftTime = 0;
}

void KeyInputProc(void)
{
        unsigned int i;
       
        if((bSetTemp == 0) && (bSetPara == 0)&&(bHeatDisable == 0))
        {
                cShowAdjustTime = 10;
                bShowAdjust = 1;
                if(cSetPara >= 1100)
                {
                        i = cSetPara - 1100;
                        cDispBuf = 11;
                }
                else if(cSetPara >= 1000)
                {                        
                        i = cSetPara - 1000;                                               
                        cDispBuf = 10;
                }
                else if(cSetPara >= 100)
                {                        
                        i = cSetPara - 100;                                               
                        cDispBuf = 1;
                }
                else         
                {
                        cDispBuf = 0;
                        i = cSetPara;
                }   
                if(i != 0)
                {
                        cDispBuf = i % 10;
                        cDispBuf = i / 10;
                }
                else
                {
                        cDispBuf = 0;
                        cDispBuf = 0;                                               
                }
        }
}

void SaveSetPara(void)
{
        ptr_to_eeprom = 4 + 2 * cSetParaNo;
        *ptr_to_eeprom = cSetPara;
}

void ShowSetPara(void)
{            

        switch(cSetParaNo)
        {
                case 0:                  
                        cDispBuf = 1;
                        cDispBuf = 19;
                        if((cSetPara) == 0)
                                cDispBuf = 12;
                        else
                                cDispBuf = 13;
                        break;
                case 1:                  
                        cDispBuf = 2;
                        if((cSetPara) == 2)
                        {
                                cDispBuf = 3;
                                cDispBuf = 0;
                        }
                        else if((cSetPara) == 1)
                        {
                                cDispBuf = 1;
                                cDispBuf = 0;
                        }
                        else               
                        {
                                cDispBuf = 19;
                                cDispBuf = 0;
                        }
                        break;
                case 2:   
                        cDispBuf = cSetPara / 100;
                        cDispBuf = (cSetPara % 100) / 10;
                        cDispBuf = cSetPara % 10;
                        break;
                case 3:      
                        cDispBuf = 4;               
                        cDispBuf = 19;
                        if((cSetPara) == 0)
                                cDispBuf = 0;
                        else
                                cDispBuf = 1;
                        break;               
                default :
                        break;
        }
}

void CheckReceive(void)
{                  
        if(b10ms)
        {
                cOldPINB = cDataPINB;
                cDataPINB = PINB;
                /*if((bSetTemp == 0) && (cOldPINB & 0x8) && (!(cDataPINB & 0x8))
                        && (bSetPara == 0))
                {
//                        bHeatOK = 0;
                        bSetTemp = 1;
                        cSetBit = 2;
                        ShowSetTemp();               
                }*/
                if((bSetTemp == 0) && (cOldPINB & 0x8) && (!(cDataPINB & 0x8))
                        && (bSetPara == 0))
                //if(((bSetTemp == 0) && ((PINB & 0x8) == 0 )&&(cOldPINB != cDataPINB)
                //        && (bSetPara == 0)))
                {      
                     
                                    bHeatOK = 0;
                                    bSetTemp = 1;
                                    cSetBit = 2;
                                //cCheckTimeA = 0;
                                //SpeakOn();
                                   //cSpeakTime = 20;
                                ShowSetTemp();
                                //return;
                       
                       
                                        
                }
               
             /*   if(((bSetTemp == 1)&& (cOldPINB & 0x8)&&(!(cDataPINB & 0x8)))||((bSetPara ==1)
                  &&(cOldPINB & 0x8)&&(!(cDataPINB & 0x8))))
                {         
                                 
                               bSetTemp = 0;
                               bSetPara = 0;
                               cSetParaNo = 0;
                               bInputAdjust = 0;
                               //cCheckTimeB = 0;
                               SpeakOn();
                               cSpeakTime =20;
                               ShowSetTemp();
                               
                               
                      
                }*/
        }
}

void CheckKey(void)
{
        unsigned char key;         
        unsigned int i;
       
        key = ~PINC;
        key &= 0x3c;
        if(key != 0)
        {
                if(cKeyTime == 0x80)       
                {         
                        if((bSetTemp == 1) || (bSetPara == 1) || (bInputAdjust == 1))
                                return;
                        if((key == 0x10) && (bSetTemp == 0)&& ((PINB & 0x8) == 0))
                        {
                                if(b10ms)
                                        if(++cKeyShiftTime > 100)
                                        {
//                                                bHeatOK = 0;
                                                bSetTemp = 1;
                                                cSetBit = 2;
                                                ShowSetTemp();
                                        }
                        }
                        if((key == 0x20) && (bInputAdjust != 1))
                        {
                                if(b10ms)
                                        if(++cKeyInputTime > 100)
                                        {
                                                if((cSetPara == 0) && ((PINB & 0x8) == 0) ||
                                                        (cSetPara == 1))
                                                {
//                                                        bHeatOK = 0;
                                                        bSetTemp = 1;
                                                        cSetBit = 2;
                                                        bInputAdjust = 1;
                                                        if(cSetPara >= 1100)
                                                        {
                                                                i = cSetPara - 1100;
                                                                cDispBuf = 11;
                                                        }
                                                        else if(cSetPara >= 1000)
                                                        {                        
                                                                i = cSetPara - 1000;                                               
                                                                cDispBuf = 10;
                                                        }
                                                        else if(cSetPara >= 100)
                                                        {                        
                                                                i = cSetPara - 100;                                               
                                                                cDispBuf = 1;
                                                        }
                                                        else         
                                                        {
                                                                cDispBuf = 0;
                                                                i = cSetPara;
                                                        }   
                                                        if(i != 0)
                                                        {
                                                                cDispBuf = i % 10;
                                                                cDispBuf = i / 10;
                                                        }
                                                        else
                                                        {
                                                                cDispBuf = 0;
                                                                cDispBuf = 0;                                               
                                                        }
                                                }
                                        }
                        }
                        return;
                }
                if(b10ms)
                {
                        if(++cKeyTime >= 8)
                        {                     
                                cKeyTime = 0x80;
                                if(bSleep == 1)
                                {
                                        bSleep = 0;
                                        cCloseTime = 0;
                                        bHeatOK = 0;
                                        return;
                                }
                                if(key == 0x4)
                                        KeyUpProc();
                                else if(key == 0x8)
                                        KeyDownProc();
                                else if(key == 0x10)
                                        KeyShiftProc();
                                else if(key == 0x20)
                                        KeyInputProc();
                                else
                                        cKeyTime = 0;
                        }
                }
        }
        else
        {
                cKeyTime = 0;
                cKeyShiftTime = 0;                           
                cKeyInputTime = 0;
        }
}        // unsigned char CheckKey(void)

void WatchDog(void)
{
        // Watchdog Timer initialization
        // Watchdog Timer Prescaler: OSC/2048k
        WDTCR = 0x1F;
        WDTCR = 0x0F;
}

void ShowSetTemp(void)
{
        cDispBuf = cSetPara % 10;
        cDispBuf = (cSetPara %100) / 10;
        cDispBuf = cSetPara / 100;
}

void ClosePowerProc(void)
{      
        static unsigned char cHeatTime = 0;

        if((bCloseCount == 1) && (b100ms == 1) && (cSetPara != 0))
        {                               
                cCloseTime++;
                if(cSetPara == 2)
                {
                        if((cCloseTime >= 8500) && (bClosePower == 0))
                        {
                                HeatDisable();
                                bClosePower = 1;
                                SpeakOn();
                                cSpeakTime = 20;
                                cSpeakOnTimer = 6;
                        }
                }
                else if(((cSetPara >= 300) && (cSetPara == 0))
                        || ((cSetPara >= 600) && (cSetPara == 1)))
                {
                        if((cCloseTime >= 4300) && (bSleep == 0))
                        {
                                bSleep = 1;
                                SpeakOn();
                                cSpeakTime = 20;
                                cCloseTime = 0;
                        }
                }
        }
}

void InitEEPROM(void)
{
        unsigned int m,k;
       
        for(m = 0; m++;m < 1000)
                for(k = 0; k++;k < 1000);
       
        ptr_to_eeprom = 30;
        m = *ptr_to_eeprom;
        ptr_to_eeprom = 32;
        k = *ptr_to_eeprom;

        ptr_to_eeprom = 30;
        m = *ptr_to_eeprom;
        ptr_to_eeprom = 32;
        k = *ptr_to_eeprom;
       
        if((m != 0x11) && (k != 0x22))
        {
                ptr_to_eeprom = 30;
                *ptr_to_eeprom = 0x11;
                ptr_to_eeprom = 32;
                *ptr_to_eeprom = 0x22;
               
                ptr_to_eeprom = 0;
                *ptr_to_eeprom = 350;
                ptr_to_eeprom = 2;
                *ptr_to_eeprom = 0;
                ptr_to_eeprom = 4;
                *ptr_to_eeprom = 0;
                ptr_to_eeprom = 6;
                *ptr_to_eeprom = 0;
                ptr_to_eeprom = 8;
                *ptr_to_eeprom = 150;
                ptr_to_eeprom = 10;
                *ptr_to_eeprom = 0;
        }       
}

void TempAdj(void)
{
   
      
                switch( cSetPara/10)
                {
                         case 20:
                              cSampleVal -= 209;
                              break;
                        
                        
                         case 21:
                              cSampleVal -= 201;
                              break;
                        
                         case 22:
                              cSampleVal -= 197;
                              break;
                        
                         case 23:
                              cSampleVal -= 190;
                              break;
                        
                         case 24:
                              cSampleVal -= 182;
                              break;
                           
                        case 25:
                              cSampleVal -= 170;
                              break;
                        
                         case 26:
                              cSampleVal -= 162;
                              break;
                        
                        
                         case 27:
                              cSampleVal -= 159;
                              break;
                        
                         case 28:
                              cSampleVal -= 150;
                              break;
                        
                         case 29:
                              cSampleVal -= 141;
                              break;
                        
                         case 30:
                              cSampleVal -= 132;
                              break;
                           
                        case 31:
                              cSampleVal -= 121;
                              break;
                        
                        
                        
                        
                        
                                             
                        case 32:
                              cSampleVal -= 112;
                              break;
                        
                        case 33:
                              cSampleVal -= 101;
                              break;
                        
                        case 34:
                              cSampleVal -= 91;
                              break;
                        
                        case 35:
                              cSampleVal -= 82;
                              break;
                        
                        case 36:
                              cSampleVal -= 75;
                              break;   
                        case 37:
                              cSampleVal -= 68;
                              break;
                        
                        case 38:
                              cSampleVal -= 60;
                              break;
                        
                        case 39:
                              cSampleVal -= 50;
                              break;
                        
                        case 40:
                              cSampleVal -= 40 ;
                              break;
                        
                        case 41:
                              cSampleVal -= 37;
                              break;
                        case 42:
                              cSampleVal -= 25;
                              break;
                        
                        case 43:
                              cSampleVal -= 18;
                              break;
                        
                        case 44:
                              cSampleVal -= 11;
                              break;
                        
                        case 45:
                              cSampleVal += 1;
                              break;
                        
                        default:
                              break;         
                }
      
}


void ReadADCSample(void)
{
        unsigned int i,adc_data;
               
//        cOldTemp = cSampleVal;
        if(bHeatOK == 0)
        {
                if(b100ms == 1)
                {
                        HeatDisable();
                        adc_data = read_adc(0);
                        adc_data = 0;
                        for(i = 0;i < 2; i++)
                                adc_data += read_adc(0) + 190;
                        cSampleVal = (adc_data >> 1);
                        if(bHeatDisable == 0)
                        HeatEnable();               
                }   
                else
                        return;
        }
        else                                                
        {   
                if(b40ms == 1)
                {
                        HeatDisable();      
                        adc_data += read_adc(0);                         
                        adc_data = 0;
                        for(i = 0;i < 2; i++)
                                adc_data += read_adc(0);
                        cSampleVal = (adc_data >> 1) + 190;
                        if(cSampleVal > 190)
                                TempAdj();
                      
                      
                }
                else
                        return;
        }               
        if(cSampleVal > 720)
        {        bAlarm = 1;
                  HeatDisable();       
        }
        else
                bAlarm = 0;
       
       
       
           //if(cSetPara == 0)
           if(bShowType == 0)
           {
                cSampleVal *= 5;
                cSampleVal /= 7;
                cControlVal = 1;
        }
           else
           {
            cSampleVal *= 9;
                cSampleVal /= 7;
           cSampleVal += 32;
                   cControlVal = 2;          
        }
        if(cSampleVal <= (cControlTemp - 32))
        {
                
                bTempDown = 1;
        }
        if(bTempDown == 1)
        {
                cControlTemp = cControlTemp + 10;
             // cControlTemp = cControlTemp ;
                if(cSampleVal > cControlTemp)
                {
                      bTempDown = 0;
                }
        }
           if((cSampleVal <= (cControlTemp - cControlVal)) && (bClosePower == 0)
                   && ((bSetTemp == 0) ||
                   ((bSetTemp == 1)&& (bSetPara ==1))||
                   ((bSetTemp == 1)&& (bInputAdjust == 1))))
           {                                       
                   if((!(PORTB & 0x10)) && (bAlarm == 0)&&(bHeatEn == 1)&&(bHeatDisable == 0))
                   {
                           cSlpTimer++;
                           HeatEnable();
                   }
           }
           if(((bSetTemp == 1)&&(bSetPara == 0)&&(bInputAdjust == 0))||(cSampleVal >= cControlTemp))
                   HeatDisable();
          
          
        if(cSampleVal <= (cControlTemp - 30))
        {
                bCloseCount = 0;
                cCloseTime = 0;
        }
        else
                bCloseCount = 1;
               
        if((bHeatOK == 1) && (bSleep == 0) && (bClosePower == 0))
        {
                if((cSampleVal < (cControlTemp - cSetPara)))
                {        bHeatError = 1;                                  
                        HeatEnable();
                }
                   else
                           bHeatError = 0;
           }
}

// Declare your global variables here
void main(void)
{
        // Declare your local variables here
    unsigned char i;
   
        // Input/Output Ports initialization
        // Port B initialization
        // Func7=In Func6=In Func5=Out Func4=Out Func3=In Func2=Out Func1=Out Func0=Out
        // State7=P State6=P State5=1 State4=1 State3=P State2=1 State1=1 State0=1
        PORTB = 0xF7;
        DDRB = 0xb7;

        // Port C initialization
        // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=In
        // State6=P State5=P State4=P State3=P State2=P State1=1 State0=P
        PORTC = 0x7F;
        DDRC = 0x0;

        // Port D initialization
        // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
        // State7=1 State6=1 State5=1 State4=1 State3=1 State2=1 State1=1 State0=1
        PORTD = 0xFF;
        DDRD = 0xFF;

        // Timer/Counter 0 initialization
        // Clock source: System Clock
        // Clock value: Timer 0 Stopped
        TCCR0 = 0x00;
        TCNT0 = 0x00;

        // Timer/Counter 1 initialization
        // Clock source: System Clock
        // Clock value: 1000.000 kHz
        // Mode: Normal top=FFFFh
        // OC1A output: Discon.
        // OC1B output: Discon.
        // Noise Canceler: Off
        // Input Capture on Falling Edge
        TCCR1A=0x00;
        TCCR1B=0x01;
        TCNT1H = 0xFC;
        TCNT1L = 0x17;
        ICR1H=0x00;
        ICR1L=0x00;
        OCR1AH=0x00;
        OCR1AL=0x00;
        OCR1BH=0x00;
        OCR1BL=0x00;

        // Timer/Counter 2 initialization
        // Clock source: System Clock
        // Clock value: Timer 2 Stopped
        // Mode: Normal top=FFh
        // OC2 output: Disconnected
        ASSR = 0x00;
        TCCR2 = 0x00;
        TCNT2 = 0x00;
        OCR2 = 0x00;

        // External Interrupt(s) initialization
        // INT0: Off
        // INT1: Off
        MCUCR = 0x00;

        // Timer(s)/Counter(s) Interrupt(s) initialization
        TIMSK = 0x04;

        ACSR=0x80;
        SFIOR=0x00;

        // ADC initialization
        // ADC Clock frequency: 62.500 kHz
        // ADC Voltage Reference: AREF pin
        // ADC High Speed Mode: Off
        ADMUX=ADC_VREF_TYPE;
        ADCSRA=0x87;
        SFIOR&=0xEF;
/*
        // Analog Comparator initialization
        // Analog Comparator: Off
        // Analog Comparator Input Capture by Timer/Counter 1: Off
        // Analog Comparator Output: Off
        ACSR=0x80;
        SFIOR=0x00;

        // ADC initialization
        // ADC Clock frequency: 62.500 kHz
        // ADC Voltage Reference: AREF pin
        // ADC High Speed Mode: Off
        ADMUX=ADC_VREF_TYPE;
        ADCSRA=0x84;
        SFIOR&=0xEF;
*/       
        WatchDog();
               
        InitEEPROM();
        #asm("WDR");
       
        for(i = 0; i < 10; i++)
        {
                ptr_to_eeprom = (i << 1);
                cSetPara = *ptr_to_eeprom;
        }
        cZphOld = cZphNew;
        cZphNew = PINC.1;
        if(PINC.1 == 0)
        {                  
          HeatDisable();   
          bHeatDisable = 1;
                   
        }                                 
        if(cSetPara >1)
                cSetPara = 0;
        if((cSetPara > 450) && (cSetPara == 0))
        {
                cSetPara = 350;
                cSetPara = 0;
        }
        else if((cSetPara > 842) && (cSetPara == 1))
        {
                cSetPara = 700;
                cSetPara = 0;       
        }
        if(((PINB & 0x8) == 0)&&(PINC.2 == 0)&&(PINC.3 == 0))
//        if((~PINC) & 0xc)
        {                           
                cSetParaNo = 0;
                bSetPara = 1;
                ShowSetPara();
        }
        else
                ShowSetTemp();
        bShowType = cSetPara;
        HeatDisable();   
        cSampleVal = 25;
        cFirstOpen = 7;   
        bFirstOpen = 1;                       

        // Global enable interrupts
        #asm("sei")

        while (1)
    {
           // Place your code here
                #asm("WDR");
           TimeProc();
        ClosePowerProc();                                     
           CheckKey();
           CheckReceive();
        if(cSetPara >= 1000)          
                cControlTemp = 1000 + cSetPara - cSetPara;
        else
                cControlTemp = cSetPara + cSetPara;                                       
        if(bSleep == 1)   
        {
                if(cSetPara == 0)            
                            cControlTemp = 200;
                else
                            cControlTemp = 400;
        }
        ReadADCSample();                          
           if((bSetTemp == 0) && (bSetPara == 0) && (bShowAdjust == 0)
                   && (b100ms == 1))
           {
                   if(bClosePower == 1)
                   {
                           // display "- - -"
                                   cDispBuf = 10;
                                   cDispBuf = 10;
                                   cDispBuf = 10;                  
                   }
                   else if(bFirstOpen == 1)
                           {      
                       //display"8.8.8."
                        cDispBuf = 20;
                           cDispBuf = 20;
                           cDispBuf = 20;                  
                       }
               else if (PINC.1 == 0)
                       {
                        bHeatDisable = 1;
                      
                       SpeakOn();
                         //display"H.S.E."
                         if(cBlinkTime & 0x80)
                               {
                                cDispBuf = 17;
                                   cDispBuf = 14;
                                   cDispBuf = 18;
                                   }
                                   else
                                    {
                                cDispBuf = 19;
                                   cDispBuf = 19;
                                   cDispBuf = 19;
                                   }
                           }
                   else if (PINB.6 == 1)
                         // display"C-E"
                   {      
                           SpeakOn();
                           if(cBlinkTime & 0x80)
                               {
                                 cDispBuf = 12;
                                   cDispBuf = 10;
                                   cDispBuf = 18;
                             }
                                     else
                                   {
                                           cDispBuf = 19;
                                           cDispBuf = 19;
                                           cDispBuf = 19;                                  
                                   }
                }
                   else if(bAlarm == 1)
                           {   
                           SpeakOff();   
                                   if(cBlinkTime & 0x80)
                                   {            
                                           // display "S - E"
                                           cDispBuf = 14;
                                           cDispBuf = 10;
                                           cDispBuf = 18;
                                   }
                                   else
                                   {
                                           cDispBuf = 19;
                                           cDispBuf = 19;
                                           cDispBuf = 19;                                  
                                   }
                           }
                   else if(bHeatError == 1)
                   {                     
                                   if(cBlinkTime & 0x80)
                                   {            
                                     // display "H - E"
                                           cDispBuf = 17;
                                           cDispBuf = 10;
                                           cDispBuf = 18;                  
                                   }
                                   else
                                   {
                                           cDispBuf = 19;
                                           cDispBuf = 19;
                                           cDispBuf = 19;                                  
                                   }
                   }
                  
                else if(bSleep == 1)
                {
                                   // display "S L P"
                                   cDispBuf = 14;
                                   cDispBuf = 15;
                                   cDispBuf = 16;                                                     
                }
                   else if((bHeatOK == 0) || (bDownLimit == 1) || (bUpLimit == 1))
                   {
                             cDispBuf = cSampleVal / 100;
                             cDispBuf = cSampleVal % 100/10;
                           cDispBuf = cSampleVal % 10;
                   }   
                   else
                   {
                                   ShowSetTemp();
                                   //cDispBuf = cSampleVal / 100;
                                   //cDispBuf = cSampleVal % 100/10;
                                 //cDispBuf = cSampleVal % 10;
                   }
           }
           if(cSampleVal < (cControlTemp - 30*(cSetPara+1)))
           {      
                   if(b100ms)
                   {
                         if(++cDownLimit >= 2)
                         {
                                   bDownLimit = 1;
                                   cDownLimit = 0;
                         }
                   }
          }                   
                  
           else
                   bDownLimit = 0;
           if(cSampleVal > (cControlTemp + 30*(cSetPara+1)))
                   bUpLimit = 1;
           else
                   bUpLimit = 0;       
          if((bHeatOK == 0) && (bSetTemp == 0) && (bAlarm == 0)
                           && (cSampleVal >= cControlTemp))
                   {                     
                           bDownLimit = 0;
                           bHeatOK = 1;
                           SpeakOn();
                           cSpeakTime = 20;
                           ShowSetTemp();
                   }
    }
}

BCE312 发表于 2011-9-24 22:35:42

学习。

zhuangchao123 发表于 2011-9-24 23:24:25

楼主强大我跟楼主学习

wangyj173 发表于 2011-10-10 23:53:11

学习。。。。。。。。
真的成品焊台很可能没用PID控制

huanglei 发表于 2011-10-11 10:03:13

回复【186楼】wangyj173
学习。。。。。。。。
真的成品焊台很可能没用pid控制
-----------------------------------------------------------------------

是的,至少热风抢没有,直接可控硅控制.

zhanghj022 发表于 2011-10-11 10:43:18

mark!hao tie zi

QRAHAO 发表于 2011-12-19 13:03:42

马克!

catshit_one 发表于 2011-12-19 23:46:49

mark

dingliming 发表于 2012-1-17 10:15:00

太好了

153290557 发表于 2012-1-18 21:14:48

大家注意:这个是我刚学单片机弄的,问题特多!有很多错误,时间太长,很多忘了,无法修正!

gxy508 发表于 2012-1-19 13:39:51

markmark

senbaby2 发表于 2012-2-13 19:37:20

不管怎么样,先留着

telishuma 发表于 2012-2-14 11:04:11

回复【30楼】153290557 啊峰
-----------------------------------------------------------------------

你这样的PWM 是乱控制可控硅的,可控硅要有过零起始为标记来开启角度达到控制电压,做控制下马达或灯泡你就发现问题了。

li168 发表于 2012-2-23 15:13:29

回复【145楼】he969240
-----------------------------------------------------------------------

学习中,能把937电路图和HEX资料发给我吗?谢谢!(QQ:413903466)

fydzaa 发表于 2012-3-1 01:35:56

收藏

GIKE 发表于 2012-3-1 02:31:47

make

xdco 发表于 2012-3-1 09:41:01

make

lhxr 发表于 2012-3-1 10:12:17

最好用mos管,效率高

dearterry30 发表于 2012-3-1 12:12:04

mark

hymculolo 发表于 2012-3-1 15:44:55

mark
页: 1 [2] 3
查看完整版本: 936焊台用AVR模糊PID恒温控制,图