Arduino脉冲列车

时间:2016-08-24 18:12:30

标签: arduino pwm

我会给你一点介绍:

我正在研究Stanley Meyer的水燃料电池。对于那些不了解水燃料电池的人,你可以看到它here

对于水燃料电池,人们必须建立一个电路。这是the diagram

Water Fuel Circuit

目前我正在研究脉冲发生器(变量)和脉冲门(变量)以生成此波形。

Pulse train

所以,我想用Arduino计时器做这件事。我已经可以产生一个高频率的频率"脉冲发生器(1 kHz - 10 kHz,取决于TCCR2B寄存器的预分频)引脚3的PWM,代码如下:

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 Hz至100 Hz)充当脉冲门。我想用Timer 0来计算和关闭信号,当它计算某个值时激活,当再次达到相同的值时激活,就像这样

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

与计数器进行比较

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

但它效果不佳。有什么想法?

1 个答案:

答案 0 :(得分: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;
}