本帖最后由 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通道图:
|