uint16 read_vdd_value(uint8 channel, uint8 resolution)
{
unsigned int reading = 0;
uint8 i, resbits;
uint8 adcChannel = 1;
if (channel < 8)
{
for (i=0; i < channel; i++)
{
adcChannel <<= 1;
}
}
ADCCFG |= adcChannel;
switch (resolution)
{
case HAL_ADC_RESOLUTION_8:
resbits = HAL_ADC_DEC_064;
break;
case HAL_ADC_RESOLUTION_10:
resbits = HAL_ADC_DEC_128;
break;
case HAL_ADC_RESOLUTION_12:
resbits = HAL_ADC_DEC_256;
break;
case HAL_ADC_RESOLUTION_14:
default:
resbits = HAL_ADC_DEC_512;
break;
}
ADCCON3 = channel | resbits | HAL_ADC_REF_125V;//HAL_ADC_REF_VOLT;
while (!(ADCCON1 & HAL_ADC_EOC));
//ADCCFG寄存器的真正名字是 APCFG
ADCCFG &= (adcChannel ^ 0xFF);
reading = ADCL >> 2; //ADCL 寄存器低 2 位无效
reading |= (((uint16)(ADCH & 0x3f)) << 6);
return ((uint16)reading);
}
//显示ADC的值,根据自己实际情况改
#define ADC_TO_CELSIUS(ADC_VALUE) ((float)ADC_VALUE*1.25/4096.0)
adc = read_vdd_value(HAL_ADC_CHN_VDD3,HAL_ADC_RESOLUTION_12);
adc_f = ADC_TO_CELSIUS(adc);
adc_f_vdd = adc_f*3;
如果需要读取内部芯片,还需要添加两行,将通道改外#define ADC_EMP_SENS 0x0E,其他的就和普通ADC一样。(好像芯片的内部温度偏差较大,但本人没有试验。)
TR0=0x01; //设置为1来连接温度传感器到SOC_ADC
ATEST=0x01; //使能温度传感
网友评论