为什么我ADC的速度非常低?求教
正在做一个简单的示波器,在制作时发现不管我怎么去配置ADC的速度,ADC的速度都超不过25khz,主频调的很高都没用,就像在35MHZ主频的时候,设置ADCSPEED为3,
12位ADC频率的计算公式得到ADC速率=35M/(2*4*26)=168khz(按默认设置为26个ADC时钟)。
我的代码就是让定时器每隔一段时间就读取一次ADC然后记录到数组上画出来,
我发现定时器调到大于40us左右的时候都是正常的,
一但低于这个ADC的速度好像就上不去了这是为什么啊?
我真是想不明白
{:4_184:}
一次完整的 A/D 时间含【ADC输入通道的切换时间+采样的时间+关闭采样的时间+固定转换 - ADC/比较器,DMA支持的12位ADC,轨到轨比较器,DAC 国芯技术交流网站 - AI32位8051交流社区
神农鼎 发表于 2025-2-9 08:26
这个我试过了采样速率还是上不去 为什么 为什么你不把关键代码贴上来。让大家猜游戏吗? 1325986650 发表于 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;
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=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,BLACK);
}
break;
}
}
}
while(1);
} 高速定频采样建议使用PWM周期硬件触发ADC功能(配合DMA_ADC),不要使用定时器软件触发方式
软件处理要耗时的,高频下耗时占比较低频大,不能忽视
DebugLab 发表于 2025-2-9 13:53
高速定频采样建议使用PWM周期硬件触发ADC功能(配合DMA_ADC),不要使用定时器软件触发方式
软件处理要耗时 ...
我看老梁示波器好像用的也是定时器触发的 问题出在你用了浮点运算
8位机算浮点数是很很很很很很很很很很很很很很很很很慢的
把所有浮点运算改为uint试试 Lkck8210 发表于 2025-2-9 21:46
问题出在你用了浮点运算
8位机算浮点数是很很很很很很很很很很很很很很很很很慢的
把所有浮点运算改为uint ...
感谢,改成整形后确实比之前更快了定时器40us已经可以正常运行了,但是把定时器改成20us后速度又上不去了,这是我代码的计算量太大了速度已经到极限了吗?
页:
[1]
2