Generador de pulsos WFC

Muy buenas a todos, tengo una duda... querria saber si con arduino se podría replicar el circuito generador de pulsos que se utiliza para el proceso de "voltrosis" del agua. El circuito en cuestion seria este:

Se trata de un circuito que genera pulsos con una frecuencia determinada y con un ciclo de trabajo de 50 / 50.

Me encantaria escuchar sus propuestas porque me parece un tema bastante interesante. Saludos!

Bueno, no se pero creo que a lo que te refieres es al término Voltrólisis.
Y no creo que Arduino sea capaz de tal cosa, ya que para este proceso se necesita un gran Voltaje para ionizar p.ej. el agua, y la salida máxima de cada pin es de 5V...
Lo máximo que Arduino haría es generar los pulsos según la frecuencia requerida.

Bueno es que no seria arduino el que tirara de la celula entiendes?, la señal la amplificaria luego con un Mosfet. Lo que busco solo es que arduino me cree los pulsos a distintas frecuencias y tendría que llegar asta 47khz que lei por ahi que era la que se utilizaba aunque el termino frecuencia no debe ser absoluto tampoco tiene que poder cambiarse.

Buenas he encontrado un programita bastante interesante. Este permite crear las ondas deseadas en arduino, pero le falta una cosa... se trata de crear un tiempo de reposo para la agrupacion de pulsos osea seria mas o menos esto xd:

47khz 0 47 0
------------

600 hz

ahora bien las de 47 khz tienen que tener a su vez tambien un ciclo de trabajo de 50 / 50 y eso ya viene incluido, solo faltaria darle ese otro ciclo de trabajo para asi crear el tren de ondas nose si me habre explicado bien xD

aqui dejo el codigo que encontre:

/*
  PulseGen
 
  Written by:   Dog-One
  Version:      2.0.1
  Build:        2013-07-31
 
  This Arduino application reads input over the built-in serial interface and sets
  a PWM output with variable frequency and duty cycle.
 
  Set your monitor window to send a carriage return at the end of each message.
 
  The serial interface accepts a command set as described below in the usage()
  function.
*/

#define RESOLUTION 65536    // Timer-1 is 16 bit

#define FACTORY_PIN 9
#define FACTORY_FREQ 15L
#define FACTORY_DUTY 1

char pin = FACTORY_PIN;
long freq = FACTORY_FREQ;
int duty = FACTORY_DUTY;

String blank = String("");
String inStr = blank;    // A string to hold incoming commands

// Initializes and sets timer and PWM output
void setTimer(char ppin, long microseconds, int dcycle) {
  volatile char oldSREG;                // To hold Status Register while ints disabled
  unsigned char clockSelectBits;
  long cycles;
  unsigned long dutyCycle;

  TCCR1A = 0;                           // clear control register A 
  TCCR1B = _BV(WGM13);                  // set mode 8: phase and frequency correct pwm, stop the timer

  cycles = (F_CPU / 2000000) * microseconds;                                      // the counter runs backwards after TOP,
                                                                                  // interrupt is at BOTTOM so divide microseconds by 2
  if (cycles < RESOLUTION)              clockSelectBits = _BV(CS10);              // no prescale, full xtal
  else if ((cycles >>= 3) < RESOLUTION) clockSelectBits = _BV(CS11);              // prescale by /8
  else if ((cycles >>= 3) < RESOLUTION) clockSelectBits = _BV(CS11) | _BV(CS10);  // prescale by /64
  else if ((cycles >>= 2) < RESOLUTION) clockSelectBits = _BV(CS12);              // prescale by /256
  else if ((cycles >>= 2) < RESOLUTION) clockSelectBits = _BV(CS12) | _BV(CS10);  // prescale by /1024
  else         cycles = RESOLUTION - 1, clockSelectBits = _BV(CS12) | _BV(CS10);  // request was out of bounds, set as maximum

  dutyCycle = cycles;
  dutyCycle *= dcycle;
  dutyCycle >>= 10;
  
  oldSREG = SREG;				
  cli();                                // Disable interrupts for 16 bit register access
  ICR1 = cycles;                        // ICR1 is TOP in p & f correct pwm mode
  
  TCCR1B &= ~(_BV(CS10) | _BV(CS11) | _BV(CS12));

  if (ppin == 1 || ppin == 9) {
    DDRB |= _BV(PORTB1);                // sets data direction register for pwm output pin
    TCCR1A |= _BV(COM1A1);              // activates the output pin
    OCR1A = dutyCycle;
  }
  else if (ppin == 2 || ppin == 10) {
    DDRB |= _BV(PORTB2);
    TCCR1A |= _BV(COM1B1);
    OCR1B = dutyCycle;
  }

  SREG = oldSREG;
  
  TCCR1B |= clockSelectBits;            // Make sure clock is running.
}

