[技术问答] HC32L110C6UA使用ADC电压数据采集的问题 -- 已解决

[复制链接]
 楼主| JacksonChen 发表于 2024-12-5 13:55 | 显示全部楼层 |阅读模式
本帖最后由 JacksonChen 于 2024-12-5 16:52 编辑

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


----------------------------------------------------------
输出打印图:
541967513fd13e2dc.png

----------------------------------------------------------
核心代码:
  1. en_result_t My_Adc_Init(void)
  2. {
  3.         stc_adc_cfg_t                                stcAdcCfg;
  4.         stc_adc_cont_cfg_t                        stcAdcContCfg;
  5.         stc_adc_irq_t                                stcAdcIrq;
  6.         stc_adc_irq_calbakfn_pt_t        stcAdcIrqCalbaks;
  7.         
  8.         DDL_ZERO_STRUCT(stcAdcCfg);
  9.     DDL_ZERO_STRUCT(stcAdcContCfg);
  10.     DDL_ZERO_STRUCT(stcAdcIrq);
  11.     DDL_ZERO_STRUCT(stcAdcIrqCalbaks);
  12.         
  13. //        Clk_SwitchTo(ClkRCL);
  14. //        Clk_SetRCHFreq(ClkFreq24Mhz);
  15. //        Clk_SwitchTo(ClkRCH);
  16.         
  17.     Clk_SetPeripheralGate(ClkPeripheralGpio, TRUE);                                //GPIO 外设时钟使能
  18.     if (Ok != Clk_SetPeripheralGate(ClkPeripheralAdcBgr, TRUE))        //ADCBGR 外设时钟使能
  19.     {
  20.         return Error;
  21.     }
  22.         
  23.     Gpio_SetAnalog(2, 4, TRUE);
  24.         
  25.     //ADC配置
  26.     Adc_Enable();
  27.     M0P_BGR->CR_f.BGR_EN = 0x1u;  //BGR必须使能
  28.     M0P_BGR->CR_f.TS_EN = 0x1u;   //内置温度传感器,视使用需求
  29.     delay100us(1);
  30.    
  31.     stcAdcCfg.enAdcOpMode = AdcContMode;                //连续采样模式
  32.     stcAdcCfg.enAdcClkSel = AdcClkSysTDiv1;             //PCLK
  33.     stcAdcCfg.enAdcSampTimeSel = AdcSampTime8Clk;       //8个采样时钟
  34.     // stcAdcCfg.enAdcRefVolSel = RefVolSelInBgr2p5;    //参考电压:内部2.5V(avdd>3V,SPS<=200kHz)
  35.     stcAdcCfg.enAdcRefVolSel = RefVolSelAVDD;           //参考电压:AVDD
  36.     // stcAdcCfg.bAdcInBufEn = TRUE;
  37.     stcAdcCfg.bAdcInBufEn = FALSE;                      //电压跟随器如果使能,SPS采样速率 <=200K
  38.     stcAdcCfg.enAdcTrig0Sel = AdcTrigDisable;           //ADC转换自动触发设置
  39.     stcAdcCfg.enAdcTrig1Sel = AdcTrigDisable;
  40.     Adc_Init(&stcAdcCfg);   
  41.    
  42.     stcAdcIrq.bAdcIrq = TRUE;                            //转换完成中断函数入口配置使能
  43.     stcAdcIrq.bAdcRegCmp = FALSE;
  44.     stcAdcIrq.bAdcHhtCmp = FALSE;
  45.     stcAdcIrq.bAdcLltCmp = FALSE;
  46.     stcAdcIrqCalbaks.pfnAdcContIrq = AdcContIrqCallback; //转换完成中断入口函数
  47.     stcAdcIrqCalbaks.pfnAdcRegIrq = AdcRegIrqCallback;
  48.     stcAdcIrqCalbaks.pfnAdcHhtIrq = AdcHhtIrqCallback;
  49.     stcAdcIrqCalbaks.pfnAdcLltIrq = AdcLltIrqCallback;
  50.     Adc_ConfigIrq(&stcAdcIrq, &stcAdcIrqCalbaks);        //转换中断入口函数配置
  51.     Adc_EnableIrq();                                     //中断使能
  52.     Adc_CmpCfg(&stcAdcIrq);                              //结果比较中断使能/禁止配置
  53.    
  54.    
  55.     stcAdcContCfg.enAdcContModeCh = AdcExInputCH0;      //通道0 P24
  56.     stcAdcContCfg.u8AdcSampCnt = 0x09u;                 //P24 连续累加次数(次数 = 0x09+1)
  57.     stcAdcContCfg.bAdcResultAccEn = TRUE;               //累加使能
  58.     Adc_ConfigContMode(&stcAdcCfg, &stcAdcContCfg);
  59.         
  60.         return Ok;
  61. }
  1. void AdcContIrqCallback(void)
  2. {
  3.     //中断标志位判断和清零,已在库函数中处理Adc_IRQHandler();
  4.         
  5.     Adc_GetAccResult(&u32AdcResultAcc);
  6.     Adc_ClrAccResult();
  7.    
  8.     //Adc_ClrContIrqState();
  9. }

  10. int32_t main(void)
  11. {  
  12.         My_Gpio_Init();
  13.         My_Uart0_Init(0u , 9600u);
  14.     My_Uart1_Init(0u , 9600u);
  15.         delay100us(10);
  16.         My_Adc_Init();
  17.         printf("\r\napp start!\r\n");
  18.         
  19.     while(1)
  20.         {
  21.                 Adc_Start();
  22.                 printf("u32AdcResultAcc:%d\r\n" , u32AdcResultAcc);
  23.                 delay1ms(500);
  24.         }
  25. }

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

输出打印图:
37159675158bb63969.png
对应的ADC通道图:
7290675169a0a1c2e.png

LcwSwust 发表于 2024-12-5 14:07 | 显示全部楼层
然而,你发的代码是初始化过程,并没有“打印”。

评论

[url=home.php?mod=space&uid=3069604]@LcwSwust[/url] :解决了,谢谢你  发表于 2024-12-5 15:32
[url=home.php?mod=space&uid=3507190]@JacksonChen[/url] :Adc_GetAccResult(&u32AdcResultAcc); 估计就是这个函数里通过指针给u32AdcResultAcc赋了值,查一下这个函数的源代码。  发表于 2024-12-5 14:54
忘记贴中断的代码了,不好意思  发表于 2024-12-5 14:18
wubangmi 发表于 2024-12-5 14:51 | 显示全部楼层
你打印的是累加寄存器的值,总共采样了10次,你把这个打印值除以10,就是当前通道的采样值

评论

哦哦是这样啊,解决了,谢谢你  发表于 2024-12-5 15:31
xionghaoyun 发表于 2024-12-6 13:46 | 显示全部楼层
stcAdcContCfg.u8AdcSampCnt = 0x09u;                 //P24 连续累加次数(次数 = 0x09+1)
自己看注释
yang377156216 发表于 2024-12-9 13:21 | 显示全部楼层
连续累加功能好用的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

26

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

7

主题

26

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部