痞酷網_PIGOO

 找回密碼
 立即註冊
!!! [系統偵測到廣告阻擋軟體] !!!

如果您覺得痞酷網對您有些許幫助,或者您認同痞酷網的理想,

那麼希望您將痞酷網設定為白名單.

並請在上論壇的時候,動動您的手指,用行動支持我們.

謝謝!
查看: 6255|回復: 28

自製控溫烙鐵的問題求助!!

  [複製鏈接]
發表於 2013-1-22 14:48:02 | 顯示全部樓層 |閱讀模式
控溫烙鐵程式撰寫過程中,陸續出了幾個問題, 溫度變化過大,系統會LOCK ...
1.溫度變化過大,一加熱旁邊的溫度SENSOR立即反應,上升速度快,還沒反映到烙鐵頭又要降溫了,有人把溫度程式做了平均化,如此就比較不會有太大變異,甚至把最高最低去除..
2.加溫方面,60HZ的SSR加熱每一個週期 16ms,若是加熱的動作時間沒配合好,或許空溫會不準. 可能會改回去使用 DC+MOSFET..
3.系統LOCK著問題,雖然加入看門狗可以自動RESET但是問題仍需要找出來,溫度設定上面一但高到400度,AD到200(0~255)就容易發生,我把溫度固定在400還是發生,可見是 TC 讀取的地方出問題...

void main(void)
{
Init_Timer0();//起始定時器
LCD_Init();// LCM 啟動
LCD_Clear();//LCM清屏
//sprintf(DisplayWord," AD data %5d",00000);//顯示AD為零
Fire=1;//OFF Power
WDT_CONTR = 0x3d;//餵狗2.27s
while(1)
{
  if(TimeFlag==1)//每1000Ms 更新一次
  {
    TimeFlag=0;//清除定時旗標
    if(SH_flag==1)// show flag
      {
       SH_flag=0;
      // sprintf(DisplayWord,"SET:%3d TC:%3d",(int)ADTT,(int)ADT);// ADT熱偶溫度 ADTT設定溫度顯示第一組的計數 第二組的計數
DisplayWord[0]=' ';
DisplayWord[1]='S';//Tab[IRcord[0]/16];
DisplayWord[2]='E';//Tab[IRcord[0]%16];
DisplayWord[3]='T';
DisplayWord[4]='=';//time_buf1[5]/10+'0';
DisplayWord[5]= ADTT/100+'0';
DisplayWord[6]= ADTT/10%10+'0';
DisplayWord[7]= ADTT%10%10+'0';
DisplayWord[8]= ' ';
DisplayWord[9]= 'T';
DisplayWord[10]='C';
DisplayWord[11]=':';
DisplayWord[12]= ADT/100+'0';;
DisplayWord[13]= ADT/10%10+'0';
DisplayWord[14]= ADT%10%10+'0';
DisplayWord[15]=' ';

// ADT熱偶溫度 ADTT設定溫度顯示第一組的計數 第二組的計數

       LCD_Write_String(0,0, DisplayWord);//顯示在第一行
       SV=ADTT*1.5+200;AV=ADT*2.0;//20130109 設定值增加100度
//       sprintf(DisplayAWord,"SET=%3.0f TC=%3.0f",(int)ADTT*1.5+200,(int)ADT*2.0);//轉換成電壓 和 溫度
DisplayWord[0]=' ';
DisplayWord[1]='S';//Tab[IRcord[0]/16];
DisplayWord[2]='E';//Tab[IRcord[0]%16];
DisplayWord[3]='T';
DisplayWord[4]='=';//time_buf1[5]/10+'0';
DisplayWord[5]= SV/100+'0';
DisplayWord[6]= SV/10%10+'0';
DisplayWord[7]= SV%10%10+'0';
DisplayWord[8]= ' ';
DisplayWord[9]= 'T';
DisplayWord[10]='C';
DisplayWord[11]=':';
DisplayWord[12]= AV/100+'0';;
DisplayWord[13]= AV/10%10+'0';
DisplayWord[14]= AV%10%10+'0';
DisplayWord[15]=' ';

       //sprintf(DisplayAWord,"SET=%3.0f TC=%3.0f",(int)SV,(int)AV);//20130101
       LCD_Write_String(0,1, DisplayWord);//顯示在第二行
                Fireout();
                WDT_CONTR = 0x3d;//餵狗
      }
  
  }
     if(AV>450)
   {
     Fire=1;
   }

}      
}
發表於 2013-1-22 15:10:18 | 顯示全部樓層
一般的控溫是控制電熱線還是烙鐵頭的溫度?我設計的話,我會把溫度ic放在烙鐵頭附近(也許電熱線也在放一顆),等烙鐵頭達到我要的溫度時,再pwm 60hz的電源,以維持烙鐵頭最佳焊接溫度。等溫度達到我設定時,led亮起,再拿出來焊接。
發表於 2013-1-22 15:17:36 | 顯示全部樓層
用溫度ic好像太豪華了。
發表於 2013-1-22 15:24:25 | 顯示全部樓層
或是先pwm電源,讓溫度緩緩上升。
 樓主| 發表於 2013-1-22 16:05:54 | 顯示全部樓層
