你好,CH582单片机的ADC无法测量0-3.3V范围电压,只能测量0-2v的电压。 在0-2v的输入时,ADC的转换值为0-4080,超过2v后一直为4080.
ADC的PGA增益无论是配置成ADC_PGA_1_4 (-12db)或者ADC_PGA_0 (0db),结果都一样。不知哪里出了问题。
我的应用场景为测量电位器旋钮的位置,不需要精确,能粗略达到0-3.3v对应ADC值为0-4095转换值即可。下面为我的代码
//PA5 AIN1 - 光
#define GPIO_Pin_Light GPIO_Pin_5
#define ADC_Channel_Light 1
//PA0 AIN9 - 旋钮
#define GPIO_Pin_Knob GPIO_Pin_0
#define ADC_Channel_Knob 9
//PA4 AIN0 - 火焰离子
#define GPIO_Pin_Ion GPIO_Pin_4
#define ADC_Channel_Ion 0
void adc_init(void)
{
uint8_t pga = ADC_PGA_1_4;
GPIOA_ModeCfg(GPIO_Pin_Knob, GPIO_ModeIN_Floating);
GPIOA_ModeCfg(GPIO_Pin_Light, GPIO_ModeIN_Floating);
GPIOA_ModeCfg(GPIO_Pin_Ion, GPIO_ModeIN_Floating);
DelayMs(20);
ADC_ExtSingleChSampInit(SampleFreq_3_2, pga); //
ADC_PGACfg(pga);
RoughCalib_Value = ADC_DataCalib_Rough(); // 用于计算ADC内部偏差,记录到全局变量 RoughCalib_Value中
PRINT("#adcInit, ADC_PGA:%d, Calib_Value = %d \n", pga,RoughCalib_Value);
}
// 执行ADC转换 - 旋钮,每隔100ms调用一次
void excuteAdcConver_knob(void)
{
ADC_ChannelCfg(ADC_Channel_Knob);
adcRaw_knob = ADC_ExcutSingleConver() + RoughCalib_Value;
if(adcRaw_knob < 0){
adcRaw_knob = 0;
}
}
//获取未做滤波处理的ADC值
uint16_t getAdcRaw_knob(void)
{
return adcRaw_knob;
}
//下面为函数片段,每隔100ms调用一次
// 100ms周期,ADC转换,光和旋钮
if(events & SENSOR_TASK_EVT_PERIOD_100MS){
//adc检测
excuteAdcConver_knob();
excuteAdcConver_light();
return (events ^ SENSOR_TASK_EVT_PERIOD_100MS);
}
电路情况:
电位器旋钮为50k欧,三个管脚分别接GND,GPIO_Pin_Knob,3.3V。电位器中间抽头经过一个RC滤波(1k欧电阻+0.1u电容)接入单片机ADC引脚。
万用表实测在旋钮最小和最大之间旋转时,单片机的ADC管脚的电压为0-3.3V变化。VINTA管脚的电压为1.06V。单片机 不 启用内部DC-DC
项目被卡在这里,麻烦大神请帮忙分析下,万分感激!!!!!!