// Set "factory" defaults for pulse time
void factory() {
  long tmp;
  
  pin = FACTORY_PIN;
  freq = FACTORY_FREQ;
  duty = FACTORY_DUTY;

  tmp = ((long) duty * 1024L) / 100L;
  setTimer(pin, 1000000L / freq, (int) tmp);
}

// Show prompt and flush input
void prompt() {
  Serial.print("\nPulseGen 2.0> ");
  inStr = blank;
}

// Display the internals
void showSettings() {
  static char buf[80];

  Serial.println("\nPin   Frequency (Hz)   Duty Cycle (%)");
  sprintf(buf, "%2d %12ld %15d", pin, freq, duty);
  Serial.println(buf);

  prompt();
}

// Show help menu
void usage() {
  Serial.println("\n\nCommand Set:\n");
  
  Serial.println("  D<value>  Duty Cycle (%)");
  Serial.println("  F<value>  Frequency {Hz)");
  
  Serial.println("  R         Reset");
  Serial.println("  X         Show Settings");
  Serial.println("  H or ?    This message");
}

// Process a byte of command input when it shows up
void serialEvent() {
  static unsigned int op = 0;
  static int inData = 0;
  long tmp;

  // get the new byte:
  inData = Serial.read();
  Serial.write(inData);

  // On a carriage return we want to process the full message
  // otherwise we just keep scanning/buffering.
  if (inData != 13) {    // Carriage return
    inStr += String(char(inData));
    return;
  }

  // No command given
  if (inStr.length() == 0) {
    prompt();
    return;
  }

  inStr.toUpperCase();

  op = inStr.charAt(0);
  switch (op) {
  case 72:    // H
  case 63:    // ?
    usage();
    prompt();
    return;
  case 88:    // X
    showSettings();
    return;
  case 82:    // R
    factory();
    showSettings();
    return;
  case 68:    // D
    // Duty cycle value given to function call is between 0 to 1023 (0 to 100%)
    tmp = inStr.substring(1).toInt();
    if (tmp > 100)    duty = 100;     // Can't go higher than 100%
    else if (tmp < 0) duty = 0;       // or below zero
    else duty = tmp;
    tmp = ((long) duty * 1024L) / 100L;
    setTimer(pin, 1000000L / freq, (int) tmp);
    showSettings();
    return;
  case 70:    // F
    // Frequency value given to function call is a microsecond period
    tmp = inStr.substring(1).toInt();
    if (tmp < 1L)     duty = 0;      // Don't set frequency to zero, just stop timer
    else freq = tmp;
    tmp = ((long) duty * 1024L) / 100L;
    setTimer(pin, 1000000L / freq, (int) tmp);
    showSettings();
    return;
  default:
    Serial.println("   Bad Command (" + inStr + ").  Type ? for help");
    prompt();
    return;
  }
}

// Initialize application
void setup() {
  long tmp;
  
  Serial.begin(9600);

  pinMode(13, OUTPUT);

  tmp = ((long) FACTORY_DUTY * 1024L) / 100L;
  setTimer(FACTORY_PIN, 1000000L / FACTORY_FREQ, (int) tmp);

  prompt();
}

// Main code loop
// Nothing really to do, so just blink the onboard LED
void loop() {
  static unsigned long previousMillis = 0L;
  static int state = LOW;
  unsigned long currentMillis = millis();
 
  if (currentMillis - previousMillis > 500) {
    previousMillis = currentMillis;  
    if (state == LOW)
      state = HIGH;
    else
      state = LOW;

    digitalWrite(13, state);
  }
}

Aver si alguien puede ayudarme porque no entiendo demasiado de programación tampoco -.-''

Saludos a todos!