性无码一区二区三区在线观看,少妇被爽到高潮在线观看,午夜精品一区二区三区,无码中文字幕人妻在线一区二区三区,无码精品国产一区二区三区免费

  • 回復(fù)
  • 收藏
  • 點(diǎn)贊
  • 分享
  • 發(fā)新帖

過溫保護(hù)異常,導(dǎo)致電源重啟。

這是我之前做的一個(gè)電源產(chǎn)品,使用R8C27系列的單片機(jī)來控制各路輸出電壓,還有控制其上電時(shí)序,并檢測各路電壓是否異常,異常時(shí),電源關(guān)閉保護(hù)。另外,還有檢測電源內(nèi)部溫度情況,當(dāng)溫度大于80時(shí),電源關(guān)閉。關(guān)于溫度檢測這一塊,主要是使用NTC熱敏電阻(電路圖上位號(hào):RT601, 規(guī)格書見附件)與一個(gè)10K電阻串聯(lián)。通過AD轉(zhuǎn)化得到一個(gè)AD數(shù)值,再由AD數(shù)值來計(jì)算出NTC熱敏電阻的阻值。由電阻值來判斷當(dāng)前電源溫度。軟件上具體的為:

定義變量:UINT  ad_value;ULONG  r_value; r_value=1024*10*10 - ad_value*10*10/ad_value.

這里定義的ad_value為電阻分壓出來,也就是ADT點(diǎn)上的電壓的AD值。r_value 10倍的NTC熱敏電阻值(單位為: k Ω)。例如:當(dāng)ad_value=883時(shí),則r_value=16,即NTC熱敏電阻值為:1.6k,通過規(guī)格書可以知道此時(shí)的溫度為80。那也就是說邏輯上,r_value<16時(shí),溫度超過80,電源才保護(hù)的。

    目前的問題是產(chǎn)品賣到北方地區(qū),客戶反饋早上起來的時(shí)候,電源開機(jī)不良,上半年未發(fā)現(xiàn)此問題,而我們工廠(在南方,溫度基本上在10以上)這邊,也從來沒有出現(xiàn)過這種現(xiàn)象。后來將產(chǎn)品進(jìn)行低溫試驗(yàn)(-10)。發(fā)現(xiàn)在常溫下將產(chǎn)品置于低溫室時(shí),20分鐘左右開機(jī)后,會(huì)自動(dòng)保護(hù)。而如果繼續(xù)放置兩小時(shí),溫度平衡后,開機(jī)又正常,現(xiàn)象挺奇怪的。

   大家覺得是什么原因?是NTC熱敏電阻在溫度變化的過程中,存在突變點(diǎn)? 溫度曲線沒有像規(guī)格書描述的那樣?溫度越低,阻值越大?還是軟件上有BUG

 

全部回復(fù)(13)
正序查看
倒序查看
58340153
LV.3
2
2012-12-10 10:32

電路圖和規(guī)格書如下:

NTC熱敏電阻規(guī)格書 

 

0
回復(fù)
58340153
LV.3
3
2012-12-11 12:57

通過仿真,已經(jīng)明確是軟件上有BUG,具體的改天有時(shí)間再來分析給大家看。

0
回復(fù)
sharkdo
LV.3
4
2012-12-11 14:35

樓主很專業(yè),個(gè)人認(rèn)為也可以通過專業(yè)儀器儀表的使用來保證電源的運(yùn)行,現(xiàn)在的功率檢測分析儀/功率計(jì)采用了擁有專利的高帶寬架構(gòu),能夠精度測量單相或三相電流和電壓、諧波分析、快速傅里葉變換(FFT)分析,以及計(jì)算功率和其它計(jì)算值,作為實(shí)驗(yàn)室或試驗(yàn)臺(tái)上的臺(tái)式儀器,都非常方便、可靠。

0
回復(fù)
58340153
LV.3
5
2012-12-12 13:33
軟件在計(jì)算過程中,邏輯和公式的推導(dǎo)都沒有問題,變量的類型定義似乎也沒問題。但是事實(shí)上,在仿真的過程中確實(shí)發(fā)現(xiàn)有數(shù)據(jù)溢出導(dǎo)致計(jì)算結(jié)果出錯(cuò),從而導(dǎo)致了電源的誤操作。那么數(shù)據(jù)是如何溢出的呢?
0
回復(fù)
58340153
LV.3
6
2012-12-12 13:55
下面具體的來看一下,當(dāng)溫度變化為:-40度~125度時(shí),NTC 對應(yīng)的阻值變化范圍為:5~202.1K歐,r_value變化范圍為:0~2021,而r_value的類型定義為無符號(hào)長整型ULONG,可以表示的范圍為:0~0XFFFFFFFF, 很顯然 r_value 不可能溢出。那么再來看一下,另外一個(gè)變量ad_value,  ad_value定義的類型為無符號(hào)整型UINT, 可以表示的范圍為:0~0XFFFF,其值在實(shí)際的變范圍只有:0~1024??雌饋磉@兩個(gè)變量也未出現(xiàn)溢出。所以接下只好再看一下,計(jì)算的過程。
0
回復(fù)
58340153
LV.3
7
2012-12-12 15:32

