找回密码
 立即注册
查看: 65|回复: 2

adc快速切换通道 为什么误差会很大

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2025-10-17 01:50:27
已绑定手机

7

主题

17

回帖

117

积分

注册会员

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

void sensor(){  //这是ADC 使用     根据测试问题发现除了第一个读取的通道值是正常的   后面两个读取的值存在很大的误差  因为我把三个通道都放到第一个位置进行测试过  都是正常   只要不是第一个位置  那么读取的数据就存在很大的误差
        float xdata vl;
        vl=adc('r',3.3);
        print("热端原始%f\r\n",vl);
        r_temp=ntc((vl)/((3.3f-vl)/10000.0f));
        vl=adc('l',3.3f);
        print("冷端原始%f\r\n",vl);
        l_temp=ntc((vl)/((3.3f-vl)/10000.0f));
        
            
            switch (efficaciousGrade[grade])
            {
            case 1:
                l_temp=l_temp-4;
                break;
            case 2:
                l_temp=l_temp-6.5;
                break;
            case 3:
                l_temp=l_temp-10;
                break;
            case 4:
                l_temp=l_temp-12;
                break;
            
            default:
                break;
            }
            
            vl=adc('i',3.3f);
            
            inputv=13000.0f*(vl/3000.0f)+0.3f;
            // if (l_temp>=70)
            // {
            //  ledflicker(0,100);
            // }
            
            print("电压%f\r\n",inputv);
            print("冷端%f\r\n",l_temp);
            print("热端%f\r\n",r_temp);
}


//这是adc实现代码


#include <STC8H.h>
#include "adc.h"
#include <intrins.h>
#include "delay.h"
#include "print.h"
#define start ADC_CONTR |= 0x40;  // 启动转换
#define conversionFlag ADC_CONTR&0x20//转换完成标志
#define cleanConversionFlag   ADC_CONTR &= ~0x20;  //ADC完成标志位清零   
#define powerOn   ADC_CONTR |= 0x80;  // 开启ADC电源


float adc(char ch, float voltage)
{
    int res;
  switch (ch)
  {
    //p10
  case 'r':
     ADC_CONTR &=0xF0;
    break;
  //    //p36
  // case 'l':
  //   ADC_CONTR = (ADC_CONTR & 0xF0) | 0x0E;
  //   break;
  //   //p33
  // case 'v':
  //    ADC_CONTR |=0x0B;
  //    ADC_CONTR &=0xFB;//第三位清零
  // P11
  case 'i':
  //  ADC_CONTR = (ADC_CONTR & 0xF0) | 0x01;
    ADC_CONTR &=0XF0;
    ADC_CONTR |=0X01;
    break;
        //p10
  // case 'l':
  //    ADC_CONTR &=0xF0;
  //   break;
  //    //p11
  // case 'r':
  //   ADC_CONTR &=0XF0; //清除低位 ,高位不动
  //    ADC_CONTR |=0x01;//强制将第一位赋予1
  //   break;
    //p33
  case 'l':
     ADC_CONTR &=0xF0;
     ADC_CONTR |=0X0B;
    break;
  //   //p32
  // case 'l':
  //    ADC_CONTR &=0xF0;
  //    ADC_CONTR |=0x0A;
  //   break;
  //      //p34
  // case 'i':
  //   ADC_CONTR &=0XF0; //清除低位 ,高位不动
  //   ADC_CONTR |=0x0c;//强制赋予
  //   break;
     //p35
  // case 'o':
  //   ADC_CONTR &=0xF0;
  //   ADC_CONTR |=0x0D;
  //   break;
  }
EA = 0;            
start
_nop_(); _nop_();   // 等待硬件响应
while (!(conversionFlag));
cleanConversionFlag

res=(ADC_RES << 8) | ADC_RESL;  // 将ADC_    //读取ADC结果
return adcRes(res,voltage);
}
void adc_init()//300KSPS@24.000MHz
{
  P_SW2 |= 0x80;
  ADCTIM = 0x38;      
  ADCCFG &= ~0x0f;    //SPEED(0)
  ADCCFG |= 0x20;   //RESFMT(1) 结果右对齐
  ADCEXCFG = 0x04;      
  powerOn
Delay1ms(10);         // 延时
}
float adcRes(int num,float voltage )
{
   float res;
  //  print("num%d\r\n",num);
  res = voltage * (num / 1024.0f);
  EA = 1;
  return res;
}




回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:537
  • 最近打卡:2025-10-22 09:00:56
已绑定手机

48

主题

2286

回帖

8052

积分

论坛元老

积分
8052
发表于 6 天前 | 显示全部楼层
切换通道采样时建议连续采集2,3次,丢弃前1,2次的采样结果,避免采样电容的残存电压影响采样结果。
附件例程供参考:

16路ADC轮询-每路16次ADC转换取中间8次求平均值-串口1返回结果-STC8.zip

25.59 KB, 下载次数: 0

16路ADC轮询-每路16次ADC转换取中间8次求平均值-串口1返回结果-32G.zip

9.83 KB, 下载次数: 0

回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:207
  • 最近打卡:2025-10-22 16:14:07

80

主题

6795

回帖

1万

积分

超级版主

积分
14511
发表于 昨天 18:07 | 显示全部楼层
STC8H系列ADC是可以设置采样时间的,给足够的采样时间,切换就不会有问题。
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-10-23 05:14 , Processed in 0.114326 second(s), 65 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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