查看: 3525|回复: 10

[求助] 关于MK10DX256VLL7的ADC不准问题

[复制链接]

该用户从未签到

3

主题

9

帖子

0

新手上路

Rank: 1

积分
46
最后登录
1970-1-1
发表于 2015-6-11 13:40:17 | 显示全部楼层 |阅读模式
1.6V的电压接入ADC0_SE4a,ADC转换结果一直是1.13V左右(采用外部VREFH/VREFL参考-3.3V),无论是10位12位还是16位,都差不多。
接入其他几个管脚SE5a,6a,7a试了一下,一样的结果,不知道问题出在哪里了
我知道答案 目前已有10人回答
回复

使用道具 举报

该用户从未签到

3

主题

9

帖子

0

新手上路

Rank: 1

积分
46
最后登录
1970-1-1
 楼主| 发表于 2015-6-11 13:51:08 | 显示全部楼层
ADC0_CFG1=0x7F;//0x5C;
                ADC0_CFG2=0x01;
                ADC0_SC1A=0x04;        //通道
                //ADC0_SC2=0x00;
                //ADC0_SC3=0x00;
                while ((ADC0_SC1A & 0x80 ) != 0x80);
                wAiVal_Av[0][0]=ADC0_RA;
                ADC0_SC1A &=~0x7F;

这是后来没办法自己看寄存器说明写的读ADC程序,结果和龙丘的代码是一样的,都是1.13V左右
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

9

帖子

0

新手上路

Rank: 1

积分
46
最后登录
1970-1-1
 楼主| 发表于 2015-6-11 13:52:09 | 显示全部楼层