單晶片微電腦 發表於 2013-1-22 03:24 PM static/image/common/back.gif
或是先pwm電源,讓溫度緩緩上升。

單晶片微電腦大:
   60hz交流好像都使用調點火角度,直流才可以調PWM吧!! 現在還有溫度過高惠LOCK的問題,最嚴重!!
發表於 2013-1-22 16:34:25 | 顯示全部樓層
看起來這段程序是簡單的on-off控制算法
表現應該很難達到你的期望
如果希望好一些
試試看pd或pi甚至pid算法
 樓主| 發表於 2013-1-22 17:50:29 | 顯示全部樓層
xiaolaba 發表於 2013-1-22 04:34 PM static/image/common/back.gif
看起來這段程序是簡單的on-off控制算法
表現應該很難達到你的期望
如果希望好一些

xiaolaba 大:
    數學+程式 太難了!! I D 都和時間的變化有關,不要說寫程式,光是數學式就看不懂!!
發表於 2013-1-22 19:22:13 | 顯示全部樓層
本帖最後由 xiaolaba 於 2013-1-22 07:23 PM 編輯
antlu 發表於 2013-1-22 05:50 PM static/image/common/back.gif
xiaolaba 大:
    數學+程式 太難了!! I D 都和時間的變化有關,不要說寫程式,光是數學式就看不懂!! ...



那大大你覺得寫C很難嗎
其實用MCU加上C
pid並不難
但是要寫得出色
那是要理解一些數學
特別是要做COMMISSIONING之際
但是要寫成能用
相對於LCD驅動
並不難
 樓主| 發表於 2013-1-22 20:54:11 | 顯示全部樓層
xiaolaba 發表於 2013-1-22 07:22 PM static/image/common/back.gif

那大大你覺得寫C很難嗎
其實用MCU加上C

九九乘法!! 對有些人還是難!!
發表於 2013-1-22 21:55:02 | 顯示全部樓層
昏倒! 完全看不懂,阿乾師果然是狠腳色
 樓主| 發表於 2013-1-22 22:12:18 | 顯示全部樓層
本帖最後由 antlu 於 2013-1-22 10:16 PM 編輯

一些經驗:
   烙鐵的加熱特性對於 溫控來說也是一個重要的變數,瓦特數高低決定加熱的 PWM 比例,設定溫度與環境的差異也要考慮,比如說 控溫在200度與400度絕對不相同的加熱比例,就算是設定溫度與實際溫度相差的度數相同,輸出的DUTY CYCLE也會有差別,..
*********目前還在跟系統當掉奮戰中***********

設定            實際
200           196~224
250           232~260
350           328~356
400           360~4XX 系統跳機

void fir30(void)
{
Fire=0;
DelayMs(10+AVOS);
Fire=1;
DelayMs(3);
}

