18844069725 发表于 2017-11-2 15:05:04

求助帖

各位大神,小弟现在想要用arduino uno实现以1000Hz的频率采集0-5V的电压模拟量,怎么样才能保证采样频率的精确度啊?

275891381 发表于 2017-11-3 12:00:05

本帖最后由 275891381 于 2017-11-3 12:01 编辑

定时吧,定时器中断内采集,你用MsTimer2.rar 库,翻转下io看看精度能达到多高,满足的话,就可以

弘毅 发表于 2017-11-3 12:34:37

1K的ADC很低的,uno自带的ADC足够

275891381 发表于 2017-11-3 13:30:36

//下面定时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()
{
}

18844069725 发表于 2017-11-3 14:58:12

谢谢!还有一个问题,由于serial print这个函数运行需要的时间较长,导致采集到的数据打印到串口之后会有丢失,怎么样才能把数据全部保存下来?

通幽境 发表于 2017-11-3 15:19:57

18844069725 发表于 2017-11-3 14:58
谢谢!还有一个问题,由于serial print这个函数运行需要的时间较长,导致采集到的数据打印到串口之后会有丢 ...

print后面+Serial.flush();

18844069725 发表于 2017-11-3 16:11:05

我试了以下还是没有改善啊,按照一秒1000个数来说,从串口保存下来的只有不到300个数

Stormer 发表于 2017-11-3 19:21:21

18844069725 发表于 2017-11-3 14:58
谢谢!还有一个问题,由于serial print这个函数运行需要的时间较长,导致采集到的数据打印到串口之后会有丢 ...

干嘛要从串口输出里保存? 不明白你把数据输出到串口的目的.

声明2个大数组做缓存. 达到一定长度了存到SD卡.(这个时候用另外一个数组存取采集的数据). 存完SD卡了清空这个数组. 如此交替.

最后采集完了,把SD的数据输出到串口.

antbot 发表于 2017-11-3 23:05:11

用定时器和乒乓缓存来做~也就是声明两个大数组,轮流存数,发数,串口波特率设置高一点点,115200应该可以了~

18844069725 发表于 2017-11-4 08:28:34

Stormer 发表于 2017-11-3 19:21
干嘛要从串口输出里保存? 不明白你把数据输出到串口的目的.

声明2个大数组做缓存. 达到一定长度了存 ...

谢谢!如果能给一个类似程序的链接的话就更好了,arduino新手一个,还在各种学习中
页: [1]
查看完整版本: 求助帖