| 
 | 
 
路线栈欢迎您!
您需要 登录 才可以下载或查看,没有帐号?立即注册 
 
 
 
x
 
 本帖最后由 有丶意思 于 2024-2-2 16:42 编辑  
 
项目描述 
 
项目中发现HC32F005C6UA的ADC通道4的数据会影响到通道5的数据。HC32F005C6UA 开启 ADC 扫描模式, P34 ADC 通道 4 , P35 ADC 通道 5。 
 
  
通道4上的100K的NTC没插入前,通道5的数据正常,插入后通道5的数据随着通道4的NTC阻值变化而变换。 
 
以下是初始化程序: 
- void Adc_Det_Init(void)
 
 - {
 
 -     stc_adc_cfg_t             stcAdcCfg;
 
 -     stc_adc_scan_cfg_t        stcAdcScanCfg;
 
 -     stc_adc_irq_t             stcAdcIrq;
 
  
-     DDL_ZERO_STRUCT(stcAdcCfg);
 
 -     DDL_ZERO_STRUCT(stcAdcScanCfg);
 
 -     DDL_ZERO_STRUCT(stcAdcIrq);
 
  
-     Sysctrl_SetPeripheralGate(SysctrlPeripheralAdcBgr, TRUE);  //ADCBGR 外设时钟使能
 
  
-     Adc_Enable();
 
 -     Bgr_BgrEnable();    ///< BGR必须使能
 
  
-     stcAdcCfg.enAdcOpMode = AdcScanMode;               //扫描采样模式
 
 -     stcAdcCfg.enAdcClkSel = AdcClkSysTDiv1;            //PCLK
 
 -     stcAdcCfg.enAdcSampTimeSel = AdcSampTime8Clk;      //8个采样时钟
 
 -     stcAdcCfg.enAdcRefVolSel = RefVolSelInBgr2p5;      //参考电压:AVDD
 
 -     stcAdcCfg.bAdcInBufEn = FALSE;                     //电压跟随器如果使能,SPS采样速率 <=200K
 
 -     stcAdcCfg.enAdcTrig0Sel = AdcTrigDisable;          //ADC转换自动触发设置
 
 -     stcAdcCfg.enAdcTrig1Sel = AdcTrigDisable;
 
 -     Adc_Init(&stcAdcCfg);   
 
  
-     stcAdcIrq.bAdcIrq = TRUE;                            //转换完成中断函数入口配置使能
 
 -     stcAdcIrq.bAdcRegCmp = FALSE;
 
 -     stcAdcIrq.bAdcHhtCmp = FALSE;  
 
 -     stcAdcIrq.bAdcLltCmp = FALSE;
 
 -     Adc_CmpCfg(&stcAdcIrq);                              //结果比较中断使能/禁止配置
 
  
-     stcAdcScanCfg.u8AdcScanModeCh =  ADC_SCAN_CH0_EN
 
 -                                      | ADC_SCAN_CH4_EN
 
 -                                      | ADC_SCAN_CH5_EN
 
 -                                      | ADC_SCAN_CH7_EN;
 
 -     stcAdcScanCfg.u8AdcSampCnt = 0x3;                   //连续扫描转换次数,保持通道的倍数,4通道 = 0x3+1(1倍),或者7+1(2倍)……
 
 -     Adc_ConfigScanMode(&stcAdcCfg, &stcAdcScanCfg);
 
  
-     Adc_EnableIrq();                                     //中断使能
 
 -     EnableNvic(ADC_IRQn, IrqLevel3, TRUE);
 
 - }
 
  
- ///< ADC 中断服务程序
 
 - void ADC_IRQHandler(void)
 
 - {  
 
 -     static unsigned char u8Channel = 0;
 
 -     if (TRUE == M0P_ADC->IFR_f.REG_INTF){
 
 -         Adc_ClrRegIrqState();
 
 -     }
 
  
-     if (TRUE == M0P_ADC->IFR_f.HHT_INTF){
 
 -         Adc_ClrHhtIrqState();
 
 -     }
 
  
-     if (TRUE == M0P_ADC->IFR_f.LLT_INTF){
 
 -         Adc_ClrIrqLltState();
 
 -     }
 
  
-     if (TRUE == M0P_ADC->IFR_f.CONT_INTF){
 
 -         Adc_ClrContIrqState();
 
 -         heat_para.adc_det_sta = TRUE;
 
 -         for (u8Channel = 0; u8Channel < 8; u8Channel++){
 
 -             Adc_GetScanResult(u8Channel, &heat_para.adc_value[u8Channel]);
 
 -         }
 
 -     }
 
 - }
 
  复制代码 
希望大家帮忙看一下,不行就改板不用通道5了。 
 
网友给出的解决方法: 
 
- stcAdcCfg.enAdcOpMode = AdcScanMode;               //扫描采样模式
 
 - stcAdcCfg.enAdcClkSel = AdcClkSysTDiv8;            //PCLK/8
 
 - stcAdcCfg.enAdcSampTimeSel = AdcSampTime12Clk;      //12个采样时钟
 
 - stcAdcCfg.enAdcRefVolSel = RefVolSelInBgr2p5;      //参考电压:AVDD
 
 - stcAdcCfg.bAdcInBufEn = TRUE;                     //电压跟随器如果使能,SPS采样速率 <=200K
 
 - stcAdcCfg.enAdcTrig0Sel = AdcTrigDisable;          //ADC转换自动触发设置
 
 - stcAdcCfg.enAdcTrig1Sel = AdcTrigDisable;
 
 - Adc_Init(&stcAdcCfg);  
 
  复制代码 
初始化函数这么改试试,不出意外应该是有很大的改善。 
 |   
 
 
 
 |