Re: 有沒有辦法解決精度的問題?
|
||||
---|---|---|---|---|
初級會員
|
謝謝您寶貴的意見,我大致上了解了,以後設計時會多加注意此類的問題
發表於: 2008/4/21 20:06
|
|||
|
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
|
|||
|
有沒有辦法解決精度的問題?
|
||||
---|---|---|---|---|
初級會員
|
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
|
|||
|
Re: 系統構思要使用何種晶片來設計?
|
||||
---|---|---|---|---|
初級會員
|
發表於: 2008/2/27 13:30
|
|||
|
Re: 系統構思要使用何種晶片來設計?
|
||||
---|---|---|---|---|
初級會員
|
謝謝您的回覆,這樣我已經有些概念了.
不過針對您的部份答覆,我仍有一些疑問,當子機與主機在通信當中,會有可能其它的子機也想送出資料,將導致資料將互相衝突,而我有去買了RS-232轉RS-485的市面上的產品,它好像是接電腦的COM PORT使用的,在COM PORT方面,除了線路上有接了RXD與TXD外,它好像又接了其它的線路,我想大概是RS-485線上不忙碌的信號轉給RS-232讓電腦判讀是否適當時機丟出資料,以PICF887的MPU來看,使用串列傳輸的接腳有RX與TX,再加上接地,以RS-485轉接器來看似乎沒有緩衝器在裡面,是不是我須要再提供MPU的兩隻腳來判斷RS-485的DSR與DTR或CTS與RTS信號後,再來做資料的準備丟出動作 還有您說的EUART與UART差別在哪裡,有沒有可以直接轉換MPU到RS-485的晶片,或相關的文章可以查尋,讓我多了解一點該如何設計這一方面的硬體與軟體 另外您有提到I/O組數可以接達36組之多,我看一些書寫的頂多到32組而已,不知道哪一個是對的,而這個組數又是怎麼計算出來的呢?
發表於: 2008/2/27 0:20
|
|||
|
系統構思要使用何種晶片來設計?
|
||||
---|---|---|---|---|
初級會員
|
有一個系統要構思設計概念因為不曉得用哪顆ic會比較好,尋問看看有沒有人可以提供好的建議
主機A1一台 子機B1~B12共十二台 各子機要在固定1秒傳送一些固定資料給主機A1,1台子機傳送期間,另1台子機須等待,待其結束後才可以傳送,不可互相衝突, 各子機間不須互相通訊 當有須要時主機A1須傳送資料給子機,或可以使用廣播方式,定位址後依收到資料判斷是否為子機位址的資料才留起來那台子機使用 主機部份須 1.提供通訊的PORT給子機通訊用 2.提供UART-PORT給電腦使用 3.提供Ethernet-PORT給連接INTERNET使用 4.並列傳輸或使用USB介面可以連接發票機用 子機部份須 1.提供通訊的PORT給主機通訊用 2.至少提供約3個8位元的PORT控制其它硬體用 針對此一大系統設計 在主機與子機通訊部份,子機均藉由連線連接到主機,約20公尺內以這種點對多點通訊,我該使用何種來做為通訊較好 主機A1部份我要使用哪一種IC較好 子機B1~B12部份,由於通訊的PORT將設限於IC內原有的功能,若8051的硬體控制PORT已夠使用,再外加上此種通訊的PORT是不是可以達成節省成本設計,若不行,以PIC最省成本的設計方式用哪一顆IC較好
發表於: 2008/2/25 16:40
|
|||
|
關於RS-232與PIC傳輸是否可用光耦合來做?
|
||||
---|---|---|---|---|
初級會員
|
由於先前的經驗,製作充電器時不知為何會產生干擾,或許是我用AC SOURCE的關係,有太多干擾,導致我在使用RS-232與電腦傳輸一直出問題,而且我發現,只要我的界面電路的兩端的地,一端是電腦,另一端是充電器的(PIC16F876A)MPU的地,只要一接上後很容易導致我電腦的RS-232工作異常,甚至我須要重新開機重抓到電腦RS-232的PORT正常工作再接上,電腦的RS-232 PORT一樣會當機無法使用,由於網路上使用光耦合來隔離RS-232與PIC之間的線路並不是很多,有這類的電路可參考嗎?
發表於: 2007/10/16 9:29
|
|||
|
Re: 請教有關AD問題
|
||||
---|---|---|---|---|
初級會員
|
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 規劃Analog Input5(Chip) RA5 數位輸入(過溫限流補償) Input 規劃Input Port */ switch(Channel) { case 0: { CHS2=0; CHS1=0; CHS0=0; } break; case 1: { CHS2=0; CHS1=0; CHS0=1; } break; case 2: { CHS2=0; CHS1=1; CHS0=0; } break; case 4: { CHS2=1; CHS1=0; CHS0=0; } break; } ADGO=1; while(ADGO==1); return (ADRESH*256+ADRESL); } 這是別人寫的c語言的ad程式碼 我看過以前文章,知道要切換通道取ad值,須在切換後等待至少20ms比較準確 可是問題在於程式在別的副程式裡還要隨時轉換pwm,所以在這裡應該不能寫delay 20ms的時間,如果要改這部份去等待時間後再判讀,等待的時間時亦又可以執行其他的程式時應該要怎麼改比較好呀? 不曉得ad的判讀錯誤是不是跟這裡也有關係?
發表於: 2006/12/3 23:46
|
|||
|
請教有關AD問題
|
||||
---|---|---|---|---|
初級會員
|
我想問的是剛好工作上遇到的問題
我使用的是PIC16F876A這個晶片 這個MPU是使用在充蓄電池的控制上 我分配MPU的腳位如下 第二腳接OP(358)訊號是來自微電阻放大而來,取充電電流 第三腳接的是電瓶的電壓已分壓在5V範圍內 第四腳接Vref是來自一個很準的電壓,電壓值大約(4.99v) 而電源是超過5V,高於Vref,大約是(5.002v) 軟體並不是我設計的,但是我有試過,若使用電源供應器的穩定電壓源供給訊號,則第三腳的電壓與MPU用RS-232傳出來的值是很MATCH的,問題來了,當使用本身機器所提供的電源時,若第二腳接到358時或接到機器的地時,第三腳的訊號很正常,但是MPU傳出來的值卻會偏差,而設計軟體的人很肯定軟體寫的沒問題,由第三腳所量得的訊號,3.5V以下還蠻正常的,可是3.5V以上,就愈差愈多,反而覺得由第二腳的訊號干擾到,若第二腳空接就很正常了,不曉得有誰知道這是哪裡出問題嗎? PS:Vref與5V電源都是在很穩定的狀況下,漣波約40mV以下
發表於: 2006/11/30 23:55
|
|||
|