- 打卡等级:偶尔看看III
- 打卡总天数:31
- 最近打卡:2025-03-31 16:46:26
中级会员
- 积分
- 220
|
单片机型号,STC32G8K64,用的是3.3V供电,内部晶振选24MHz,尝试了官网例程DMA方式,ADC中断方式,ADC查询方式,均不成功。
以下代码是比较接近的,但是也有问题。
现象1:采用通道2的值会受通道3影响,P1.2脚接入3.3V,采集不到ADC值,通道2和通道3都没有变化。
现象2:P1.3脚接入3.3V,通道3ADC能捕捉到3.3V,但是通道2的值也会跟着变化,电压值有1.8V。
尝试,1秒采集轮巡两个通道各采集一次,均无法成功。
尝试,单独采集通道2,通道2的值无法采集,烦请技术支持下。
IO配置:
P1_MODE_IN_HIZ(GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_6|GPIO_Pin_7);
//ADC 配置
void ADC_config(void)
{
ADC_InitTypeDef ADC_InitStructure; //结构定义
ADC_InitStructure.ADC_SMPduty = 31; //ADC 模拟信号采样时间控制, 0~31(注意: SMPDUTY 一定不能设置小于 10)
ADC_InitStructure.ADC_CsSetup = 0; //ADC 通道选择时间控制 0(默认),1
ADC_InitStructure.ADC_CsHold = 1; //ADC 通道选择保持时间控制 0,1(默认),2,3
ADC_InitStructure.ADC_Speed = ADC_SPEED_2X1T; //设置 ADC 工作时钟频率 ADC_SPEED_2X1T~ADC_SPEED_2X16T
ADC_InitStructure.ADC_AdjResult = ADC_RIGHT_JUSTIFIED; //ADC结果调整, ADC_LEFT_JUSTIFIED,ADC_RIGHT_JUSTIFIED
ADC_Inilize(&ADC_InitStructure); //初始化
ADC_PowerControl(ENABLE); //ADC电源开关, ENABLE或DISABLE
NVIC_ADC_Init(DISABLE,Priority_3); //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
}
u16 Get_ADCResult(u8 channel) //channel = 0~15
{
if(channel > ADC_CH15) return 4096; //错误,返回4096,调用的程序判断
ADC_RES = 0;
ADC_RESL = 0;
ADC_CONTR = (ADC_CONTR & 0xf0) | channel; //设置ADC转换通道
ADC_START = 1;//启动ADC转换
NOP(4); //对ADC_CONTR操作后要4T之后才能访问
while(ADC_FLAG == 0);
ADC_FLAG = 0;//清除ADC结束标志
return (((u16)ADC_RES << 8) | ADC_RESL);
}
//采集ADC部分
ADC_VAL = Get_ADCResult(2);
ADCSUM1 += Get_ADCResult(2);
ADC_VAL = Get_ADCResult(3);
ADCSUM2 += Get_ADCResult(3);
if(++SumCount>=10)
{
SumCount=0;
//求平均值
INVALUE1=ADCSUM1/10;
INVALUE2=ADCSUM2/10;
//把累加值清零
ADCSUM1=0;
ADCSUM2=0;
//计算电压,这里*33而不是乘以3.3,相当于把电压值乘以10倍。
BatV1=((INVALUE1*33)/4096);
BatV2=((INVALUE2*33)/4096);
}
|
|