Problem Frequenzgenerator 1-300Hz mit definierter Einschaltzeit

Hallo Leute,

Mein Problem ist ich will einen Frequenzgenerator bauen mit einem Frequenzspecktrum von 1-300Hz die Einschaltzeit jeden Implulses soll aber nur 1ms bzw besser 1,2ms betragen. Hat jemand Idenen??

wie sieht dein Sketch aus?

Benutze einen Timer und setze das Ein-/Ausschalten in die dazugehörige ISR - hier musst Du irgendwie zählen, um zu definieren ob Du nun ein, ausschalten oder aber nichts ändern möchtest. Im Datenblatt zum Controller musst Du das passende Prescaler setting raussuchen. Die minimale Sampling-Rate ist dann die Zeitdifferenz zwischen Impuls an bis Impuls aus. Je nach Anforderung an das Ausgangssignal, benötigst du einen DAC (manuell nachbauen oder aber bspw. der Arduino Due hat bereits welche integriert).

Ggf. mag das mit Arduino-Abstraktionen einfacher funktionieren - für 300Hz werden diese vermutlich schnell genug sein.

Die schlechteste Lösung wird sein das ganze schlichtweg per Loop-Delays zu lösen; Das ist ggf. ungenauer und der Controller macht dann halt auch nichts anderes. Konfigurierbar ist das dann wohl nur durch Umprogrammierung oder über Auslesen von Hardware-Schaltern zur Boot-Zeit.

Ich hab sowas in der Art mal hier gemacht; Vielleicht hilft das schonmal weiter.

Vielen dank das werde ich versuchen. Mein sketch ich hatte schon verschiedene Lösungsansätze bzw sketches mit dalay, tone oder PMW aber nie das gewünschte Ergebnis erziehlt

Hallo,

da ich mich auch gerade mit Timern beschäftige, habe ich daraus mal was vorbereitet für Dich. Um das zu verstehen mußte dich doch dennoch mit Timern beschäftigen. Bleibt nicht aus.

Beim gewählten Prescaler 8 haste mit den gewählten Werten für das Compare Match Register ca. 1,1ms High Pegel. Die Zeit für den Low Pegel stellste mit dem anderen Wert in der ISR ein. Wenn es auf einen sauberen Start nach µC Reset ankommt, dann mußte immer den OCR1A Wert im Timer 1 Setup anpassen. Immer abzüglich 1 von der gewünschten Dauer. Ansonsten auskommentieren.

*
 Doc_Arduino - german Arduino Forum
 IDE 1.6.5
 Arduino Mega 2560
 taktet an Pin 11  
*/

#define OC1A_Pin 11    // am UNO-R3 ist das Pin 9

void setup() {
  pinMode(OC1A_Pin, OUTPUT);    // hart kodierter Pin OC1A
  digitalWrite(OC1A_Pin, LOW);   
  set_Timer1();
}

  
void loop() {         
  
}   // Ende loop()


// ****** Funktionen ******* //

ISR(TIMER1_COMPA_vect) {  // Timer 1.A Interrupt, Pin 11
  static byte state = 1;
  
  if (state == LOW)  {
    state = HIGH;
    OCR1A += 4000;        // Zeit für Low Pegel, ca. 2ms
  }
  else  {
    state = LOW;
    OCR1A += 2200;         // Zeit für High Pegel, ca. 1,1ms
  }  
}


void set_Timer1()       // Normal Mode, kein CTC
{   
  cli();  //stop interrupts

  // set Timer-1 Register
  TCCR1A = 0;      // Reset TCCR1A Register 
  TCCR1B = 0;      // Reset TCCR1B Register
  TIMSK1 = 0;      // Reset TIMSK1 Register (disable Timer Compare Interrupts)
  TCNT1  = 0;      // initialize counter value to 0
  
  TCCR1A  |= (1 << COM1A0);  // set Toggle OCnA Pin on compare match
    
  OCR1A =  3999;    // für sauberen Start, Compare Match Register A (Low Pegel Wert - 1)
      
  TCCR1B |= (1 << CS11);    // set Prescaler 8
  TIMSK1 |= (1 << OCIE1A);  // enable Timer Compare Interrupt  A
    
  sei();   //allow interrupts
  
}  // end Funktion