问答

汇集网友智慧,解决技术难题

21ic问答首页 - 【求助】HC32L110C6PA使用ADC电压数据采集

电压数据采集

【求助】HC32L110C6PA使用ADC电压数据采集

用万用表测量这个引脚是0.65v,但串口接收到AD值为459,电压是0.33v。然后我更改了基准电压,但AD仍为409不变,到底是什么原因
各位大佬救我,求路过不平拔刀相助啊

#include "adc.h"
#include "gpio.h"
#include "Serial.h"

static  uint32_t u32AdcResultAcc;
float Average;
float Voltage;       

void AdcContIrqCallback(void)
{   
       
        Adc_GetAccResult(&u32AdcResultAcc);
        Adc_ClrAccResult();


        Average = (float)u32AdcResultAcc/10;
        Voltage = Average / 4095.0f * 3.3f ;
      
            char adcStr[64];
        sprintf(adcStr, "AD Raw: %.2f, Voltage:  %.3fV\r\n", Average, Voltage);
        Uart_SendString((uint8_t*)adcStr);
       
       Adc_ClrContIrqState();   
}
void AdcRegIrqCallback(void)
{   

}

void AdcHhtIrqCallback(void)
{   

}

void AdcLltIrqCallback(void)
{   

}


en_result_t AD_Init(void)
{
    stc_adc_cfg_t             stcAdcCfg;
    stc_adc_cont_cfg_t        stcAdcContCfg;
    stc_adc_irq_t             stcAdcIrq;
    stc_adc_irq_calbakfn_pt_t stcAdcIrqCalbaks;
   
    DDL_ZERO_STRUCT(stcAdcCfg);
    DDL_ZERO_STRUCT(stcAdcContCfg);
    DDL_ZERO_STRUCT(stcAdcIrq);
    DDL_ZERO_STRUCT(stcAdcIrqCalbaks);
   
    Clk_SwitchTo(ClkRCL);
    Clk_SetRCHFreq(ClkFreq24Mhz);
    Clk_SwitchTo(ClkRCH);
     
    Clk_SetPeripheralGate(ClkPeripheralGpio, TRUE);              //GPIO 外设时钟使能
     if (Ok != Clk_SetPeripheralGate(ClkPeripheralAdcBgr, TRUE))        //ADCBGR 外设时钟使能
    {
        return Error;
    }

       Gpio_SetAnalog(3, 2, TRUE);// 设为模拟输入
       Gpio_InitIOExt(3,2,GpioDirIn,FALSE,FALSE,0,FALSE);  

    //ADC配置
    M0P_BGR->CR_f.BGR_EN = 0x1u;  //BGR必须使能
    M0P_BGR->CR_f.TS_EN = 0x0u;   //内置温度传感器,视使用需求
    delay1ms(15);
   
    stcAdcCfg.enAdcOpMode = AdcContMode;                //连续采样模式
    stcAdcCfg.enAdcClkSel = AdcClkSysTDiv1;             //PCLK
    stcAdcCfg.enAdcSampTimeSel = AdcSampTime8Clk;       //8个采样时钟
    // stcAdcCfg.enAdcRefVolSel = RefVolSelInBgr2p5;    //参考电压:内部2.5V(avdd>3V,SPS<=200kHz)
    stcAdcCfg.enAdcRefVolSel = RefVolSelAVDD;           //参考电压:AVDD
    stcAdcCfg.bAdcInBufEn = FALSE;                      //电压跟随器如果使能,SPS采样速率 <=200K
    stcAdcCfg.enAdcTrig0Sel = AdcTrigDisable;           //ADC转换自动触发设置
    stcAdcCfg.enAdcTrig1Sel = AdcTrigDisable;
    Adc_Init(&stcAdcCfg);   
        delay1ms(100);
   
    stcAdcIrq.bAdcIrq = TRUE;                            //转换完成中断函数入口配置使能
    stcAdcIrq.bAdcRegCmp = FALSE;
    stcAdcIrq.bAdcHhtCmp = FALSE;
    stcAdcIrq.bAdcLltCmp = FALSE;
    stcAdcIrqCalbaks.pfnAdcContIrq = AdcContIrqCallback; //转换完成中断入口函数
    stcAdcIrqCalbaks.pfnAdcRegIrq = AdcRegIrqCallback;
    stcAdcIrqCalbaks.pfnAdcHhtIrq = AdcHhtIrqCallback;
    stcAdcIrqCalbaks.pfnAdcLltIrq = AdcLltIrqCallback;
    Adc_ConfigIrq(&stcAdcIrq, &stcAdcIrqCalbaks);        //转换中断入口函数配置
    Adc_EnableIrq();                                     //中断使能
        NVIC_ClearPendingIRQ(ADC_IRQn);          // 清除中断挂起标志
    NVIC_SetPriority(ADC_IRQn, 1);           // 设置中断优先级
    NVIC_EnableIRQ(ADC_IRQn);                // 开启CPU的ADC中断接收通道
    Adc_CmpCfg(&stcAdcIrq);                              //结果比较中断使能/禁止配置
   
    stcAdcContCfg.enAdcContModeCh = AdcExInputCH2;      //通道2 P32
    stcAdcContCfg.u8AdcSampCnt = 0x09u;                 //连续累加次数(次数 = 0x09+1)
    stcAdcContCfg.bAdcResultAccEn = TRUE;               //累加使能
    Adc_ConfigContMode(&stcAdcCfg, &stcAdcContCfg);
       
        Adc_Enable();
        return Ok;
}


回答 +关注 0
285人浏览 2人回答问题 分享 举报
2 个回答
  • 之前的4095好像是个假的值,现在用中断方式或者轮询采样 得到的数据都为0,但用万用表测该点是有电压的

  • 主函数


    int32_t main(void)
    {  
            PWM1_Init();
            UART1_Init();
            AD_Init();
           
        while(1)
            {
               UartPwmControl();
                    Adc_Start();        //ADC开始转换
                    delay1ms(3000);
           
            }
    }


您需要登录后才可以回复 登录 | 注册