//============================================================================
//函数名称:hw_adc_init
//函数返回:0 成功 ,1 失败
//参数说明:MoudelNumber:模块号
//功能概要:AD初始化
//============================================================================
uint8 hw_adc_init(int MoudelNumber)
{
    if(MoudelNumber == 0)//模块0
    {
        SIM_SCGC6 |= (SIM_SCGC6_ADC0_MASK );

        SIM_SOPT7 &= ~(SIM_SOPT7_ADC0ALTTRGEN_MASK  |
                      SIM_SOPT7_ADC0PRETRGSEL_MASK);
        SIM_SOPT7 = SIM_SOPT7_ADC0TRGSEL(0);
    }
    else if(MoudelNumber == 1)//模块1
    {      
        SIM_SCGC3 |= (SIM_SCGC3_ADC1_MASK );

        SIM_SOPT7 &= ~(SIM_SOPT7_ADC1ALTTRGEN_MASK  |
                      SIM_SOPT7_ADC1PRETRGSEL_MASK) ;
        SIM_SOPT7 = SIM_SOPT7_ADC1TRGSEL(0);
    }
    else
    {
        return 0;
    }
   
    return 1;
}
//============================================================================
//函数名称:hw_ad_once
//函数返回:无符号结果值(范围:0-4095)
//参数说明:MoudelNumber:模块号
//               Channel:通道号
//              accuracy:精度
//功能概要:采集一次一路模拟量的AD值   
//============================================================================
uint16 hw_ad_once(int MoudelNumber,int Channel,uint8 accuracy)//采集某路模拟量的AD值
{
    uint16 result = 0;
    //开始ADC转换
    hw_adc_convertstart(MoudelNumber, Channel, accuracy);       

    if(MoudelNumber == 0)
    {
        while (( ADC0_SC1A & ADC_SC1_COCO_MASK ) != ADC_SC1_COCO_MASK)
        {

        }
        result = ADC0_RA;
        ADC0_SC1A &= ~ADC_SC1_COCO_MASK;
    }
    else
    {
        while (( ADC1_SC1A & ADC_SC1_COCO_MASK ) != ADC_SC1_COCO_MASK)
        {

        }
        result = ADC1_RA;        
        ADC1_SC1A &= ~ADC_SC1_COCO_MASK;
    }

    return result;
}
//============================================================================
//函数名称:hw_adc_convertstart
//函数返回:0 成功 ,1 失败
//参数说明:MoudelNumber:模块号
//               Channel:通道号
//              accuracy:精度
//功能概要:开始adc转换
//============================================================================
uint8 hw_adc_convertstart(int MoudelNumber,int Channel,uint8 accuracy)
{
    uint8 ADCCfg1Mode = 0;
   
    switch(accuracy)
    {
      case 8:
        ADCCfg1Mode = 0x00;
        break;
      case 12:
        ADCCfg1Mode = 0x01;
        break;
      case 10:
        ADCCfg1Mode = 0x02;
        break;
      case 16:
        ADCCfg1Mode = 0x03;
        break;
      default:
        ADCCfg1Mode = 0x00;
    }
   

   
   
   
   
    //初始化ADC默认配置
    Master_Adc_Config.CONFIG1  = ADLPC_NORMAL
                              | ADC_CFG1_ADIV(ADIV_4)
                              | ADLSMP_LONG
                              | ADC_CFG1_MODE(ADCCfg1Mode)
                              | ADC_CFG1_ADICLK(ADICLK_BUS);
    Master_Adc_Config.CONFIG2  = MUXSEL_ADCA
                              | ADACKEN_DISABLED
                              | ADHSC_HISPEED
                              | ADC_CFG2_ADLSTS(ADLSTS_20);
    Master_Adc_Config.COMPARE1 = 0x1234u ;                 //任意值
    Master_Adc_Config.COMPARE2 = 0x5678u ;                 //任意值
                                                         
   
    if(MoudelNumber == 0)
    {
        if(Channel>3&&Channel<24)                             //4~23 使用 ADC0
        {
            Master_Adc_Config.STATUS1A = AIEN_ON | DIFF_SINGLE | ADC_SC1_ADCH(Channel);
            hw_adc_config_alt(ADC0_BASE_PTR, &Master_Adc_Config);  // 配置 ADC0
        }
        else if(Channel == 26)
        {
            Master_Adc_Config.STATUS1A = AIEN_ON | DIFF_SINGLE | ADC_SC1_ADCH(Channel);
            hw_adc_config_alt(ADC0_BASE_PTR, &Master_Adc_Config);  // 配置ADC0
        }
        else
        {
            return 0;
        }
    }
    else
    {
        if(Channel>3&&Channel<24)                             //4~23 使用 ADC1
        {
            Master_Adc_Config.STATUS1A = AIEN_ON | DIFF_SINGLE | ADC_SC1_ADCH(Channel);
            hw_adc_config_alt(ADC1_BASE_PTR, &Master_Adc_Config);  // 配置ADC1
        }
        else if(Channel == 26)
        {
            Master_Adc_Config.STATUS1A = AIEN_ON | DIFF_SINGLE | ADC_SC1_ADCH(Channel);
            hw_adc_config_alt(ADC1_BASE_PTR, &Master_Adc_Config);  // 配置ADC1
        }
        else
        {
            return 0;
        }
    }
    return 1;
}
//============================================================================
//函数名称:hw_adc_config_alt
//函数返回:无符号结果值(范围:0-4095)
//参数说明:adcmap:adc基址寄存器地址
//          ADC_CfgPtr: 存放 寄存器值的结构体   
//功能概要:将adc寄存器结构体配置进adc寄存器
//============================================================================
void ADC_Config_Alt(ADC_MemMapPtr adcmap, tADC_ConfigPtr ADC_CfgPtr)
{
    ADC_CFG1_REG(adcmap) = ADC_CfgPtr->CONFIG1;
    ADC_CFG2_REG(adcmap) = ADC_CfgPtr->CONFIG2;
    ADC_CV1_REG(adcmap)  = ADC_CfgPtr->COMPARE1;
    ADC_CV2_REG(adcmap)  = ADC_CfgPtr->COMPARE2;
    ADC_SC2_REG(adcmap)  = ADC_CfgPtr->STATUS2;
    ADC_SC3_REG(adcmap)  = ADC_CfgPtr->STATUS3;
    ADC_PGA_REG(adcmap)  = ADC_CfgPtr->PGA;
    ADC_SC1_REG(adcmap,A)= ADC_CfgPtr->STATUS1A;
    ADC_SC1_REG(adcmap,B)= ADC_CfgPtr->STATUS1B;
}
void hw_adc_config_alt(ADC_MemMapPtr adcmap, tADC_ConfigPtr ADC_CfgPtr)
{
    ADC_CFG1_REG(adcmap) = ADC_CfgPtr->CONFIG1;
    ADC_CFG2_REG(adcmap) = ADC_CfgPtr->CONFIG2;
    ADC_CV1_REG(adcmap)  = ADC_CfgPtr->COMPARE1;
    ADC_CV2_REG(adcmap)  = ADC_CfgPtr->COMPARE2;
    ADC_SC2_REG(adcmap)  = ADC_CfgPtr->STATUS2;
    ADC_SC3_REG(adcmap)  = ADC_CfgPtr->STATUS3;
    ADC_PGA_REG(adcmap)  = ADC_CfgPtr->PGA;
    ADC_SC1_REG(adcmap,A)= ADC_CfgPtr->STATUS1A;      
    ADC_SC1_REG(adcmap,B)= ADC_CfgPtr->STATUS1B;
}

//============================================================================
//函数名称:hw_adc_convertstop
//函数返回:0 成功 ,1 失败
//参数说明:MoudelNumber:模块号
//               Channel:通道号
//功能概要:停止ADC转换  
//============================================================================
uint8 hw_adc_convertstop(int MoudelNumber,int Channel)
{
    if(MoudelNumber == 0)
    {
        if(Channel>3&&Channel<24)                             //4~23 使用 ADC0
        {
            Master_Adc_Config.STATUS1A = AIEN_ON | DIFF_SINGLE | ADC_SC1_ADCH(0x1F);
            ADC_Config_Alt(ADC0_BASE_PTR, &Master_Adc_Config);  // 配置ADC0
        }
        else if(Channel == 26)
        {
            Master_Adc_Config.STATUS1A = AIEN_ON | DIFF_SINGLE | ADC_SC1_ADCH(0x1F);
            ADC_Config_Alt(ADC0_BASE_PTR, &Master_Adc_Config);  // 配置ADC0
        }
        else
        {
            return 0;
        }
    }
    else if(MoudelNumber == 1)
    {
        if(Channel>3&&Channel<24)                             //4~23 使用 ADC1
        {
            Master_Adc_Config.STATUS1A = AIEN_ON | DIFF_SINGLE | ADC_SC1_ADCH(0x1F);
            ADC_Config_Alt(ADC1_BASE_PTR, &Master_Adc_Config);  //  配置ADC1
        }
        else if(Channel == 26)
        {
            Master_Adc_Config.STATUS1A = AIEN_ON | DIFF_SINGLE | ADC_SC1_ADCH(0x1F);
            ADC_Config_Alt(ADC1_BASE_PTR, &Master_Adc_Config);  //  配置ADC1
        }
        else
        {
            return 0;
        }
    }
    else
    {
        return 0;
    }
    return 1;
}

这是原龙丘代码,结果都一样
回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2015-6-11 14:14:20 | 显示全部楼层
楼主ADC校准了没有?
你可以参考下我们的ADC例程:
Kinetis 100MHz ADC
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

9

帖子

0

新手上路

Rank: 1

积分
46
最后登录
1970-1-1
 楼主| 发表于 2015-6-11 15:18:41 | 显示全部楼层
没有校准,如何校准?
新片子上来先要 校准?
回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2015-6-11 15:22:10 | 显示全部楼层
yangygb 发表于 2015-6-11 15:18
没有校准,如何校准?
新片子上来先要 校准?

要校准,参考我给你的代码链接。
回复 支持 反对

使用道具 举报

  • TA的每日心情
    慵懒
    2016-11-24 10:19
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    50

    主题

    1028

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2870
    最后登录
    1970-1-1
    发表于 2015-6-11 15:29:02 | 显示全部楼层
    是要校准的
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2025-5-7 09:07
  • 签到天数: 353 天

    连续签到: 1 天

    [LV.8]以坛为家I

    141

    主题

    8056

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5788
    最后登录
    2025-5-7
    发表于 2015-6-11 16:53:04 | 显示全部楼层
    学习学习
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

    该用户从未签到

    2

    主题

    205

    帖子

    0

    高级会员

    Rank: 4

    积分
    516
    最后登录
    2016-2-16
    发表于 2015-6-11 20:48:04 | 显示全部楼层
    电路板有问题么
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    3

    主题

    9

    帖子

    0

    新手上路

    Rank: 1

    积分
    46
    最后登录
    1970-1-1
     楼主| 发表于 2015-6-12 01:36:26 | 显示全部楼层
    问题终于解决了,弄了半天是我板子少焊一个元件,就是模拟地和数字地跨接的0欧电阻没焊,导致两边地电位不同,版主结贴。
    谢谢楼上各位的热心解答
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-9-14 21:25 , Processed in 0.106208 second(s), 30 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表