打印
[技术问答]

HC32L110C6UA使用ADC电压数据采集的问题 -- 已解决

[复制链接]
1724|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 JacksonChen 于 2024-12-5 16:52 编辑

使用ADC电压数据采集时,通过打印输出能够接收到数据,但是接收到的数据不像是电压,请教大家下图中输出打印的“40xxx“是什么数据?还有就是华大的哪里可以查看对应的ADC通道?


----------------------------------------------------------
输出打印图:


----------------------------------------------------------
核心代码:
en_result_t My_Adc_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(2, 4, TRUE);
        
    //ADC配置
    Adc_Enable();
    M0P_BGR->CR_f.BGR_EN = 0x1u;  //BGR必须使能
    M0P_BGR->CR_f.TS_EN = 0x1u;   //内置温度传感器,视使用需求
    delay100us(1);
   
    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 = TRUE;
    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;
    stcAdcIrqCalbaks.pfnAdcContIrq = AdcContIrqCallback; //转换完成中断入口函数
    stcAdcIrqCalbaks.pfnAdcRegIrq = AdcRegIrqCallback;
    stcAdcIrqCalbaks.pfnAdcHhtIrq = AdcHhtIrqCallback;
    stcAdcIrqCalbaks.pfnAdcLltIrq = AdcLltIrqCallback;
    Adc_ConfigIrq(&stcAdcIrq, &stcAdcIrqCalbaks);        //转换中断入口函数配置
    Adc_EnableIrq();                                     //中断使能
    Adc_CmpCfg(&stcAdcIrq);                              //结果比较中断使能/禁止配置
   
   
    stcAdcContCfg.enAdcContModeCh = AdcExInputCH0;      //通道0 P24
    stcAdcContCfg.u8AdcSampCnt = 0x09u;                 //P24 连续累加次数(次数 = 0x09+1)
    stcAdcContCfg.bAdcResultAccEn = TRUE;               //累加使能
    Adc_ConfigContMode(&stcAdcCfg, &stcAdcContCfg);
        
        return Ok;
}
void AdcContIrqCallback(void)
{
    //中断标志位判断和清零,已在库函数中处理Adc_IRQHandler();
        
    Adc_GetAccResult(&u32AdcResultAcc);
    Adc_ClrAccResult();
   
    //Adc_ClrContIrqState();
}

int32_t main(void)
{  
        My_Gpio_Init();
        My_Uart0_Init(0u , 9600u);
    My_Uart1_Init(0u , 9600u);
        delay100us(10);
        My_Adc_Init();
        printf("\r\napp start!\r\n");
        
    while(1)
        {
                Adc_Start();
                printf("u32AdcResultAcc:%d\r\n" , u32AdcResultAcc);
                delay1ms(500);
        }
}

----------------------------------------------------------
【已解决】后续:
楼下大佬解答u32AdcResultAcc是累加寄存器的值,计算电压公式的基础下再除以10就能够算出电压了。
float voltage = (u32AdcResultAcc / 10 / 4095.0) * 3.3;

输出打印图:

对应的ADC通道图:


使用特权

评论回复
沙发
LcwSwust| | 2024-12-5 14:07 | 只看该作者
然而,你发的代码是初始化过程,并没有“打印”。

使用特权

评论回复
评论
JacksonChen 2024-12-5 15:32 回复TA
@LcwSwust :解决了,谢谢你 
LcwSwust 2024-12-5 14:54 回复TA
@JacksonChen :Adc_GetAccResult(&u32AdcResultAcc); 估计就是这个函数里通过指针给u32AdcResultAcc赋了值,查一下这个函数的源代码。 
JacksonChen 2024-12-5 14:18 回复TA
忘记贴中断的代码了,不好意思 
板凳
wubangmi| | 2024-12-5 14:51 | 只看该作者
你打印的是累加寄存器的值,总共采样了10次,你把这个打印值除以10,就是当前通道的采样值

使用特权

评论回复
评论
JacksonChen 2024-12-5 15:31 回复TA
哦哦是这样啊,解决了,谢谢你 
地板
xionghaoyun| | 2024-12-6 13:46 | 只看该作者
stcAdcContCfg.u8AdcSampCnt = 0x09u;                 //P24 连续累加次数(次数 = 0x09+1)
自己看注释

使用特权

评论回复
5
yang377156216| | 2024-12-9 13:21 | 只看该作者
连续累加功能好用的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

26

帖子

0

粉丝