//當差異20度時候輸出10%
void fir10(void)
{
Fire=0;
DelayMs(6+AVOS);
Fire=1;
DelayMs(6);
}

//當差異5度時候 輸出2%
void fir2(void)
{
Fire=0;
DelayMs(5+AVOS);
Fire=1;
DelayMs(10);
}

void Fireout (void)
{
signed int Difv;
Difv=SV-AV;
AVOS=AV/100;//temp offset compensator
if(Difv>50)
Fire=0;//全輸出
if(Difv>20&&Difv<50)
fir30();//30%
if(Difv>5&&Difv<20)
fir10();//10%
  if(Difv>0&&Difv<5)
fir2();//5%
  if(Difv<0)
Fire=1;// 全關閉輸出
}


void main(void)
{
Init_Timer0();//起始定時器
LCD_Init();// LCM 啟動
LCD_Clear();//LCM清屏
//sprintf(DisplayWord," AD data %5d",00000);//顯示AD為零
Fire=1;//OFF Power
WDT_CONTR = 0x3d;//餵狗2.27s
while(1)
{
     if(AV>450)
   {
     Fire=1;
   }

  if(TimeFlag==1)//每140Ms 更新一次
  {
    TimeFlag=0;//清除定時旗標
    if(SH_flag==1)// show flag
      {
       SH_flag=0;
      // sprintf(DisplayWord,"SET:%3d TC:%3d",(int)ADTT,(int)ADT);// ADT熱偶溫度 ADTT設定溫度顯示第一組的計數 第二組的計數
        DisplayWord[0]=' ';
        DisplayWord[1]='S';//Tab[IRcord[0]/16];
        DisplayWord[2]='E';//Tab[IRcord[0]%16];
        DisplayWord[3]='T';
        DisplayWord[4]='=';//time_buf1[5]/10+'0';
        DisplayWord[5]= ADTT/100+'0';
        DisplayWord[6]= ADTT/10%10+'0';
        DisplayWord[7]= ADTT%10%10+'0';
        DisplayWord[8]= ' ';
        DisplayWord[9]= 'T';
        DisplayWord[10]='C';
        DisplayWord[11]=':';
        DisplayWord[12]= ADT/100+'0';;
        DisplayWord[13]= ADT/10%10+'0';
        DisplayWord[14]= ADT%10%10+'0';
        DisplayWord[15]=' ';

// ADT熱偶溫度 ADTT設定溫度顯示第一組的計數 第二組的計數

       LCD_Write_String(0,0, DisplayWord);//顯示在第一行
       SV=ADTT*1.5+200;AV=ADT*2.0;//20130109 設定值增加100度

//       sprintf(DisplayAWord,"SET=%3.0f TC=%3.0f",(int)ADTT*1.5+200,(int)ADT*2.0);//轉換成電壓 和 溫度
        DisplayWord[0]=' ';
        DisplayWord[1]='S';//Tab[IRcord[0]/16];
        DisplayWord[2]='E';//Tab[IRcord[0]%16];
        DisplayWord[3]='T';
        DisplayWord[4]='=';//time_buf1[5]/10+'0';
        DisplayWord[5]= SV/100+'0';
        DisplayWord[6]= SV/10%10+'0';
        DisplayWord[7]= SV%10%10+'0';
        DisplayWord[8]= ' ';
        DisplayWord[9]= 'T';
        DisplayWord[10]='C';
        DisplayWord[11]=':';
        DisplayWord[12]= AV/100+'0';;
        DisplayWord[13]= AV/10%10+'0';
        DisplayWord[14]= AV%10%10+'0';
        DisplayWord[15]=' ';

       LCD_Write_String(0,1, DisplayWord);//顯示在第二行
                WDT_CONTR = 0x3d;//餵狗
      }
  }

          Fireout();//改到外環有改過******
}      
}

發表於 2013-1-22 23:11:52 | 顯示全部樓層
antlu 發表於 2013-1-22 08:54 PM static/image/common/back.gif
九九乘法!! 對有些人還是難!!