C語言代碼:r_value=(1024*10*10 - ad_value*10*10)/ad_value;       // value si 10*R ;
生產(chǎn)匯編語言后的代碼:               
                MOV.W     0438H,R0  (將存儲(chǔ)在0438H中的值即ad_value,賦予寄存器R0)
                MUL.W     #0064H,R0  (執(zhí)行ad_value*10*10 ,其中#0064H代表常量100。 以16位做乘法運(yùn)算,結(jié)果以32位保存)
                MOV.W     R0,R1
                MOV.W     #9000H,R0 (#9000H即為:1024*10*10-0XFFFF=0X19000-0XFFFF=0X9000=9000H)
                SUB.W     R1,R0    
                MOV.W     #0H,R2
                DIVU.W    0438H (除法運(yùn)算)
                MOV.W     R0,054CH (r_value的值存儲(chǔ)在地址 054CH,054EH 中)
                MOV.W     #0H,054EH

從生成的匯編語言的代碼中,已經(jīng)可以看出問題的所在。

0
回復(fù)
58340153
LV.3
8
2012-12-12 15:58
@58340153
C語言代碼:r_value=(1024*10*10-ad_value*10*10)/ad_value;      //valuesi10*R;生產(chǎn)匯編語言后的代碼:                              MOV.W    0438H,R0 (將存儲(chǔ)在0438H中的值即ad_value,賦予寄存器R0)               MUL.W    #0064H,R0 (執(zhí)行ad_value*10*10,其中#0064H代表常量100。以16位做乘法運(yùn)算,結(jié)果以32位保存)               MOV.W    R0,R1               MOV.W    #9000H,R0(#9000H即為:1024*10*10-0XFFFF=0X19000-0XFFFF=0X9000=9000H)               SUB.W    R1,R0                   MOV.W    #0H,R2               DIVU.W   0438H(除法運(yùn)算)               MOV.W    R0,054CH(r_value的值存儲(chǔ)在地址054CH,054EH中)               MOV.W    #0H,054EH從生成的匯編語言的代碼中,已經(jīng)可以看出問題的所在。
問題就出在,以下的兩條指令:
                MOV.W     #9000H,R0 (#9000H即為:1024*10*10-0XFFFF=0X19000-0XFFFF=0X9000=9000H)
                SUB.W     R1,R0 
 
1、表達(dá)式:1024*10*10 。應(yīng)生成:MOV.W     #19000H,R0 才對(實(shí)際上需要生成兩條語句,這里為了好理解直接寫成這樣。),因?yàn)椋?024*10*10=0X19000=19000H,而這里由于系統(tǒng)認(rèn)為最大的變量為,無符號(hào)整型UINT,所以1024*10*10變成了9000H,將進(jìn)位1直接去掉。
2、另外,SUB.W     R1, R0,只能做16位的減法運(yùn)算。即運(yùn)算結(jié)果必須小于0XFFFF。否則,數(shù)據(jù)將溢出。
0
回復(fù)
58340153
LV.3
9
2012-12-12 16:24
@58340153
問題就出在,以下的兩條指令:               MOV.W    #9000H,R0(#9000H即為:1024*10*10-0XFFFF=0X19000-0XFFFF=0X9000=9000H)               SUB.W    R1,R0  1、表達(dá)式:1024*10*10。應(yīng)生成:MOV.W    #19000H,R0才對(實(shí)際上需要生成兩條語句,這里為了好理解直接寫成這樣。),因?yàn)椋?024*10*10=0X19000=19000H,而這里由于系統(tǒng)認(rèn)為最大的變量為,無符號(hào)整型UINT,所以1024*10*10變成了9000H,將進(jìn)位1直接去掉。2、另外,SUB.W    R1,R0,只能做16位的減法運(yùn)算。即運(yùn)算結(jié)果必須小于0XFFFF。否則,數(shù)據(jù)將溢出。
那也就是說 r_value=(1024*10*10 - ad_value*10*10)/ad_value <0xFFFF=65535; 對應(yīng)的ad_value必須大于(102400-65535)/100=368.65。此時(shí)r_value的計(jì)算值為0,但實(shí)際電阻值為18K,溫度為9度。所以出現(xiàn)了電源異常保護(hù)的問題。如果溫度繼續(xù)降低,則ad_value會(huì)繼續(xù)減小,而 r_value 又會(huì)繼續(xù)增加,重新大于16。電源工作又變正常,這個(gè)點(diǎn)在實(shí)際中電阻值為22K左右,對應(yīng)的溫度為5度。
0
回復(fù)
58340153
LV.3
10
2012-12-12 16:43
大家有沒有發(fā)現(xiàn),理論分析與實(shí)際相吻合了。 本電源在工作過程中,由于計(jì)算過程中,數(shù)據(jù)溢出,原本只在溫度大于80度以上保護(hù)時(shí),變成了在5~9度時(shí),出現(xiàn)了電源也過溫保護(hù)。現(xiàn)在才知道為什么把電源放入低溫室(-10度)時(shí),20分鐘左右開機(jī)后,會(huì)自動(dòng)保護(hù)。而如果繼續(xù)放置兩小時(shí),溫度平衡后,開機(jī)又正常的奇怪現(xiàn)象了。 因?yàn)椋挥性诮禍氐倪^程中5-9度才會(huì)出現(xiàn)這中問題。
0
回復(fù)
58340153
LV.3
11
2012-12-12 17:09
說了這么多現(xiàn)在來看看如何解決這個(gè)問題,其實(shí),當(dāng)我們找到問題所在的同時(shí),也同時(shí)找到了解決辦法。方法有很多:可以將原先16位的變量ad_value定義為32位的比如:ULONG,float等類型。還有另外一種辦法是改變產(chǎn)量的表達(dá)方法,只要對表達(dá)式: r_value=(1024*10*10 - ad_value*10*10)/ad_value ,改為 : rt_value=(102400-vt_average_ad_data*100)/vt_average_ad_data;  或者      
r_value=(1024*10*10.0 - ad_value*10*10.0)/ad_value;   就可以了。
0
回復(fù)
58340153
LV.3
12
2012-12-12 17:17
我把更表達(dá)式后的匯編代碼給出來,有興趣的可以自己去研究一下,這些代碼最后計(jì)算的方法有什么不同。
0
回復(fù)
58340153
LV.3
13
2012-12-12 17:18
rt_value=(102400-vt_average_ad_data*100)/vt_average_ad_data;  // value si 10*R ;
編譯后生成的代碼:
               MOV.W     0438H,R0
               MUL.W     #0064H,R0
               MOV.W     #0H,R2
               MOV.W     #9000H,R1   //   (這就是我前面所說的,與 MOV.W     #19000H, R0 對應(yīng)的兩條代碼)
               MOV.W     #1H,R3        //
               SUB.W     R0,R1
               SBB.W     R2,R3
               MOV.W     0438H,R0
               MOV.W     #0H,R2
               XCHG.W    R0,R1
               XCHG.W    R2,R3
               MOV.W     R1,A0
               MOV.W     R3,A1
               PUSHM     A0,A1
               JSR.W     __i4div
               ADD.B     #4H,SP
               MOV.W     R0,054CH
               MOV.W     R2,054EH
