2016-12-21 37 views
0

これはArduino UNOの私の最初の実用的なプロジェクトであり、真実は何も簡単に触れていないことです。(私は14ビットの列車を生成するために私のArduinoを14ビットのエンコーダドライバに変換する必要があります30キロヘルツ以上の固定周波数に、各列車間に50マイクロ秒のデッドタイムを設定するか、またはそれ以上の時間に設定する。 私が気づいたすべての変種において、私は迷惑なジッタまたは位相シフトでオシロスコープを遭遇した。できるだけきれいにする必要があります波、 これが私の最初の粗変だった:。Arduino UNOのパルス列のジッタを除去するには?

void setup() { 
    pinMode(11, OUTPUT); 
} 

void loop() { 
    for (int i=0; i<15; i++){ 
     digitalWrite(11, HIGH); 
     delayMicroseconds(12); 
     digitalWrite(11, LOW); 
     delayMicroseconds(12); 
    } 
delayMicroseconds(50); 
} 

は、その後、私は波を作るためにタイマーを使用してそれを解決しようとした、とする製品をオフセット時間があるように思われますストップとサマデッドタイムを補うためにタイマをリズします。私は私がダウンロードTimerOneライブラリを使用します。https://github.com/PaulStoffregen/TimerOne

#include <TimerOne.h> 
const byte CLOCKOUT = 11; 
volatile long counter=0; 

void setup() { 
    Timer1.initialize(15);   //Cada 15 microsegundos cambio el estado del pin en la funcion onda dando un periodo 
    Timer1.attachInterrupt(Onda); //de 30 microsegundos 
    pinMode (CLOCKOUT, OUTPUT); 
    digitalWrite(CLOCKOUT,HIGH); 
} 

void loop() { 
    if (counter>=29){    //con 29 cambios logro los pulsos que necesito 
     Timer1.stop();    //Aqui creo el tiempo muerto, el cual esta debe estar en HIGH 
     digitalWrite(CLOCKOUT,HIGH); 
     counter=0; 
     delayMicroseconds(50); 
     Timer1.resume(); 
    } 
} 

void Onda(){ 
    digitalWrite(CLOCKOUT, digitalRead(CLOCKOUT)^1); //Cambio el estado del pin 
    counter+=1; 
} 
+0

をタイマ2を使用して、より良い解決策を見つけ、あなたは[arduino.se]でオーバー尋ねてみてください。 –

答えて

0

私はFYI CTCモードで

#include <avr/io.h> 
#include <avr/interrupt.h> 

volatile byte counter=0; 

void setup() { 
    pinMode(11, OUTPUT); 
    Serial.begin(57600); 
    digitalWrite(11,HIGH); 

    noInterrupts(); 


    TCCR2A = 0; 
    TCCR2B = 0; 
    TCNT2 = 0; 

    TCCR2A = _BV(COM2A0) | _BV(COM2B1) | _BV(WGM20); 
    TCCR2B = _BV(WGM22) | _BV(CS22); 
    OCR2A = 4; 
    TIMSK2 |= (1 << OCIE2A); 

    interrupts(); // enable all interrupts 

     } 
    ISR (TIMER2_COMPA_vect){ 
      counter+=1; 
      if (counter==31){ 
      //PORTB = B00001000; 
      OCR2A = 110; 
       } 
      else{ 
      if (counter>31){ 
       OCR2A = 6; 
       counter=0; 
       } 
      } 

      } 

     void loop() { 
     Serial.print(counter); 


     } 
+0

"より良い" – Piglet

関連する問題