2016-12-21 96 views
0

這是我第一次使用Arduino UNO的實際項目,事實是我沒有碰到任何簡單的東西:(我需要將我的Arduino轉換爲14位編碼器驅動程序,爲此我需要生成一個14脈衝列車到一個大於30KHz的固定頻率,並在每個列車之間建立一個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

僅供參考,你可以試着問過在[arduino.se。 –

回答

0

我發現了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