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;
}
各位大佬救我,求路过不平拔刀相助啊
#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
评论
2025-12-10
赞0
int32_t main(void)
{
PWM1_Init();
UART1_Init();
AD_Init();
while(1)
{
UartPwmControl();
Adc_Start(); //ADC开始转换
delay1ms(3000);
}
}
评论
2025-12-08
您需要登录后才可以回复 登录 | 注册