0
回復(fù)
58340153
LV.3
14
2012-12-12 17:18
@58340153
rt_value=(102400-vt_average_ad_data*100)/vt_average_ad_data; //valuesi10*R;編譯后生成的代碼:              MOV.W    0438H,R0              MUL.W    #0064H,R0              MOV.W    #0H,R2              MOV.W    #9000H,R1  //  (這就是我前面所說的,與MOV.W    #19000H,R0對應(yīng)的兩條代碼)              MOV.W    #1H,R3       //              SUB.W    R0,R1              SBB.W    R2,R3              MOV.W    0438H,R0              MOV.W    #0H,R2              XCHG.W   R0,R1              XCHG.W   R2,R3              MOV.W    R1,A0              MOV.W    R3,A1              PUSHM    A0,A1              JSR.W    __i4div              ADD.B    #4H,SP              MOV.W    R0,054CH              MOV.W    R2,054EH
r_value=(1024*10*10.0 - ad_value*10*10.0)/ad_value;        // value si 10*R ;
編譯后生成的代碼:   
                MOV.W     0438H,R0
                MUL.W     #000AH,R0
                PUSH.W    #0000H
                PUSH.W    R0
                JSR.W     __i4Utof
                ADD.B     #4H,SP
                PUSH.W    #4024H
                PUSH.W    #0000H
                PUSH.W    #0000H
                PUSH.W    #0000H
                PUSHM     R0,R1,R2,R3
                JSR.W     __f8mul
                ADD.B     #10H,SP
                PUSHM     R0,R1,R2,R3
                PUSH.W    #40F9H
                PUSH.W    #0000H
                PUSH.W    #0000H
                PUSH.W    #0000H
                JSR.W     __f8sub
                ADD.B     #10H,SP
                MOV.W     R3,-2H[FB]
                MOV.W     R2,-4H[FB]
                MOV.W     R1,-6H[FB]
                MOV.W     R0,-8H[FB]
                PUSH.W    #0000H
                PUSH.W    0438H
                JSR.W     __i4Utof
                ADD.B     #4H,SP
                PUSHM     R0,R1,R2,R3
                PUSH.W    -2H[FB]
                PUSH.W    -4H[FB]
                PUSH.W    -6H[FB]
                PUSH.W    -8H[FB]
                JSR.W     __f8div
                ADD.B     #10H,SP
                PUSHM     R0,R1,R2,R3
                JSR.W     __f8toi4
                ADD.B     #8H,SP
                MOV.W     R2,054EH
                MOV.W     R0,054CH
0
回復(fù)
發(fā)