ADC的采样频率和三个因素有关:
- 单片机ADC的转换性能
- ADC的时钟频率
- ADC的采样算法
如果想提高ADC的采样频率,最简单的方法就是提高ADC的时钟频率。
在STM32中ADC是直接外挂在系统时钟上,采样频率很高。
arduino会在ADC初始化函数里对系统时钟分频为ADC提供时钟。
下面这个链接提供了为UNO提高采样频率的方法。
arduino——提升ADC采样速度
但是在Nano 33 lot 中不存在ADCSRA寄存器。也无法使用上述链接提供的方法。但是在wiring.c中发现了init()函数。其中对ADC时钟进行了配置。
ADC->CTRLB.reg = ADC_CTRLB_PRESCALER_DIV512 | // Divide Clock by 512.
ADC_CTRLB_RESSEL_10BIT; // 10 bits resolution as default
可知默认配置中ADC的时钟是对系统时钟的512分频,这样ADC的时钟就太慢了。
笔者提供如下的ADC采样速度的测试代码。
#define _SAMPLE_COUNT 1000
void setup() {
Serial.begin(115200);
}
void loop()
{
float t0, t;
t0 = micros() ;
for( int i =0; i <_SAMPLE_COUNT; i++)
{
analogRead (A3);
}
t = micros() - t0;
Serial.print("Time per sample: ");
Serial.print((float)t/_SAMPLE_COUNT);
Serial.println(" uS");
Serial.print("Frequency: ");
Serial.print((float)_SAMPLE_COUNT*1000000/t);
Serial.print(" HZ");
Serial.println();
delay( 2000 );
}
测试结果如下
此时ADC采样频率才1200HZ,采集一次833us,接近一毫秒。在高频次采样过程中耗时这么长是不可以接收的。于是我们对代码进行修改。
在setup()中添加代码,对时钟进行64分频
ADC->CTRLB.reg = ADC_CTRLB_PRESCALER_DIV64 | // Divide Clock by 64.
ADC_CTRLB_RESSEL_10BIT; // 10 bits resolution as default
实验结果如下,采样速度变成原来了8倍,采样频率变成8981HZ,采集一次111us。
如果想要更快的采样速度,可以继续将分频改小,但是满足项目需求就好,过高的时钟频率,可能会影响采集精度。