您尚未登录。

楼主 # 2022-11-21 17:03:20

khalilchen
会员
注册时间: 2022-11-03
已发帖子: 5
积分: 10

中微SC8F6790 ADC使用

#define ADC_Verf (2.0f)

void ADC_Init(void)
{
    /* RC0 配置为 模拟输入 */
    SET_BIT(TRISA, 0);
    SET_BIT(ANSEL0, 0);

    /*********** ADCON0 ****************************
            Bit7~Bit6  ADCS<1:0>:  AD转换时钟选择位。
                    00=  FSYS/8
                    01=  FSYS/16
                    10=  FSYS/32
                    11=  F RC (内部振荡器32KHz的时钟)
            Bit5~Bit2  CHS<3:0>:  模拟通道选择位。与ADCON1寄存器CHS4组合CHS<3:0>
                    00000=  AN0
                    00001=  AN1
                    00010=  AN2
                    00011=  AN3
                    ……  ……
                    01101=  AN13
                    01110=  OPA0/OPA1输出
                    01111=  0.6V固定参考电压
                    10000=  AN16
                    10001=  AN17
                    10010=  AN18
                    10011=  AN19
                    其他=  保留
            Bit1  GO/DONE: AD转换状态位。
                    1=  AD转换正在进行。将该位置1启动AD转换。当AD转换完成以后,该位由硬件自动清零。
                            当GO/DONE位从1变0或ADIF从0变1时,需至少等待两个TAD时间,才能再次启动AD转换。
                    0=  AD转换完成/或不在进行中。
            Bit0  ADON:  ADC使能位。
                    1=  使能ADC;
                    0=  禁止ADC,不消耗工作电流。
    *********************************************/
    // ADCON0 = 0X00; // A0,AD采样时间选为FSYS/8

    /*********** ADCON1 ****************************
            Bit7  ADFM:  AD转换结果格式选择位;
                    1=  右对齐;
                    0=  左对齐。
            Bit6  CHS4  与ADCON0的CHS3~0组合使能
            Bit5~Bit3  未用
            Bit2  LDO_EN:  内部参考电压使能位。
                    1=  使能ADC内部LDO参考电压;
                            当选择内部LDO作参考电压时,ADC最大有效精度为8位。
                    0=  VDD作为ADC参考电压。
            Bit1~Bit0  LDO_SEL<1:0>:  参考电压选择位
                    00=  禁用(注:选择内部LDO作为参考电压时,禁止为00)
                    01=  2.0V
                    10=  2.4V
                    11=  3.0V
    *********************************************/
    ADCON1 = 0x05;
}

float GetGasValue(void)
{
    float gas = 0.0f;
    uint32_t timeout = 1000;

    ADCON0 = 0X03; /* 打开通道A0 使能ADC并开启转换 */

    while (GET_ADC_CONVER_DONE_FLAG() && timeout--) {
        __delay_us(1);
    }

    if (timeout == 0)
        return -1;

    gas = (((uint16_t)ADRESH << 4) | (ADRESL >> 4)) * ADC_Verf / 4095;
    CLEAR_BIT(ADCON0, 0); /* 关闭ADC */

    return gas;
}

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn