adc arduino 电压基准_Arduino发展的未来在什么地方,它能否用来开发产品?以采样率的应用见国内Arduino教程...

本文探讨了Arduino的ADC采样率问题,指出国内教程过于基础,缺乏深入内容。作者通过测试发现UNO的采样频率约为9k Hz,并解释了调整分频因子对采样率的影响。作者呼吁更多高级教程的出现,以促进开源硬件行业在国内的发展。
摘要由CSDN通过智能技术生成

首先很感谢《维特智能》编辑的邀请,这两天一直在思考写点什么话题才好。说起来跟维特智能也算有点缘分吧,2017年做科创买过他们的智障小车(有个学长起的名字,说是做小车的过程会让人变智障……)。前两天刚刚做完电赛,回答了一个“为啥有好多人说Arduino是玩具?“的话题,被该专栏编辑邀请写一篇文章。

想了想,还是就该话题展开吧,看过一些知友的评论,对Arduino也有了一个更新的认识,仅以此篇抛砖引玉,希望能引起更多大佬的注意,分享自己的观点。本文,我会以Arduino采样率的一个问题来讲述我对国内Arduino教程的一些看法以及我认为存在的一些问题(仅代表个人观点)。

前两天,我遇到了一个DAC的问题,需要Arduino提供较高的采样率,关于采样速度的问题之前有看到过,可以通过分频因子来调整,但由于本人较懒,没有记下来,不过知道一点还是很好解决的,开源的好处就在这,知道有基本上就可以解决问题了。

首先我们可以用一个简单的程序测试一下Arduino的采样速度(我这里用的是UNO):

//代码采用的都是Arduino中最基本的函数,这些都不明白的建议去仔细读一下,推荐极客工坊
void setup() {
  Serial.begin(9600); //串口通信9600波特率,在Arduino IDE自带的串口调试助手上选择相同波特率
  analogReference(INTERNAL); //调用板载1.1V基准源
}


void loop() {
  int i;
  float voltage;
  int sensorValue;
  unsigned long ntime=millis(); //记录当前时间
  for (i=0;i<10000;i++)
    {
      sensorValue = analogRead(A0); //读取A0引脚数据,属于模拟读入,可以通过分频因子调整采样率
    }  
  Serial.println(millis()-ntime);
  delay(10000);
}

af260a074e20e3d79a45c7c0b2335799.png
Arduino UNO采样速度实测

由上图可以看出,运行结果大概在1120左右,平均值即1120,即采样10000次用时1.12秒,采样频率是8928.57143Hz,在9k左右。

前面我提过可以通过调整Arduino的分频因子来调整采样率,这是因为Arduino 的 ADC 是用一种逐次逼近比较的方法来进行ADC转换的。这种原理与排序算法中的某些思想类似,用外部电压与内部参考电压进行比较,根据大于或小于来判定外部指定引脚上的电压,资料说做这样一个比较大约需要10次,13个机器周期。

而比较的频率是主控频率分频给出来的,有一个分频因子,默认是128,分频因子越小,比较的速度也就越快。这个可以理解成为将最大电压范围分成多少份,这个份数就是分频因子的大小,当份数较多的时候,需要比较的也就更多,如果份数较小的时候,一次采样需要比较的次数也就少,频率也就提高了。

关于分频因子的调整可以参考下图:

2bc02e75e28ef2b1d59d700cf6a52b6c.png
Arduino ADC预分频器选择位(网图,侵删)

由上图可以看出,ADC预分频器的选择由ADPS2~ADPS0三位来确定,关于分频因子的调整可以采用如下方法:

//setP后面的数字代表将分频因子调整为多少位,在setup函数中调用相关函数即可
void setP32( ) {
  //分频因子32,频率大概为38kHz
  ADCSRA |=  (1 << ADPS2);  // 1  
  ADCSRA &=  ~(1 << ADPS1);  // 0  
  ADCSRA |=  (1 << ADPS0);  // 1  
}
  
void setP16( ) {
  //分频因子16,频率大概为76kHz
  ADCSRA |=  (1 << ADPS2);  // 1  
  ADCSRA &=  ~(1 << ADPS1);  // 0  
  ADCSRA &=  ~(1 << ADPS0);  // 0 
}
  
void setP8( ) { 
  //分频因子8,频率大概150kHz
  ADCSRA &=  ~(1 << ADPS2);  // 0  
  ADCSRA |=  (1 << ADPS1);  // 1  
  ADCSRA |=  (1 << ADPS0);  // 1  
}
  
void setP4( ) { 
  //分频因子4,频率大概为300kHz
  ADCSRA &=  ~(1 << ADPS2);  // 0  
  ADCSRA |=  (1 << ADPS1);  // 1  
  ADCSRA &=  ~(1 << ADPS0);  // 0  
}

void setP2( ) {
  //分频因子2,不建议调这么低,损失精度
  ADCSRA &=  ~(1 << ADPS2);  // 0  
  ADCSRA &=  ~(1 << ADPS1);  // 0  
  ADCSRA &=  ~(1 << ADPS0);  // 0  
}
  
void setP128( ) { 
  // 默认就是这样 
  ADCSRA |=  (1 << ADPS2);  // 1  
  ADCSRA |=  (1 << ADPS1);  // 1  
  ADCSRA |=  (1 << ADPS0);  // 1  
} 

本人较懒,频率计算没有从跟上算,关于频率的计算,请参照此贴。

好了,关于采样率的问题就说到这,通过这次跟采样率相关的项目,我感觉目前国内在Arduino方面的教程也好,示例也好,做的都太入门了、太简单了,简单到什么程度呢,刚刚看一点C语言的,甚至都不会的,照着例程自己都能做了。

拿Arduino驱动个舵机呀、步进电机呀,控制传感器采集下数据呀,做个串口通信呀,把这些东西组合一下就能做个小东西出来,教程基本还都停留在这个水平。

我不是说这些东西没用,但这些内容真的已经够多了,国内现在需要更深入的,高级一点的教程,比如上面说的采样率的问题,这些还没有或者很少(找资料的时候能够感受到网站访问的速度,基本都是国外的)。

希望通过此篇抛砖引玉,引起更多大佬的注意,发表自己的意见,带动国内Arduino,或者说整个开源硬件行业的发展。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值