找回密码
 立即注册
查看: 432|回复: 3

8h1k08-36i ADC读取问题

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:41
  • 最近打卡:2025-04-12 15:59:55

10

主题

17

回帖

74

积分

注册会员

积分
74
发表于 2024-9-4 22:11:50 | 显示全部楼层 |阅读模式
本帖最后由 tailimo 于 2024-9-4 22:14 编辑

我使用ADC10与13通道读取电位器的ad值 ,通过PWM输出给灯(PWM测试过是正常的),
供电与ADC_Vref为3.1v左右
一个通道输入为0v时,另外一个通道可以正常输出10位ad值

当其中一个通道输入电压值大于另外一个通道大约1v时  ,   输入电压值小的其ad值将变为0左右(指 存在一个1v左右压差)

子函数

void ADCInit(void)
{
        ADC_CONTR = 0x00;        //关闭adc        
        ADCCFG = 0xf0;                //右对其
        ADCTIM = 0x3d;                //300K
}

unsigned int ADC10_Start(void)
{
        ADC_CONTR = 0xca;                        //启动adc10通道
        while(!(ADC_CONTR&0x20));        //判断是否完成
        ADC10value=256*ADC_RES;
        ADC10value+=ADC_RESL;
        ADC_CONTR = 0x80;                  //清除标志
        return ADC10value;                        //返回ADC值
}


unsigned int ADC13_Start(void)
{
        ADC_CONTR = 0xcd;                        //启动adc13通道
        while(!(ADC_CONTR&0x20));        //判断是否完成
        ADC13value=256*ADC_RES;
        ADC13value+=ADC_RESL;
        ADC_CONTR = 0x80;
        return ADC13value;                        //返回ADC值
}


void ADC_Open(void)
{
ADC_CONTR = 0x80;        //开启adc        
_nop_();

}

主程序main
        P_SW2 = 0x80;
初始化......

unsigned int a=0,b=0;

ADC_Open();



while(1)
        {
                a = ADC10_Start();
                b = ADC13_Start();

        PWM_82_CCR_Value(a);          //写入PWM8_2的CCR寄存器
        PWM_4N_CCR_Value(b);          //写入PWM4N的CCR寄存器

}





回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:426
  • 最近打卡:2025-05-04 08:10:23
已绑定手机

77

主题

4851

回帖

8444

积分

超级版主

DebugLab

积分
8444
发表于 2024-9-4 23:27:39 | 显示全部楼层
本帖最后由 DebugLab 于 2024-9-4 23:41 编辑


建议使用中断
初始化:
        ADCCFG=ADC_RESFMT;                //设置ADC转换结果右对齐,设置ADC时钟
        ADC_CONTR=ADC_POWER;        //使能ADC
        ADC_CONTR|=5;                        //设置ADC通道为ADC5
        ADC_CONTR|=ADC_START;        //启动ADC
        EADC=1;                                        //使能ADC中断
中断:
void ADC_Isr(void) interrupt 5
{
        ADC_CONTR&=~ADC_FLAG;
        ADC_Value=ADC_RES;
        ADC_Value<<=8;
        ADC_Value|=ADC_RESL;
        ADC_CONTR|=ADC_START;

}

DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:176
  • 最近打卡:2025-02-19 17:24:49

15

主题

265

回帖

1387

积分

金牌会员

积分
1387
发表于 2024-9-5 07:23:07 | 显示全部楼层
Debu*** 发表于 2024-9-4 23:27
建议使用中断
初始化:
        ADCCFG=ADC_RESFMT;                //设置ADC转换结果右对齐,设置ADC时 ...

顺序换换
void ADC_Isr(void) interrupt 5
{
      
        ADC_Value=ADC_RES;
        ADC_Value<<=8;
        ADC_Value|=ADC_RESL;
        ADC_CONTR&=~ADC_FLAG;
        ADC_CONTR|=ADC_START;

}
另外我没看手册是几位的adc,楼主左移了两位是10位adc的写法,你左移了8位是16位adc写法。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:41
  • 最近打卡:2025-04-12 15:59:55

10

主题

17

回帖

74

积分

注册会员

积分
74
发表于 2024-9-5 16:05:21 | 显示全部楼层
本帖最后由 tailimo 于 2024-9-5 16:38 编辑

解决了一半,   中断处理ad值,外部重复采样+延时 起码采样2次,前后延时10us 取采样第二个ad值就可以了, 根本问题还是没有解决,  输入电压小的, 在通道与通道压差 大于或者小于1v时, 输入电压小的ad值还是会变小一点
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-4 10:31 , Processed in 0.159956 second(s), 67 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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