求助帖
各位大神,小弟现在想要用arduino uno实现以1000Hz的频率采集0-5V的电压模拟量,怎么样才能保证采样频率的精确度啊?本帖最后由 275891381 于 2017-11-3 12:01 编辑
定时吧,定时器中断内采集,你用MsTimer2.rar 库,翻转下io看看精度能达到多高,满足的话,就可以 1K的ADC很低的,uno自带的ADC足够 //下面定时1ms。晶振可能不准,实际定时是1.010ms
#include <avr/io.h>
#include <avr/interrupt.h>
#define LEDPIN 13
u8 flag=0;
void setup()
{
pinMode(LEDPIN, OUTPUT);
cli();
TCCR1A=0;
TCCR1B=(1<<CS20);//寄存器B是配置定时功能的,现在配置的是不分频
TCNT1=49535; //计数器初值
//不分频16m,1s计数16000000次 1ms计数16000次TCNT1= 0XFFFF -16000= 49535
TIMSK1=(1<<TOIE1); //溢出中断使能
sei(); //开全局中断
}
ISR(TIMER1_OVF_vect)
{
TCNT1=49535;
flag=!flag;
digitalWrite(LEDPIN,flag);
}
void loop()
{
} 谢谢!还有一个问题,由于serial print这个函数运行需要的时间较长,导致采集到的数据打印到串口之后会有丢失,怎么样才能把数据全部保存下来? 18844069725 发表于 2017-11-3 14:58
谢谢!还有一个问题,由于serial print这个函数运行需要的时间较长,导致采集到的数据打印到串口之后会有丢 ...
print后面+Serial.flush(); 我试了以下还是没有改善啊,按照一秒1000个数来说,从串口保存下来的只有不到300个数 18844069725 发表于 2017-11-3 14:58
谢谢!还有一个问题,由于serial print这个函数运行需要的时间较长,导致采集到的数据打印到串口之后会有丢 ...
干嘛要从串口输出里保存? 不明白你把数据输出到串口的目的.
声明2个大数组做缓存. 达到一定长度了存到SD卡.(这个时候用另外一个数组存取采集的数据). 存完SD卡了清空这个数组. 如此交替.
最后采集完了,把SD的数据输出到串口. 用定时器和乒乓缓存来做~也就是声明两个大数组,轮流存数,发数,串口波特率设置高一点点,115200应该可以了~ Stormer 发表于 2017-11-3 19:21
干嘛要从串口输出里保存? 不明白你把数据输出到串口的目的.
声明2个大数组做缓存. 达到一定长度了存 ...
谢谢!如果能给一个类似程序的链接的话就更好了,arduino新手一个,还在各种学习中
页:
[1]