我会给你一点介绍:
我正在研究Stanley Meyer的水燃料电池。对于那些不了解水燃料电池的人,你可以看到它here。
对于水燃料电池,人们必须建立一个电路。这是the diagram:
目前我正在研究脉冲发生器(变量)和脉冲门(变量)以生成此波形。
所以,我想用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);
但它效果不佳。有什么想法?
答案 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;
}