Re: 有沒有辦法解決精度的問題?
|
||||
---|---|---|---|---|
初級會員
|
謝謝您寶貴的意見,我大致上了解了,以後設計時會多加注意此類的問題
發表於: 2008/4/21 20:06
|
|||
|
Re: 有沒有辦法解決精度的問題?
|
||||
---|---|---|---|---|
版主
|
1. 電壓的輸入串了 R1 (150K ohm) 這麼高的輸入阻抗足以影響 Sample Hold 電路的取樣準確度。
2. 一次步進的巔壓範圍比較大,這是 AD 轉換器的解析度的問題。用筆算一下就知道了。 5V/1024=5mV, 5mV 在程上電阻的衰減約15倍,5mV * 15 = 75mV;所以跳動 0.1V 是有可能的。要真正解決此誤差只有使用 14-bit 或更高解析度的 ADC,不過在高解析度的 ADC,干擾會變成主要的問題。
發表於: 2008/4/21 18:03
|
|||
|
Re: 有沒有辦法解決精度的問題?
|
||||
---|---|---|---|---|
初級會員
|
上面是我接的線路 我使用50轉的vr來做調整,發現的是已轉了幾圈,可是它的數值仍然不動,可是轉到數值動了一跳就多很多,例如 13.20轉了幾圈,它仍然維持在13.20,再轉到數值跳上去,已經是13.33了,一差就是0.1V多 我用電錶量測輸入的腳位時(MPU的第三腳),反而變的可以細調整了,就可以調到13.23,13.25,13.28,13.30等等 程式似乎就如您所說的沒什麼問題,那如果出問題真是在硬體上,若我不使用OP來改善,還有別種改善的方法嗎?
發表於: 2008/4/21 17:30
|
|||
|
Re: 有沒有辦法解決精度的問題?
|
||||
---|---|---|---|---|
資深會員
|
你的問題跟程式無關。
一般可變電阻本來精度就是這樣。要嘛你就去買高精度50轉一類的電阻。給ADC的信號最後透過隨耦器緩衝避免阻抗造成量測誤差。 Microchip有幾篇談ADC和數位/類比混合線路問題的文章,去看一下比較好。要不然你的東西問題會一再發生而你卻搞不清楚問題在哪。
發表於: 2008/4/21 10:31
|
|||
不要問我哪裡來,我只是個流浪天涯的工程師
|
||||
|
有沒有辦法解決精度的問題?
|
||||
---|---|---|---|---|
初級會員
|
static bank1 unsigned int VoltageADC; //電壓回授
static bank1 unsigned int CurrentADC; //電流回授 static bank1 unsigned int Temperature1ADC; //電瓶溫度 static bank1 unsigned int Temperature2ADC; //轉換器溫度 //bit LimitCurrentStatus; //變壓器跳脫狀態 static bank1 unsigned int NGC_Current; //0~5 V -> 0~1024 -> XX.XX~YY.YY A static bank1 unsigned int D_NGC_Current; //0~5 V -> 0~1024 -> XX.XX~YY.YY A static bank1 unsigned int NGC_Voltage; //0~5 V -> 0~1024 -> XX.XX~YY.YY V static bank1 unsigned char NGC_Temperature1; //0~5 V -> 0~1024 -> -20~125(0~155) Deg C static bank1 unsigned char NGC_Temperature2; //0~5 V -> 0~1024 -> -20~125(0~155) Deg C static bank2 unsigned int S_NGC_Voltage[5]; //0~5 V -> 0~1024 -> XX.XX~YY.YY V static bank2 unsigned int S_NGC_Current[10]; //0~5 V -> 0~1024 -> XX.XX~YY.YY A // ==================================================================== void Mesurement() { unsigned char s; signed int V_temp; unsigned long TEMP; CurrentADC=ADC_Conversion(Channel_Current); //電流回授,Channel_Current=0 VoltageADC=ADC_Conversion(Channel_Voltage); //電壓回授,Channel_Voltage=1 Temperature1ADC=ADC_Conversion(Channel_Temperature1); //電瓶補償溫度,Channel_Temperature1=2 //LimitCurrentStatus=RA4; //溫度開關 Temperature2ADC=ADC_Conversion(Channel_Temperature2); //過溫限流補償,Channel_Temperature2=5 NGC_Temperature1=TranslationTemperature(Temperature1ADC); NGC_Temperature2=TranslationTemperature(Temperature2ADC); //轉換電流/電壓/溫度值1/溫度值2 for(s=0;s<9;s++) { S_NGC_Current[s]=S_NGC_Current[s+1]; } S_NGC_Current[9]=CurrentADC*Iamp; for(s=0;s<4;s++) { S_NGC_Voltage[s]=S_NGC_Voltage[s+1]; } S_NGC_Voltage[4]=((((unsigned long)VoltageADC*(unsigned long)Vamp )*(unsigned long)500)/(unsigned long)1024); //S_NGC_Voltage[4]=(((unsigned long)VoltageADC)*Vamp*500/1024); D_NGC_Current=NGC_Current; //電流取10筆資料平均值 TEMP=0; for(NGC_Current=0,s=0;s<10;s++) { NGC_Current+=S_NGC_Current[s]; } //NGC_Current=TEMP/10; NGC_Current/=10; //電壓取5筆資料平均值 TEMP=0; for(NGC_Voltage=0,s=0;s<5;s++) { NGC_Voltage+=S_NGC_Voltage[s]; } //NGC_Voltage=TEMP/5; NGC_Voltage/=5; V_BLK=V_BLK0-(((NGC_Temperature1/5)*TCFV)/100); V_MAX=V_BLK+(V_BLK*3/100); // 3/100; V_FLT=V_FLT0-(((NGC_Temperature1/5)*TCFV)/100); if (V_FLT!=0) { V_FLT+=V_FLT1; } } // ==================================================================== unsigned int ADC_Conversion(unsigned char Channel) { /* 腳號 功能 Port 設定 RA0 類比輸入(電流回授) Input 規劃Analog Input0(Chip) RA1 類比輸入(電壓回授) Input 規劃Analog Input1(Chip) RA2 類比輸入(電瓶溫度補償) Input 規劃Analog Input2(Chip) RA3 Vref(+5V) Input 規劃Positive Analog Reference Voltage RA4 數位輸入(過溫跳脫開關) Input 規劃Input Port RA5 類比輸入(過溫限流補償) Input 規劃Analog Input5(Chip) */ switch(Channel) { case 0: //電流,RA0 { CHS2=0; CHS1=0; CHS0=0; } break; case 1: //電壓,RA1 { CHS2=0; CHS1=0; CHS0=1; } break; case 2: //電瓶溫度,RA2 { CHS2=0; CHS1=1; CHS0=0; } break; case 5: //轉換器溫度,RA5 { CHS2=1; CHS1=0; CHS0=0; } break; } asm("NOP");//以下幾行為切換channel時對電容充電時間 asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); ADGO=1; while(ADGO==1); return (ADRESH*256+ADRESL); } 上面是我程式裡部份的內容,在電壓部份有一行是 S_NGC_Voltage[4]=((((unsigned long)VoltageADC*(unsigned long)Vamp )*(unsigned long)500)/(unsigned long)1024); 我想問說,這樣寫應該是沒問題吧,程式裡用平均法來取得NGC_Voltage的電壓值,我在線路上,是用VR來調整的,讀出來的也沒什麼大問題,不過卻有個小問題,就是當VR來調整的時候,讀出來的平均值似乎沒辦法做微調,平均後的數值例如 12.58再調VR後就已經到12.64而這中間12.58~12.64卻無法調整到,例如我想調成12.60,VR一轉就跳那麼多,有什麼辦法可以使精度更精密一點呢,電流的部份NGC_Current好像也一樣耶,問題出在哪?
發表於: 2008/4/21 10:23
|
|||
|