“读取模拟电压”采样率



我想确保我的代码看起来像工作,因为明天我没有很多时间使用信号发生器,我想知道如何设置采样率。

我想用Arduino MEGA 2560用6kHz的采样器采样2kHz信号。它,不一定是实时的,所以我想填充一个缓冲区,然后通过串行连接发送那些。谁能说这段代码肯定不能用于这个?我如何将采样设置为6kHz?

void setup() {
Serial.begin(9600);
}
void loop() {
for(int x = 0; x < 1000; x++){
  // read the input on analog pin 0:
  int sensorValue[x] = analogRead(A0);
 } 
for( x = 0; x < 1000; x++){
  // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
  float voltage[x] = sensorValue[x] * (5.0 / 1023.0);
  // print out the value you read:
  Serial.println(voltage[x]);
}
}

谢谢。

嗯,正如我在另一个线程中提到的,您可以使用ADC的自动触发模式(用于基于UNOATMega328p的Arduinos):

void setup() {
    Serial.begin(256000);
    // ADC setup is done by arduino framework, but it's possible to change it slightly (for ATMega328) :
    ADCSRB  = _BV(ADTS2) | _BV(ADTS1) | _BV(ADTS0); // ADTS2..0 = 111, Timer 1 input capture event trigger source
    ADCSRA |= _BV(ADATE); // enable auto trigger mode    
    ADCSRA |= _BV(ADIF); // reset conversion end flag (= interrupt flag)
    // timer 1 setting:
    TCCR1A = 0; // clear all
    ICR1   = F_CPU/6000U; // 1 should be substracted here but result is about 2665.7 and it will be truncated to 2665 
    TCCR1B = _BV(WGM12) | _BV(WGM13) | _BV(CS10); // CTC mode with ICR1 as TOP value, enabled with no prescaling
    TIMSK1 = _BV(ICF1); // not working without this... Flag must be cleaned up after the trigger ADC, otherwise it's stucked
    analogRead(A0); // dummy read to set correct channel and to start auto trigger mode
    pinMode(13, OUTPUT);
}
void loop() {
    if (ADCSRA & _BV(ADIF)) {
        ADCSRA |= _BV(ADIF); // reset flag by writing logic 1
        Serial.println(ADC);
    }
}
ISR(TIMER1_CAPT_vect) { // to clear flag
  PINB = _BV(PB5); // and toggle d13 so frequency can be measured (it'd be half of real rate)
  // it might be enabled on PWM pin too by setting force output compare and some compare register to half of value ICR1
}

这个草图使用波特率250000,但它仍然太慢。空格字符可以用作分隔符,这将节省一个字符(因为新行通常是两个字符:rn)。一个值可以是1到4个字符,对于以下值:

  • 0-9 - 3B你需要的波特率3*10*6000 = 180000
  • 10-99 - 4B,你需要240000波特率
  • 在其他情况下,你太慢了。

所以唯一的方法是将这些整数发送为二进制并且不带分隔符,这样会更好。b/per值的最小波特率约为120000波特/秒。

相关内容

  • 没有找到相关文章

最新更新