arduino nano 33 lot 的ADC读取耗时过长的解决问题

ADC的采样频率和三个因素有关:

  1. 单片机ADC的转换性能
  2. ADC的时钟频率
  3. 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。

如果想要更快的采样速度,可以继续将分频改小,但是满足项目需求就好,过高的时钟频率,可能会影响采集精度。

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值