既然比9x9 難

那參考這個 1+1 看看..

http://brettbeauregard.com/blog/ ... s-pid-introduction/
發表於 2013-1-22 23:21:07 | 顯示全部樓層
本帖最後由 xiaolaba 於 2013-1-22 11:37 PM 編輯

有沒有加光藕隔離市電再取樣ADC ? 可能 MCU 的特性不強健就容易出問題, 例如有用過一些 STC 的, 曾經有時候會莫名其妙的.

或者你的 ADC 是單路多通道的, 沒用的 ADC 腳不要懸空.

基本上, 建議所有 MCU 的沒用的腳都要 PULL UP 或 PULL DOWN, 不管 I/O 或是 ADC

電源要退偶良好, 多用幾個 0.1UF 的就好

這樣會少一些彎路

參考看看

還有補充一點, 既然你有 MCU 也有 ADC 結果, 輸出到 RS232, 用 hyper terminal 或 EXCEL, 把數據記錄, 再把數據化成圖表, 就很容易看到你的系統是在震盪狀態還是受控了穩定. 祝你早日成功
借人家的圖片給你看看, 如果是這樣, 就不必繼續改程序了, 因為應該只能這樣
On-OFF_control.gif
 樓主| 發表於 2013-1-23 00:43:27 | 顯示全部樓層
xiaolaba 發表於 2013-1-22 11:21 PM static/image/common/back.gif
有沒有加光藕隔離市電再取樣ADC ? 可能 MCU 的特性不強健就容易出問題, 例如有用過一些 STC 的, 曾經有時候 ...

xiaolaba大:
   我的ADC是簡易的 利用 74373+R2R電阻 產生一個電壓再與 設定可變電阻產生的電壓 以及與熱偶放大電壓比較成為 0~255的數值,設定電壓分成 255段 熱偶電壓也分成 255段 設定電壓*1.5變成設定溫度,熱偶電壓*2成為熱偶溫度,利用兩者的相差值,來控制MOSFET... 相差溫度決定 ON/OFF的時間比例...

目前 熱偶溫度高過400就容易出現 系統卡住的現象,... 我除了驅動MOSFET之外其他都沒使用光偶合,電路圖我已經在 DIY區 PO過了請參考  http://bbs.pigoo.com/thread-42687-1-1.html
發表於 2013-1-23 01:36:16 | 顯示全部樓層
阿乾大,

你那Lock的問題有沒可能是數值溢位蓋到別的變數的關係啊?另外你那PWM控制的Difv在50, 20, 5, ...的數值好像都沒處理到喔。
 樓主| 發表於 2013-1-23 08:39:13 | 顯示全部樓層
kolinking 發表於 2013-1-23 01:36 AM static/image/common/back.gif
阿乾大,

你那Lock的問題有沒可能是數值溢位蓋到別的變數的關係啊?另外你那PWM控制的Difv在50, 20, 5, .. ...

kolinking大:
   感謝提示!! 我想辦法查查看 數值溢位蓋到別的變數的問題(還沒經驗) ,
  if(Difv>50)
Fire=0;//全輸出
if(Difv>20&&Difv<50)
fir30();//30%
if(Difv>5&&Difv<20)
fir10();//10%
  if(Difv>0&&Difv<5)
fir2();//5%
  if(Difv<0)
這一段沒作用嗎? 我看 LED 有變化ㄟ
難道   if(Difv>0 & Difv<5)
         fir2();//5%
        才對?
發表於 2013-1-23 08:44:56 | 顯示全部樓層
本帖最後由 ciko.ciko 於 2013-1-23 08:53 AM 編輯
antlu 發表於 2013-1-22 10:12 PM static/image/common/back.gif
一些經驗:
   烙鐵的加熱特性對於 溫控來說也是一個重要的變數,瓦特數高低決定加熱的 PWM 比例,設定溫度與 ...


