STC8單片機ADC采樣注意事項


STC8單片機ADC采樣注意事項

最近在做一個模塊,使用宏晶公司的STC8單片機開發,模塊主要使用了單片機的ADC采樣功能,因為需要10個以上的通道,而且模塊要經常震動,所以希望使用一種耐操一點的芯片, 於是我使用了STC8系列的單片機,有16路通道的ADC,采樣精度是12位,可以比較好的滿足我的要求。 一開始模塊做的還不錯,半年之后有一次要進行改進,在程序上我加大了單片機通道切換之間的時間,然而最后卻出現了采樣出錯的現象。

因為我要輪詢所有的ADC通道,出於設計方面,我采用了特別的采樣順序,采樣出錯的結果不知道是怎么回事,在改了程序之后便出現了問題, 我一直認為是程序的問題,搞到最后懷疑人生了,,感覺難道這又是STC的一個bug?

不過,最后我終於在網上找到了一個線索,並且嘗試按照那個方法改了一下程序,ojbk了。 貼一下那個線索的原話:

如果輸入信號內阻很大(超過1K就算大了,如果10K就很大了),ADC輸入端對地接一個0.01~0.1uF的電容。
切換通道后,第一次轉換值丟棄。

為什么會有這些要求?為什么外掛專門的ADC也一樣的有這種要求?
對於沒有輸入緩沖的ADC(STC的ADC輸入就是沒有緩沖的),采樣時ADC輸入端通過一個電阻(r,通常是幾K歐姆)給采樣電容C充電(采樣電容一般是10~30PF,STC的可以按30PF計算),假設信號源內阻為R0,則采樣充電就是((R0+r)*C),采樣時間t一般是很短的,比如STC最快時采樣就是幾個時鍾,時間很短。

貼一下我的ADC采集函數(更改之前的):

/**
 * [ADCRead description]
 * @Author     葉鵬程
 * @DateTime   2019-08-01T20:24:46+0800
 * @discrption : ADC采樣函數,
 *  
 * @param      n                        [要采樣的通道]
 * @param      value_point              [采樣值存放地址]
 */
void ADCRead(uint8_t n,unsigned int  xdata *value_point){
	unsigned int adc_value = 0;
	
	ADC_SET_CHANEL(n);  //設置當前待轉換的ADC通道
	ADC_START_ENABLE();

	while(ADC_STATE()); //等待轉換
	
	ADC_FLAG_CLEAR();  

	adc_value = (int)ADC_RES << 8;                               //讀取ADC結果
	adc_value |= (int)ADC_RESL;
	adc_value = adc_value>>4;

	*value_point = adc_value;
}

這是按照線索,更改之后的:

/**
 * [ADCRead description]
 * @Author     葉鵬程
 * @DateTime   2019-08-01T20:24:46+0800
 * @discrption : ADC采樣函數,
 *  
 * @param      n                        [要采樣的通道]
 * @param      value_point              [采樣值存放地址]
 */
void ADCRead(uint8_t n,unsigned int  xdata *value_point){
	unsigned int adc_value = 0;
	
	ADC_SET_CHANEL(n);  //設置當前待轉換的ADC通道
    
	ADC_START_ENABLE();
	while(ADC_STATE()); //等待轉換
	ADC_FLAG_CLEAR();  
    
	/* 這是清除了第一次轉換的值,采用第二次采樣,這樣在切換通道時更加穩定*/
	ADC_START_ENABLE();
	while(ADC_STATE()); //等待轉換
	ADC_FLAG_CLEAR();  

	adc_value = (int)ADC_RES << 8;                               //讀取ADC結果
	adc_value |= (int)ADC_RESL;
	adc_value = adc_value>>4;

	*value_point = adc_value;
}

總結,這是ADC電路的問題, 以后一定要注意這些東西, 看來還是自己的知識沒有學扎實。 加油!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM