找回密码
 立即注册
查看: 42|回复: 7

15F2K60S2,ADC值获取不对

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-04-29 08:53:52
已绑定手机

8

主题

47

回帖

144

积分

注册会员

积分
144
发表于 4 天前 | 显示全部楼层 |阅读模式

#include "ADC.h"

//========================================================================
// 函数: void ADC_Inilize(ADC_InitTypeDef *ADCx)
// 描述: ADC初始化程序.
// 参数: ADCx: 结构参数,请参考adc.h里的定义.
// 返回: none.
// 版本: V1.0, 2012-10-22
//========================================================================
void ADC_Inilize(ADC_InitTypeDef *ADCx)
{
    P1ASF = ADCx->ADC_Px;
    ADC_CONTR = (ADC_CONTR & ~ADC_90T) | ADCx->ADC_Speed;
    if (ADCx->ADC_Power == ENABLE)
        ADC_CONTR |= 0x80;
    else
        ADC_CONTR &= 0x7F;
    if (ADCx->ADC_AdjResult == ADC_RES_H2L8)
        PCON2 |= (1 << 5); // 10位AD结果的高2位放ADC_RES的低2位,低8位在ADC_RESL。
    else
        PCON2 &= ~(1 << 5); // 10位AD结果的高8位放ADC_RES,低2位在ADC_RESL的低2位。
    if (ADCx->ADC_Interrupt == ENABLE)
        EADC = 1; // 中断允许       ENABLE,DISABLE
    else
        EADC = 0;
    if (ADCx->ADC_Polity == PolityHigh)
        PADC = 1; // 优先级设置  PolityHigh,PolityLow
    else
        PADC = 0;
}

//========================================================================
// 函数: void ADC_PowerControl(u8 pwr)
// 描述: ADC电源控制程序.
// 参数: pwr: 电源控制,ENABLE或DISABLE.
// 返回: none.
// 版本: V1.0, 2012-10-22
//========================================================================
void ADC_PowerControl(u8 pwr)
{
    if (pwr == ENABLE)
        ADC_CONTR |= 0x80;
    else
        ADC_CONTR &= 0x7f;
}

//========================================================================
// 函数: u16  Get_ADC10bitResult(u8 channel)
// 描述: 查询法读一次ADC结果.
// 参数: channel: 选择要转换的ADC.
// 返回: 10位ADC结果.
// 版本: V1.0, 2012-10-22
//========================================================================
u16 Get_ADC10bitResult(u8 channel) // channel = 0~7
{
    u16 adc;
    u8 i;

    if (channel > ADC_CH7)
        return 1024; // 错误,返回1024,调用的程序判断
    ADC_RES = 0;
    ADC_RESL = 0;

    ADC_CONTR = (ADC_CONTR & 0xe0) | ADC_START | channel;
    NOP(10); // 对ADC_CONTR操作后要4T之后才能访问

    for (i = 0; i < 250; i++) // 超时
    {
        if (ADC_CONTR & ADC_FLAG)
        {
            ADC_CONTR &= ~ADC_FLAG;
            if (PCON2 & (1 << 5)) // 10位AD结果的高2位放ADC_RES的低2位,低8位在ADC_RESL。
            {
                adc = (u16)(ADC_RES & 3);
                adc = (adc << 8) | ADC_RESL;
            }
            else // 10位AD结果的高8位放ADC_RES,低2位在ADC_RESL的低2位。
            {
                adc = (u16)ADC_RES;
                adc = (adc << 2) | (ADC_RESL & 3);
            }
            return adc;
        }
    }
    return 1024; // 错误,返回1024,调用的程序判断
}

//========================================================================
// 函数: void ADC_int(void) interrupt ADC_VECTOR
// 描述: ADC中断函数.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2012-10-22
//========================================================================
void ADC_int(void) interrupt ADC_VECTOR
{
    ADC_CONTR &= ~ADC_FLAG;
}


截图202504271041305258.jpg
截图202504271042468490.jpg
截图202504271043204534.jpg
截图202504271043576730.jpg
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-04-29 08:53:52
已绑定手机

8

主题

47

回帖

144

积分

注册会员

积分
144
发表于 4 天前 | 显示全部楼层
2个通道输入5V,其余通道没有输入;相邻通道的值不对


实验是,单片机5V供电
1、ADC8个通道,都悬空,获取所有通道的值,0=<每个通道的值 < 10
2、其中两个通道,输入高电平5V,2个通道值为1023-1024,相邻通道,400-500值
3、关闭一个通道的高电平,改为输入低电平,通道值变为0,相邻通道10左右
截图202504271046146490.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-04-29 08:53:52
已绑定手机

8

主题

47

回帖

144

积分

注册会员

积分
144
发表于 4 天前 | 显示全部楼层
ADC程序,用的是库,改了一个NOP(10); // 对ADC_CONTR操作后要4T之后才能访问

原来是NOP(4);也不正确
截图202504271047273173.jpg
截图202504271047421943.jpg
截图202504271048226158.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:297
  • 最近打卡:2025-05-01 06:53:32
已绑定手机

4

主题

339

回帖

1558

积分

金牌会员

积分
1558
发表于 4 天前 | 显示全部楼层
没有输入的通是悬空的还是有上下拉电阻
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-04-29 08:53:52
已绑定手机

8

主题

47

回帖

144

积分

注册会员

积分
144
发表于 4 天前 | 显示全部楼层
haiya*** 发表于 2025-4-27 11:07
没有输入的通是悬空的还是有上下拉电阻

悬空

实验是,单片机5V供电
1、ADC8个通道,都悬空,获取所有通道的值,0=<每个通道的值 < 10
2、其中两个通道,输入高电平5V,2个通道值为1023-1024,相邻通道,400-500值
3、关闭一个通道的高电平,改为输入低电平,通道值变为0,相邻通道10左右

点评

悬空是随机数且会受相邻通影响,正常  详情 回复 发表于 4 天前
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 4 天前 | 显示全部楼层
王*** 发表于 2025-4-27 11:18
悬空

实验是,单片机5V供电

悬空是随机数且会受相邻通影响,正常
不希望是随机数,禁止悬空
希望是0附近就对地接1M电阻
希望是最大值附近就对VREF接1M电阻

DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-04-29 08:53:52
已绑定手机

8

主题

47

回帖

144

积分

注册会员

积分
144
发表于 4 天前 | 显示全部楼层
Debu*** 发表于 2025-4-27 11:20
悬空是随机数且会受相邻通影响,正常
不希望是随机数,禁止悬空
希望是0附近就对地接1M电阻

问题解决,不悬空,就为0了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-04-29 08:53:52
已绑定手机

8

主题

47

回帖

144

积分

注册会员

积分
144
发表于 4 天前 | 显示全部楼层
Debu*** 发表于 2025-4-27 11:20
悬空是随机数且会受相邻通影响,正常
不希望是随机数,禁止悬空
希望是0附近就对地接1M电阻

问题解决,不悬空,相邻引脚输入低电平,就为0了,不受相邻通道影响
截图202504271133221947.jpg
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-1 21:01 , Processed in 0.132372 second(s), 94 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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