阿乾大好,
1.一般以點火角度方式 來控制輸出功率較,較難達成溫度微控目的,且會造成微量電源干擾(非零點導通).
2.另一種調整方式,類似PWM方式,有空時也可試試.主要為PWM60Hz的ON/OFF周期數.如剛送電時(低溫狀態)設定16mS_ON的次數=100次(1.6S),OFF次數=10次(160mS),而後隨著溫度逐漸上升,降低ON的次數並增加OFF的次數(ON/OFF加總次數,可設定為一致),如此控制法,對於溫度的變化量,應較容易達成平滑效果.程式設定時,可先完成所有ON次數(ON_100次),再執行OFF次數(OFF_10次).最後再修改程式,將ON/OFF次數對稱分配(如執行10次ON,再執行1次OFF,共10次......),則效果更加.
發表於 2013-1-23 09:14:44 | 顯示全部樓層
antlu 發表於 2013-1-23 08:39 AM static/image/common/back.gif
kolinking大:
   感謝提示!! 我想辦法查查看 數值溢位蓋到別的變數的問題(還沒經驗) ,
  if(Difv>50)

不是啦,以語意來說
if(Difv>50)   跟  if(Difv>20&&Difv<50)
是Difv變數大於50跟difv變數大於20且小於50,都會讓if條件式成立
但是difv變數是50時沒有定義到,以下的情況也是
所以kolinking大才會說50 20 5 這幾個沒定義到

雖然我覺得因為difv變數會一直變動,,fir函數呼叫頂多只是在臨界點miss一次,沒影響才對
 樓主| 發表於 2013-1-23 10:18:45 | 顯示全部樓層
