STM8 ADC1連續模式切換通道干擾問題的解決


初始化ADC1:

void Init_ADC(void)
{
GPIO_Init(GPIOD, (GPIO_Pin_TypeDef)(GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_5|GPIO_PIN_6), GPIO_MODE_IN_FL_NO_IT);
ADC1_DeInit();
ADC1_Cmd(ENABLE);
ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_CHANNEL_3, ADC1_PRESSEL_FCPU_D18, ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL3,DISABLE);
ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_CHANNEL_4, ADC1_PRESSEL_FCPU_D18, ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL4, DISABLE);
ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_CHANNEL_5, ADC1_PRESSEL_FCPU_D18, ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL5,DISABLE);
ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_CHANNEL_6, ADC1_PRESSEL_FCPU_D18, ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL6,DISABLE);
ADC1_ScanModeCmd(ENABLE);
ADC1_DataBufferCmd(ENABLE);
ADC1_ITConfig(ADC1_IT_EOCIE,ENABLE);//在中斷中獲取AD值
ADC1_StartConversion();
}

中斷:

INTERRUPT_HANDLER(ADC1_IRQHandler, 22)
{
uint32_t tmp;
ADCValue[0]=ADC1_GetBufferValue(3);
ADCValue[1]=ADC1_GetBufferValue(4);
ADCValue[2]=ADC1_GetBufferValue(5);
ADCValue[3]=ADC1_GetBufferValue(6);
ADC1_ClearITPendingBit(ADC1_IT_EOC);
ADC1->CSR &= (uint8_t)(~ADC1_CSR_CH);//Clear the ADC1 channels
ADC1->CSR |= (uint8_t)(ADC1_CHANNEL_6); //在此處會在其它帶AD功能的輸出腳產生尖峰干擾,如PC4
tmp=ADCValue[0]+ADCValue[1]+ADCValue[2]+ADCValue[3];
}

由於PC4我已經配置為TIM1的PWM輸出,無論是否配置PC4的GPIO與否,這個腳都是輸出狀態。查了有人說在切換時先關掉ADC,實測不行,那個只適用於單次采集。連續的得不到數據。估計是ADC開啟后需要較多時間恢復電平,但是在中斷中不可能給很多時間進行等待,實際應用也不允許。

最后的解決辦法:

將PWM的時基調低,分配從不分配設置到32分頻,這樣PWM的輸出頻率就降低到越1khz左右,在該腳旁路一個0.1的電容,將那個干擾脈沖吸收,再輸出去基本符合要求了。唯一美中不足的是,當PWM的定時值過低時,寬度與那個脈沖的寬度相近的時候,他也被吸收了。但是基本不影響使用,算是解決了罷。

 


免責聲明!

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



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