請教大家,下面程式中,我只用通道1時能正常采集 ,只用通道2時也能正常采集,但是如果同時使用通道1和通道2時,通道1和通道2顯示的資料為通道2的數值,通道1 就不能正常采集,這個問題出在什么地方呢?程式如下
uint8_t ADC_CH;
uint16_t ADCdata1;
uint16_t ADCdata2;
uint16_t ADC_GetCh1(uint8_t ch)
{ uint16_t tmpreg = 0;
ADC1_CR1_bit.ADON = 1; //喚醒ADC
ADC1_SQR4_bit.CHSEL_S1 =1; //設定通道1有效
//ADC_ITConfig(/*ADC1, */ADC_IT_EOC, ENABLE); //設定ADC采樣中斷
ADC1_CR1_bit.START = 1; //啟動轉化
while(ADC1_SR_bit.EOC == 1); //等待轉換結束
tmpreg = (uint16_t)(ADC1_DRH);
tmpreg = (uint16_t)((uint16_t)((uint16_t)tmpreg << 8) | ADC1_DRL);
ADC1_SR_bit.EOC = 0; //清除中斷標志
ADC1_CR1_bit.ADON = 0; //關閉 ADC
ADC1_SQR4_bit.CHSEL_S1 =0; //清除設定通道1
return tmpreg;
}
uint16_t ADC_GetCh2(uint8_t ch){
uint16_t tmpreg = 0;
ADC1_CR1_bit.ADON = 1; //喚醒ADC
ADC1_SQR4_bit.CHSEL_S2 =1; //
//ADC_ITConfig(/*ADC1, */ADC_IT_EOC, ENABLE); //設定ADC采樣中斷
ADC1_CR1_bit.START = 1; //啟動轉化
while(ADC1_SR_bit.EOC == 0); //等待轉換結束
tmpreg = (uint16_t)(ADC1_DRH);
tmpreg = (uint16_t)((uint16_t)((uint16_t)tmpreg << 8) | ADC1_DRL);
ADC1_SR_bit.EOC = 0; //清除中斷標志
ADC1_CR1_bit.ADON = 0; //關閉 ADC ADC_Cmd(/*ADC1,*/ ENABLE);
ADC1_SQR4_bit.CHSEL_S2 =0; //清除設定通道2
return tmpreg;
}
int main( void )
{ u16 adc1 = 234;
u16 adc2 = 587;
CLK_CKDIVR = 0x00; //內部時鐘為1分頻 = 16Mhz
OLED_AInit(); //OLED顯示初始化
CLK_PCKENR2_bit.PCKEN20 = 1; //打開ADC的時鐘
PA_DDR_bit.DDR4 = 0; //設定PA->4 為輸入
PA_CR1_bit.C14 = 0; //設定為懸空輸入
PA_CR2_bit.C24 = 0; //設定中斷禁止
PA_DDR_bit.DDR5 = 0; //設定PA->5 為輸入
PA_CR1_bit.C15 = 0; //設定為懸空輸入
PA_CR2_bit.C25 = 0; //設定中斷禁止
ADC1_CR1_bit.RES = 0; //設定12位解析度
ADC1_CR1_bit.CONT = 0; //設定為單次轉換模式
// ADC1_CR1_bit.CONT =1 ; //設定為連續轉換模式
ADC1_CR2_bit.PRESC = 1; ////ADC時鐘進行2分頻
ADC1_CR2_bit.SMTP1 = 7; //
while(1)
{ adc1 = ADC_GetCh1(1); //ADC1采樣函式
adc2 = ADC_GetCh2(2); //ADC2采樣函式
OLED_ShowcADC1(adc1);
OLED_ShowcADC2(adc2);
}
return 0;
}
uj5u.com熱心網友回復:
采樣1顯示1
采樣2
顯示2試試
uj5u.com熱心網友回復:
采樣1顯示1
采樣2
顯示2試試 剛試了下,不行,可能不是時間上的事
uj5u.com熱心網友回復:
樓主,你的OLED顯示重繪時間是多少?顯示重繪過快就會只看到通道2的采樣值。可以調換一下次序
OLED_ShowcADC2(adc2);
OLED_ShowcADC1(adc1);
看看是不是只顯示通道1的采樣值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/131668.html
標籤:單片機/工控
上一篇:普中科技51單片機數碼管動態顯示
