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