嵌入式学习小组
直播中

王萍

7年用户 1337经验值
私信 关注

n76e003的ADC配置问题求解

新唐单片机n76e003的ADC这么配置有什么问题吗?AD读出来是错的。
代码如下:
void ADC_Init(void)
{
        P0M1 |= 0X28;            //0010 1000        设置高阻输入(AIN4/AIN6)
        P0M2 &= 0xD7;  //1101 0111
      
        AINDIDS = 0x00;
        AINDIDS = 0x50;// 0101 0000        关闭数字输入功能
}

unsigned int Read_ADC_Value(unsigned char AD_IN)
{
        unsigned int AD_Value;
      
        AD_IN &= 0x0F;
        while(ADCS == 1);//等待空闲
        ADCF = 0;//清除转换完成标志
        ADCCON0 &= 0xF0;
        ADCCON0 |= AD_IN ;        //选择通道(AD_IN为4或6)
        ADCCON1 |= 0x01;        //´打开转换威廉希尔官方网站


        //ADCF = 0;//
        ADCS = 1;//开始转换
        delay_1us(3);
        while(ADCF == 0);//等待完成
        AD_Value = ADCRH;        //取高8位
        AD_Value <<= 4;      
        AD_Value = AD_Value|(ADCRL&0x0F);        //取低4位
        //ADCCON1 &= 0xFE;//
        AD_Value = AD_Value / 4;//12位转10位
        return (unsigned int)AD_Value;
}



回帖(1)

笑尽往事

2023-10-21 16:11:11
首先,看到代码中对P0口的设置,使用了按位或(|=)和“与等于”(&=)操作,如果这些设置与实际硬件连接相符的话,那么应该没有问题。

其次,我们需要检查ADC的配置是否正确。手册中提供了ADC的配置流程如下:

1. 设置ADC管脚为输入模式;

2. 设置ADC时钟频率;

3. 设置ADC输入通道;

4. 对ADC进行校准;

5. 启动ADC转换。

根据这个流程,我们可以看看代码是否符合要求,建议参考手册中的示例代码:

#include "N76E003.h"
#include "SFR_Macro.h"
#include "Function_define.h"
#include "Common.h"

void ADC_Init(void)
{
    // 1.设置ADC管脚为输入模式
    P07_Input_Mode;

    // 2.设置ADC时钟频率
    ADCCON0 = (ADCCON0 & 0xF3) | 0x08;        // ADC时钟= fsys/16,即2MHz

    // 3.设置ADC输入通道
    ADCCON1 |= SET_BIT0;                      // 选择CH0通道

    // 4.对ADC进行校准
    clr_ADCF;
    set_ADCS;
    while(ADCF == 0);
    clr_ADCF;
    ADCCON1 |= SET_BIT7;                      // 自动校准开启

    // 5.启动ADC转换
    clr_ADCF;
    set_ADCS;
}

在这个示例代码中,首先设置了P0.7口为输入模式,然后设置了ADC时钟频率为2MHz,在ADCCON1寄存器中选择了CH0通道,并进行了校准,最后启动了ADC转换。如果你的应用场景中需要多个通道采集,需要逐个设置。

最后,如果ADC读出来的结果不准确,还需要考虑参考电压的问题,因为ADC采集的电压范围与参考电压有关。参考电压可以是内部参考电压或外部参考电压,需要根据实际情况选择并设置。

希望以上信息能帮助您解决问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分