用STC8H1K08的P3.1口无法做ADC检测问题,已解决。
本帖最后由 KittyYang 于 2024-7-11 11:19 编辑我用P3.6口和P3.1口做两个温度传感器的检测
以下是我的部分代码
#define ADC_PowerENABLE() (ADC_CONTR |= 0x80)
#define ADC_PowerDISABLE() (ADC_CONTR &= 0x7F)
#define TEMPERATURE_AD_CH 14 // ADC14
#define TEMPERATURE2_AD_CH 9 //ADC9
void ADC_config(void)
{
ADCCFG = (ADCCFG & ~ADC_SPEED_2X16T) | ADC_SPEED_2X1T;
ADC_CONTR |= 0x80;
ADCCFG |= (1 << 5);
EADC = 0;
P_SW2 |= 0x80;
ADCTIM = (0 << 7) | (1 << 5) | (31);
P_SW2 &= 0x7f;
ADC_PowerENABLE();
}
u16 Get_ADC12bitResult(u8 channel) //channel = 0~15
{
ADC_RES = 0;
ADC_RESL = 0;
ADC_CONTR = (ADC_CONTR & 0xF0) | 0x40 | channel; //启动 AD 转换
_nop_();
_nop_();
_nop_();
while((ADC_CONTR & 0x20) == 0); //等待ADC结束
ADC_CONTR &= ~0x20; //清除ADC结束标志
return (((u16)ADC_RES << 8) | ADC_RESL);
}
u16 get_adc_value(u8 chn)
{
u16 adcBuff;
u8 i;
u8 varout, varin;
u16 temp,average;
Get_ADC12bitResult(chn); //参数i=0~15,查询方式做一次ADC, 切换通道后第一次转换结果丢弃. 避免采样电容的残存电压影响.
Get_ADC12bitResult(chn); //参数i=0~15,查询方式做一次ADC, 切换通道后第二次转换结果丢弃. 避免采样电容的残存电压影响.
for(i=0;i<5;i++)
{
adcBuff = Get_ADC12bitResult(chn);
}
temp = adcBuff + adcBuff + adcBuff;
average = temp/3;
return average;
}
static void temperature_rise_limit(void)
{
u16 result1,result2;
result1 = get_adc_value(TEMPERATURE_AD_CH);
P3M0 &= ~0x02;
P3M1 |= 0x02;
result2 = get_adc_value(TEMPERATURE2_AD_CH);
}
看红字部分,是不是ADC电源启动之后等待时间不足?
请将你实际原理图的高清PDF 发上来,大家帮你分析
P31默认上电是准双向,如果程序里没有重新配置为高阻,有可能影响ADC检测,具体要看外围电路. 有什么问题能描述一下吗?只说有问题,我难以猜测。
页:
[1]