找回密码
 立即注册
查看: 341|回复: 9

为什么我ADC的速度非常低?求教

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-01-27 22:53:28
已绑定手机

9

主题

5

回帖

79

积分

注册会员

积分
79
发表于 2025-2-9 02:49:03 来自手机 | 显示全部楼层 |阅读模式
正在做一个简单的示波器,在制作时发现不管我怎么去配置ADC的速度,ADC的速度都超不过25khz,
主频调的很高都没用,就像在35MHZ主频的时候,设置ADCSPEED为3,
12位ADC频率的计算公式得到ADC速率=35M/(2*4*26)=168khz(按默认设置为26个ADC时钟)。
我的代码就是让定时器每隔一段时间就读取一次ADC然后记录到数组上画出来,
我发现定时器调到大于40us左右的时候都是正常的,
一但低于这个ADC的速度好像就上不去了这是为什么啊?
我真是想不明白



回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

717

主题

1万

回帖

1万

积分

管理员

积分
15617
发表于 2025-2-9 08:26:22 | 显示全部楼层
截图202502090826069707.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

717

主题

1万

回帖

1万

积分

管理员

积分
15617
发表于 2025-2-9 08:27:45 | 显示全部楼层
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-01-27 22:53:28
已绑定手机

9

主题

5

回帖

79

积分

注册会员

积分
79
发表于 2025-2-9 12:21:48 | 显示全部楼层

这个我试过了采样速率还是上不去
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:107
  • 最近打卡:2025-05-02 08:23:56
已绑定手机

5

主题

28

回帖

319

积分

中级会员

积分
319
发表于 2025-2-9 13:15:09 | 显示全部楼层
为什么 为什么你不把关键代码贴上来。让大家猜游戏吗?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-01-27 22:53:28
已绑定手机

9

主题

5

回帖

79

积分

注册会员

积分
79
发表于 2025-2-9 13:32:08 | 显示全部楼层
13259*** 发表于 2025-2-9 13:15
为什么 为什么你不把关键代码贴上来。让大家猜游戏吗?

float ADCRead(void)
{
    u16 res;
          float vex;
    ADC_RES = 0;            
    ADC_RESL = 0;           
    ADC_CONTR &= 0xF0;      
    ADC_CONTR |= ADC_START;
    _nop_();
    _nop_();

    while (!(ADC_CONTR & ADC_FLAG));

    ADC_CONTR &= ~ADC_FLAG;         
    res = (ADC_RES << 8) | ADC_RESL;
               
    vex = (float) res * 5.0 / 4096.0;

    return vex;
}
这个是读取ADC的函数

volatile float ADCRES;
volatile u16 RAM[126];
volatile u16 POINT;
volatile u16 ADCSIGN;
volatile float MAX;
volatile float MINS;
volatile float CHUFA;

void Timer0_Isr(void) interrupt 1
{
        ADCSIGN=1;
        TF0=0;
}

void Timer0_Init(void)                //40us@35MHz
{
        AUXR |= 0x80;                       
        TMOD &= 0xF0;                       
        TL0 = 0x88;                       
        TH0 = 0xFA;                       
        TF0 = 0;                               
        TR0 = 1;                               
        ET0 = 1;                       
}

void AdcSetRate(void)                //400KSPS@35MHz
{
        ADCCFG =0xF0;                //SPEED(0) 右对齐
        ADCTIM = 0x3c;                        //CSSETUP(0), CSHOLD(1), SMPDUTY(28)
}







int main(void)
{
  u16 i;
u16 num;
  EA=1;
P_SW2 |= 0x80;
P1M0 = (P1M0 & ~0x01) | 0x30; P1M1 = (P1M1 & ~0x30) | 0x01;
P3M0 = 0x00; P3M1 = 0x00;

        LCD_Init();//LCD初始化
        LCD_Fill(0,0,LCD_W,LCD_H,WHITE);
        ADC_CONTR = 0x80; //使能ADC
        drawcoordinate_system();//绘制坐标轴
       
        CHUFA=1.5;//设置触发电压
       
Timer0_Init();//定时器初始化
AdcSetRate();//ADC设置

POINT=0;
ADCSIGN=0;
       
        while(1)
        {
               
               
        if(ADCSIGN==1){
                ADCSIGN=0;
  ADCRES=ADCRead();
  num=ADCRES/0.08;//ADC数据处理
  RAM[POINT]=num;
  POINT++;
               
        if(POINT==0)
                {
                        MAX=ADCRES;
                        MINS=ADCRES;
                }
                if(ADCRES>MAX){
                        MAX=ADCRES;               
                }
                if(ADCRES<MINS){
                        MINS=ADCRES;               
                }
       
                if(POINT==125&&MAX>=CHUFA){
                TR0=0;
                LCD_ShowString(60,0,"Max:",BLACK,WHITE,12,0);
                LCD_ShowIntNum(85,0,MAX,1,BLACK,WHITE,12);
                LCD_ShowFloatNum1(90,0,MAX,2,BLACK,WHITE,12);
                LCD_ShowString(60,12,"Min:",BLACK,WHITE,12,0);
                LCD_ShowIntNum(85,12,MINS,1,BLACK,WHITE,12);
                LCD_ShowFloatNum1(90,12,MINS,2,BLACK,WHITE,12);
       
                for(i=0;i<=123;i++){
LCD_DrawLine(i+34,99-RAM,i+35,99-RAM[i+1],BLACK);
        }
                break;
}
               

}
               
        }
        while(1);
       

}
回复 支持 反对

使用道具 举报 送花

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

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2025-2-9 13:53:42 | 显示全部楼层
高速定频采样建议使用PWM周期硬件触发ADC功能(配合DMA_ADC),不要使用定时器软件触发方式
软件处理要耗时的,高频下耗时占比较低频大,不能忽视
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-01-27 22:53:28
已绑定手机

9

主题

5

回帖

79

积分

注册会员

积分
79
发表于 2025-2-9 21:09:03 | 显示全部楼层
Debu*** 发表于 2025-2-9 13:53
高速定频采样建议使用PWM周期硬件触发ADC功能(配合DMA_ADC),不要使用定时器软件触发方式
软件处理要耗时 ...

我看老梁示波器好像用的也是定时器触发的
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:294
  • 最近打卡:2025-03-06 09:25:41

8

主题

318

回帖

1835

积分

金牌会员

积分
1835
发表于 2025-2-9 21:46:07 | 显示全部楼层
问题出在你用了浮点运算
8位机算浮点数是很很很很很很很很很很很很很很很很很慢的
把所有浮点运算改为uint试试
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-01-27 22:53:28
已绑定手机

9

主题

5

回帖

79

积分

注册会员

积分
79
发表于 2025-2-11 23:49:38 | 显示全部楼层
Lkck*** 发表于 2025-2-9 21:46
问题出在你用了浮点运算
8位机算浮点数是很很很很很很很很很很很很很很很很很慢的
把所有浮点运算改为uint ...

感谢,改成整形后确实比之前更快了定时器40us已经可以正常运行了,但是把定时器改成20us后速度又上不去了,这是我代码的计算量太大了速度已经到极限了吗?
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 13:20 , Processed in 0.361323 second(s), 112 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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