Вы находитесь на странице: 1из 5

Generar onda aproximadamente Senoidal con Arduino

En el trabajo 108 habíamos hecho un generador de onda senoidal con un PIC. Aquí lo
repetimos con un Arduino UNO.
En este trabajo se genera una onda fija, de 50 KHz. Se varía la frecuencia con el valor de
delay. Si el retardo es cero, la frecuencia es de 250 KHz.
La generación se basa en el principio mostrado en la imagen siguiente, que fue tomado de
una página de Internet, no así todo el desarrollo, que es propio.

Son 4 resistencias en paralelo, que forman un divisor de tensión, con la quinta, de 1K.
Esta disposición permite 16 combinaciones de valores 1 o 0 de las salidas del PIC.

Cada una de esas combinaciones da un valor de tensión que se usa para general una onda
parecida a una onda senoidal.

1
Esta es la onda generada:

Se ven los escalones producidos.


En los máximos y mínimos se repiten varias veces los valores para poder producir el
achatamiento.
En la salida se pone un condensador a tierra para que suavice la curva.

Esta es la curva generada y suavizada por el condensador a tierra.


Como pueden apreciar, toda la curva está por arriba del cero, porque el PIC solo genera
tensiones positivas.
Para corregir esto, alimentamos la salida con una tensión negativa, que la lleva a una onda
con parte positiva y parte negativa. El trimmer permite ajustarlo, como se ve en la imagen
siguiente, obtenida variándolo.

La de la izquierda es la onda simétrica.


2
Esquema

Firmware
No se debe armar con ciclo for porque se introducen retardos que modifican la curva.
// R 9.4K al 4
// R 4.7K al 5
// R 2.2K al 6
// R 1 k al 7
// Tierra a Gnd

int T = 600; // Valor del delay para ajustar la frecuencia a 50 Hz aprox.

void setup()
{
// 76543210
DDRD = DDRD | B11110000; // Setea el puerto completo con uso del Serial 1 = OUTPUT / 0
= INPUT
}

void loop()
{
PORTD= 128; // 9
delayMicroseconds(T);
PORTD= 144; // 10
delayMicroseconds(T);
PORTD= 160; // 11
delayMicroseconds(T);
PORTD= 176; // 12
delayMicroseconds(T);
PORTD= 192; // 13
3
delayMicroseconds(T);
PORTD= 208; // 14
delayMicroseconds(T);
PORTD= 224; // 15
delayMicroseconds(T);
PORTD= 240; // 16
delayMicroseconds(T);
PORTD= 224; // 15
delayMicroseconds(T);
PORTD= 208; // 14
delayMicroseconds(T);
PORTD= 192; // 13
delayMicroseconds(T);
PORTD= 176; // 12
delayMicroseconds(T);
PORTD= 160; // 11
delayMicroseconds(T);
PORTD= 144; // 10
delayMicroseconds(T);
PORTD= 128; // 9
delayMicroseconds(T);
PORTD= 112; // 8
delayMicroseconds(T);
PORTD= 96; // 7
delayMicroseconds(T);
PORTD= 80; // 6
delayMicroseconds(T);
PORTD= 64; // 5
delayMicroseconds(T);
PORTD= 42; // 4
delayMicroseconds(T);
PORTD= 32; // 3
delayMicroseconds(T);
PORTD= 16; // 2
delayMicroseconds(T);
PORTD= 0; // 1
delayMicroseconds(T);
PORTD= 16; // 2

4
delayMicroseconds(T);
PORTD= 32; // 3
delayMicroseconds(T);
PORTD= 42; // 4
delayMicroseconds(T);
PORTD= 64; // 5
delayMicroseconds(T);
PORTD= 80; // 6
delayMicroseconds(T);
PORTD= 96; // 7
delayMicroseconds(T);
PORTD= 112; // 8
delayMicroseconds(T);

} // FIN del void loop()

Вам также может понравиться