2016-08-24 6 views
0

Я дам вам небольшое введение:Arduino pulse train

Я работаю над водяным топливным элементом Стэнли Мейера. Для тех, кто не знает водяной топливный элемент, вы можете увидеть его here.

Для водяного топливного элемента необходимо построить схему. Здесь the diagram:

Water Fuel Circuit

Сейчас я работаю над генератором импульсов (переменной) и импульсным затвором (переменной), чтобы генерировать эту форму волны.

Pulse train

Итак, я хочу сделать это с помощью Arduino таймеров. Я уже может генерировать «высокочастотный» импульсный генератор (1 кГц - 10 кГц, в зависимости от задания масштабирования в регистре TCCR2B) ШИМ на выводе 3 с этим кодом:

pinMode(3, OUTPUT); 
pinMode(11, OUTPUT); 
TCCR2A = _BV(COM2A0) | _BV(COM2B1) | _BV(WGM21) | _BV(WGM20); 
TCCR2B = _BV(WGM22) | _BV(CS21) | _BV(CS20); 
OCR2A = 180; 
OCR2B = 50; 

можно изменить частоту и пульс с :

sensorValue = analogRead(analogInPin); 
sensorValue2 = analogRead(analogInPin2); 

// Map it to the range of the analog out: 
outputValue = map(sensorValue, 0, 1023, 30, 220); 
outputValue2 = map(sensorValue2, 0, 1023, 10, 90); 
OCR2A = outputValue; 

Это прекрасно работает.

Теперь я хочу модулировать этот импульс с помощью другой последовательности импульсов с «низкой частотой» (приблизительно от 20 Гц до 100 Гц), чтобы действовать как импульсный вентиль. Я думал использовать таймер 0 для подсчета и выключения сигнала, когда он подсчитывает некоторое значение и активировать при поступлении в том же значении снова, как этот

TCCR0A = _BV(COM0A0) | _BV(COM0B0) | _BV(WGM01); 
TCCR0B = _BV(CS02); 
OCR0A = 90; 
OCR0B = OCR0A * 0.8; 

И сравните со счетчиком

if (TCNT0 <= OCR0A) 
    TCCR2A ^= (1 << COM2A0); 

Но Это не очень хорошо работает. Есть идеи для этого?

ответ

0

В эти дни я попытался создать генератор волн, как тот, который приходит в ваш вопрос. Я не могу устранить дрожание или несоответствие, которое появляется, но я могу создать такую ​​волну. Попробуйте этот пример и внесите изменения:

#include <TimerOne.h> 

const byte CLOCKOUT = 11; 
volatile byte counter=0; 

void setup() { 
    Timer1.initialize(15); // Every 15 microseconds change the state 
          // of the pin in the wave function giving 
          // a period of 30 microseconds 
    Timer1.attachInterrupt(Onda); 
    pinMode(CLOCKOUT, OUTPUT); 
    digitalWrite(CLOCKOUT, HIGH); 
} 

void loop() { 
    if (counter>=29) {   // With 29 changes I achieve the amount of pulses I need. 
     Timer1.stop();   // Here I create the dead time, which must be in HIGH. 
     PORTB = B00001000; 
     counter = 0; 
     delayMicroseconds(50); 
     Timer1.resume(); 
    } 
} 

void Onda(){ 
    PORTB ^= B00001000; // Change pin status 
    counter += 1; 
}