你好,我在用AVP32F335,在對外部標準的1.5v采樣的時候,會出現采樣值偏離較大,有些芯片甚至不到1.4v的采樣值,實測AD口的信號是1.5v。下面是初始化的代碼:
1.AdcRegs.ADCTRL1.bit.RESET = 1; 惹的禍
以上這個問題,首先要考慮的是ADCOFFTRIM寄存器。需要考慮系統(tǒng)出廠默認ADCOFFTRIM寄存器是否曾改變過?芯片在出廠測試時,會對每顆芯片的ADC測試,并把零點的偏差值寫入ROM中,而在芯片脫離仿真啟動的過程中,BOOT ROM的程序會自動調用ADC_cal()函數,其作用就是將ADCREFSEL和ADCOFFTRIM寄存器寫事先芯片出廠存在ROM中的數據。但芯片仿真過程中,會自動跳過BOOT ROM,因此在例程中,InitAdc()函數起始,對ADC時鐘使能后,就調用了ADC_cal()以寫入ADCOFFTRIM值。注意,ADC時鐘不使能,ADC寄存器是無法寫入的。ADC在每次轉換后,結果寄存器的值都會減去ADCOFFTRIM寄存器的值,此時的采樣結果才是準確的。所以,采樣值如果偏差過大,首先,可以設置斷點看下ADCOFFTRIM的值是否是出廠值。ADCOFFTRIM出廠值在地址0x380085;ADCREFSEL出廠值在地址0x380083。如果ADCOFFTRIM不等于0x380085地址的值,且不為0,您的軟件可能有重新對ADC校準的過程。如果ADCOFFTRIM等于0,還需要考慮文檔中以下描述內容。
上圖資料顯示,ADCOFFTRIM寄存器的值是通過執(zhí)行ADC_cal()函數來賦值的,而給ADC控制寄存器1的14位(RESET)置1,會清零ADCOFFTRIM以及其他ADC寄存器。因此,在RESET=1之后,一定要重復執(zhí)行一次ADC_cal();相對于要重新配置ADC,以下測試過程可以完整體現此問題。如以下測試程序:
上圖是在執(zhí)行AdcRegs.ADCTRL1.bit.RESET = 1; 之前,寄存器AdcRegs.ADCOFFTRIM.bit.OFFSET_TRIM 的值是11;
執(zhí)行完AdcRegs.ADCTRL1.bit.RESET = 1;后,寄存器AdcRegs.ADCOFFTRIM.bit.OFFSET_TRIM 的值是0,
只有當從新調用ADC_cal()后,寄存器AdcRegs.ADCOFFTRIM.bit.OFFSET_TRIM才回到11。RESET位功能說明如下:
注意:因為RESET=1后是重置整個ADC,所以在RESET=1以后,不但ADC_cal()要重新調用,ADC所有寄存器都恢復默認狀態(tài),同樣影響到進芯電子ADC內部1.5v模擬電源使能位需使能的注意事項AdcRegs.ADCTRL1.bit.rsvd1 = 8;
以上問題,在TMS320F28335芯片上同樣存在,而在TI的程序示例代碼中,因為沒有AdcRegs.ADCTRL1.bit.RESET = 1; 且F28335的ADCOFFTRIM值比較集中,所以一般不會注意此問題。