adc

作者: 昨天剩下的一杯冷茶 | 来源:发表于2020-07-27 17:21 被阅读0次
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;                   //使能温度传感

相关文章

网友评论

      本文标题:adc

      本文链接:https://www.haomeiwen.com/subject/xlxtrktx.html