ciko.ciko 發表於 2013-1-23 08:44 AM static/image/common/back.gif
阿乾大好,
1.一般以點火角度方式 來控制輸出功率較,較難達成溫度微控目的,且會造成微量電源干擾(非零點導 ...

ciko.ciko大:
   先前使用 SSR 控制點火,我猜想他會有 ZERO CROSS 的設計,我之所以會把他改掉的原因是,在執行 DUTY CYCLE 的時候 因為16.6ms的關係,我覺得很難做到平順的比例控制, Ciko.ciko大建議的 ON/OFF 以16.6ms為BASE的方式我沒想到,於是我改回用 MOSFET驅動,這樣比較好寫程式.
   以前拆電子鍋 熱水瓶都會發現他們都有 60HZ檢知的輸入,因為這比較高深,所以我沒有嘗試去做...
我現在的情況有一點像是拿一隻燒紅的大鐵棒要去熱一杯500CC的水,溫度卻要控制在70~73度之間,因為又有溫度感知器把他安裝在水的表面,(不是在水杯的底部)傳熱太快了,我又性急於是拉上拉下很辛苦...
   一般的恆溫烙鐵都沒有顯示立即的溫度狀況,只用一個紅點來表示加溫,除非溫度差異很多時才會更新溫度顯示... 有人設計以多次平均溫度去除最高與最低...來作為控制依據,...
發表於 2013-1-23 10:53:15 | 顯示全部樓層
對啦,就跟conbawa大說的一樣。
if(Difv>50) 之後要用 if(Difv>20&&Difv<=50) 這樣才完全,不然Difv==50時就沒被處理了。不過即使沒處理到,實際執行確實不太會影響到。
發表於 2013-1-23 14:41:42 | 顯示全部樓層
opa電壓輸出跟取樣電路之間加RC低通電路看看,使快速上升的溫度能平緩一點。
發表於 2013-1-23 16:25:46 | 顯示全部樓層
antlu 發表於 2013-1-23 12:43 AM static/image/common/back.gif
xiaolaba大:
   我的ADC是簡易的 利用 74373+R2R電阻 產生一個電壓再與 設定可變電阻產生的電壓 以及與熱 ...

可以用直流的話. 先用24V電池試試看. 不要市電

看看到底是程序問題 (MCU 品牌也是有影響的), 還是市電在大的導通角度時引起尖峰電壓干擾, 因為你說用SSR (有過零開關的??), SET POINT 高才當機...!?

這個你也可以在 LCD 顯示一個加一的迴圈的計數顯示, 看看到底當機的機率是否有特徵. 沒用 DEBUGGER, 只能這樣試了, 應該可以縮小除錯的範圍

祝你成功.
 樓主| 發表於 2013-1-23 17:34:18 | 顯示全部樓層
單晶片微電腦 發表於 2013-1-23 02:41 PM static/image/common/back.gif
opa電壓輸出跟取樣電路之間加RC低通電路看看,使快速上升的溫度能平緩一點。 ...

感謝!! 我試試看!!
 樓主| 發表於 2013-1-23 17:45:58 | 顯示全部樓層
xiaolaba 發表於 2013-1-23 04:25 PM static/image/common/back.gif
可以用直流的話. 先用24V電池試試看. 不要市電

看看到底是程序問題 (MCU 品牌也是有影響的), 還是市電在 ...

xiaolaba大:
   外加直流沒問題,我已經把24V獨立接頭,隨時可以外加電源(包刮 5V也可以)!!
   外加DEBUG的程式,要慢慢想想看,檢查點如何放!! 現在問題在於 溫度讀出的部分, KOLINKING大的建議,溢位影響到變數的問題,會先檢查,感謝大家一路的支持...
發表於 2013-1-23 20:23:10 | 顯示全部樓層
阿乾大您的控溫烙鐵程式可用於您修過的烤箱控溫嗎?
 樓主| 發表於 2013-1-23 20:59:16 | 顯示全部樓層
santen 發表於 2013-1-23 08:23 PM static/image/common/back.gif
阿乾大您的控溫烙鐵程式可用於您修過的烤箱控溫嗎?

我認為這個溫控器若把SSR 加大一定可以用在 烤箱,原因: 1. 加熱器與感溫器位置離很遠 2.溫度只在 250度一定不會程式凍結 3.我有看門狗程式 這是60W的電路,烤箱都是 1200W以上 SSR要使用 15A以上,很多東西都要加大(電源線 SSR )..況且 烤箱溫度準確度不需要非常,一般溫度開關雙金屬片都OK,更何況我的是 熱偶!!
 樓主| 發表於 2013-1-23 23:44:34 | 顯示全部樓層
xiaolaba 發表於 2013-1-23 04:25 PM static/image/common/back.gif
可以用直流的話. 先用24V電池試試看. 不要市電

看看到底是程序問題 (MCU 品牌也是有影響的), 還是市電在 ...

xiaolaba大:
   有眉目了!! 我發現我的AD轉換成是很陽春,從零比到實際值若實際為 MAX 則要比255次每次 DELAY 1MS 這樣就會耗掉 255MS,假如 溫度設定+熱偶讀出 都是MAX 就要花掉510MS 溫度設定越高讀出時間耗費越長,所以會導致中斷做不完,也可能導致"溢位"現象或是TIME OUT現象,我把程式改了之後反應速度快多了,但是還是會偶發 LOCK著導致"看門狗"啟動!! 我是設定2個變數紀錄最後一次的D/A 計數,我認定溫度設定變化與溫度上升或下降變化不會超過30個計數(溫度設定與前一次差異不超過 45度,溫度讀出與前一次讀出差異不超過 60度),利用這樣的值從上一次的溫度-60度開始量測...

//-----------------DAO-------------------
void DAO(void)//DA converter DAO 熱偶溫度
{
unsigned char DA;
if(Lst_ADT>=30)
  DA=(Lst_ADT-30);
  else
  DA=0;
  while(!CMPD)//compare bit P2^2 取得熱偶溫度讀取的轉態最多256ms
  {
   ADPortL=DA;
   LTH=1;
   LTH=0;
   DelayMs(1);
   DA++;
  }  
   ADT=DA;//ADVL display AD data
   Lst_ADT=ADT;//記憶最後一次ad讀值
   ADPortL=0;
   LTH=1;
   LTH=0;
   DelayMs(1);
   SH_flag=1;// show flag
}



//-------------DAO2--------------------
void DAO2(void)//DA converter DAO2設定溫度
{
  unsigned char DA;
  if(Lst_ADTT>=30)//若溫度讀值大於30
     DA=(Lst_ADTT-30);
    else
     DA=0;
  while(!CMPDT)//compare bit P2^1 取得溫度設定的轉態最多256ms
  {
   ADPortL=DA;
   LTH=1;
   LTH=0;
   DelayMs(1);
   DA++;
  }  
   ADTT=DA;//ADVL display AD data
   Lst_ADTT=ADTT;//記憶最後一次ad讀值
   ADPortL=0;
   LTH=1;
   LTH=0;
   DelayMs(1);
   SH_flag=1;// show flag
}

相信把溫度讀取的變異加大一些或是把控溫穩定些平滑些,這樣 看門狗重啟動的現象,"希望"應可以消除!!!
發表於 2013-1-23 23:59:57 | 顯示全部樓層
antlu 發表於 2013-1-23 05:45 PM static/image/common/back.gif
xiaolaba大:
   外加直流沒問題,我已經把24V獨立接頭,隨時可以外加電源(包刮 5V也可以)!!
   外加DEBUG的 ...

阿乾大,看了你相關的三個帖子,我想我知道為什麼你的溫控會Lock住的原因了。

問題應該是出在電壓偵測部份(DAO(), DAO2())的程式,因為你是用DA產生電壓,再放大器比較後從P2^1跟P2^2偵測比較結果,當熱電偶電壓放大後的電壓如果永遠比你用DA產生的電壓高時,你在Loop內的DA值即使從0~255都不會使P2^2變成1,所以DA從255再加一後,又會從0開始,變成無限迴圈。所以以DAO2()為例,應該加上紅字部份如下,

//-------------DAO2--------------------
void DAO2(void)//DA converter
{
  unsigned char DA=0;
  while(!CMPDT)//compare bit P2^2
  {
   ADPortL=DA;
   LTH=1;
   LTH=0;
   DelayMs(2);
   if(DA == 0xFF)
     break;  //reach max, break out

   DA++;
  }  
   ADTT=DA;//ADVL display AD data
   ADPortL=0;
   LTH=1;
   LTH=0;
   DelayMs(2);
   SH_flag=1;// show flag
}

另外在DA轉換並比較的部份,ysc大有建議用二分法加快速度,建議可以用以下紅字的程式試試,

//-------------DAO2--------------------
void DAO2(void)//DA converter
{
  unsigned char DA=0;
  unsigned char check=0x80;  // start check from highest bit

  while(check)  // repeat until all bits checked
  {
   ADPortL=DA|check; // try set current bit to 1 to see if it will cause P2^2 active
   LTH=1;
   LTH=0;
   DelayMs(2);
   if(!CMPDT)  //compare bit P2^2
     DA|=check;  //not active, set this bit to 1
   check>>=1;  //shift right to check next bit
  }  
   ADTT=DA;//ADVL display AD data
   ADPortL=0;
   LTH=1;
   LTH=0;
   DelayMs(2);
   SH_flag=1;// show flag
}

祝你成功!:sam13

評分

1

查看全部評分

 樓主| 發表於 2013-1-24 10:01:07 | 顯示全部樓層
本帖最後由 antlu 於 2013-1-24 10:16 AM 編輯
robotai 發表於 2013-1-23 11:59 PM static/image/common/back.gif
阿乾大,看了你相關的三個帖子,我想我知道為什麼你的溫控會Lock住的原因了。

問題應該是出在電壓偵測部 ...


robotai大:
   感謝!!再感謝!!! 點出問題點我來確認!!
   感謝!! LOCK 問題已經解決了!!!
   剩下就是溫度控制的穩定度了!!
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

關閉

站長小叮嚀上一條 /1 下一條

禁閉室|手機版|連繫我們|痞酷網電子技術論壇

GMT+8, 2024-11-23 08:16 AM , Processed in 0.348070 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.