Tabla de contenido:

Arduino Sinewave para inversores: 4 pasos
Arduino Sinewave para inversores: 4 pasos

Video: Arduino Sinewave para inversores: 4 pasos

Video: Arduino Sinewave para inversores: 4 pasos
Video: Pr#72 - Inversor DC-AC sinusoidal con SPWM 2024, Noviembre
Anonim
Arduino Sinewave para inversores
Arduino Sinewave para inversores

En este proyecto, he generado una señal SPWM (pulso de onda sinusoidal modulada en ancho) a partir de dos salidas digitales arduino pwm.

Porque para hacer un programa de este tipo, tengo que hablar sobre muchas otras funciones y propiedades del arduino, el proyecto completo, incluidas las imágenes de osciloscopio y para diferentes frecuencias, visite mi sitio web:

eprojectszone

Paso 1: Generación de la señal Pwm para 50Hz

Para generar una señal de 50Hz a mayor frecuencia es necesario realizar algunos cálculos. Las frecuencias de arduino pueden ser de 8 MHz, pero queremos una señal con ciclo de trabajo variable.

Para comprender los tipos de ciclos de trabajo variables de arduino, puede leer estas 3 partes de la misma publicación 1, 2 y 3.

Supongamos que nuestra frecuencia es de 50 Hz, lo que significa que el período de tiempo es de 20 ms. Entonces 10ms es un período de medio ciclo. En esos 10ms necesitamos tener muchos pulsos con diferentes ciclos de trabajo comenzando con ciclos de trabajo pequeños, en el medio de la señal tenemos ciclos de trabajo máximos y terminamos también con ciclos de trabajo pequeños. Para generar una onda sinusoidal usaremos dos pines uno para semiciclo positivo y uno para semiciclo negativo. En nuestra publicación para esto usamos los pines 5 y 6 que significan Timer 0.

Para una señal suave, elegimos la fase correcta pwm a una frecuencia de 31372 Hz, ver publicación anterior. Uno de los mayores problemas es cómo calculamos el ciclo de trabajo necesario para cada pulso. Entonces, debido a que nuestra frecuencia es f = 31372Hz, el período para cada pulso es T = 1/31372 = 31.8 us, por lo que el número de pulsos para un medio ciclo es N = 10ms / 31.8us = 314 pulsos. Ahora, para calcular el ciclo de trabajo para cada pulso, tenemos y = sinx, pero en esta ecuación necesitamos grados, por lo que el medio ciclo tiene 180 grados para 314 pulsos. Para cada pulso tenemos 180/314 = 0.57deg / pulso. Eso significa que por cada pulso avanzamos con 0,57 grados.

y es el ciclo de trabajo yx el valor de la posición en la mitad del ciclo de trabajo. al principio x es 0, después de que x = 0.57, x = 1.14 y así sucesivamente hasta que x = 180.

si calculamos todos los 314 valores obtenemos una matriz de 314 elementos (escriba "int" para que arduino lo calcule más fácilmente).

Tal matriz es:

int sinPWM = {1, 2, 5, 7, 10, 12, 15, 17, 19, 22, 24, 27, 30, 32, 34, 37, 39, 42, 44, 47, 49, 52, 54, 57, 59, 61, 64, 66, 69, 71, 73, 76, 78, 80, 83, 85, 88, 90, 92, 94, 97, 99, 101, 103, 106, 108, 110, 113, 115, 117, 119, 121, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 169, 171, 173, 175, 177, 178, 180, 182, 184, 185, 187, 188, 190, 192, 193, 195, 196, 198, 199, 201, 202, 204, 205, 207, 208, 209, 211, 212, 213, 215, 216, 217, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 237, 238, 239, 240, 240, 241, 242, 242, 243, 243, 244, 244, 245, 245, 246, 246, 247, 247, 247, 248, 248, 248, 248, 249, 249, 249, 249, 249, 250, 250, 250, 250, 249, 249, 249, 249, 249, 248, 248, 248, 248, 247, 247, 247, 246, 246, 245, 245, 244, 244, 243, 243, 242, 242, 241, 240, 240, 239, 238, 237, 237, 236, 235, 234, 233, 232, 231, 230, 229, 228, 227, 226, 225, 224, 223, 222, 221, 220, 219, 217, 21 6, 215, 213, 212, 211, 209, 208, 207, 205, 204, 202, 201, 199, 198, 196, 195, 193, 192, 190, 188, 187, 185, 184, 182, 180, 178, 177, 175, 173, 171, 169, 168, 166, 164, 162, 160, 158, 156, 154, 152, 150, 148, 146, 144, 142, 140, 138, 136, 134, 132, 130, 128, 126, 124, 121, 119, 117, 115, 113, 110, 108, 106, 103, 101, 99, 97, 94, 92, 90, 88, 85, 83, 80, 78, 76, 73, 71, 69, 66, 64, 61, 59, 57, 54, 52, 49, 47, 44, 42, 39, 37, 34, 32, 30, 27, 24, 22, 19, 17, 15, 12, 10, 7, 5, 2, 1};

Puede ver que, como una onda sinusoidal, el ciclo de trabajo es más bajo en el primer y último elemento y más alto en el medio.

Paso 2: Programa Arduino para ciclo de trabajo variable

Programa Arduino para ciclo de trabajo variable
Programa Arduino para ciclo de trabajo variable

En la imagen de arriba tenemos señales de ciclos de trabajo variables con valores de la matriz.

Pero, ¿cómo hacer tal señal?

la parte del programa a continuación utiliza interrupciones para cambiar los valores de los ciclos de trabajo

sei (); // habilitar interrupciones

}

ISR (TIMER1_COMPA_vect) {// interrumpe cuando el temporizador 1 coincide con el valor OCR1A

if (i> 313 && OK == 0) {// valor final del vector para el pin 6

i = 0; // ir al primer valor del vector (matriz)

OK = 1; // habilita el pin 5

}

x = sinPWM ; // x toma el valor del vector correspondiente a la posición i (i es cero indexado) -valor del ciclo de trabajo

i = i + 1; // ir a la siguiente posición

}

Paso 3: Alternando en los pines Arduino de 50Hz

Alternando en pines Arduino de 50Hz
Alternando en pines Arduino de 50Hz

Debido a que cada pin genera solo la mitad del ciclo de trabajo para hacer una onda sinusoidal completa, usamos dos pines que se alternan uno tras otro después de 10msegundos exactos (para 50Hz). Este cambio de pines se realiza al final de la matriz; después de que digamos que el pin 5 haya generado 314 pulsos, este pin se apaga y habilita el pin 6, lo que hace lo mismo pero para el ciclo de trabajo negativo.

Debido a que arduino puede generar solo señales positivas, el ciclo de trabajo negativo se realiza en el puente h; puede leer aquí al respecto

El programa para cambiar pines:

sei (); // habilitar interrupciones

}

ISR (TIMER1_COMPA_vect) {// interrumpe cuando el temporizador 1 coincide con el valor OCR1A

if (i> 313 && OK == 0) {// valor final del vector para el pin 6

i = 0; // ir al primer valor del vector

OK = 1; // habilita el pin 5

}

if (i> 313 && OK == 1) {// valor final del vector para el pin 5

i = 0; // ir al primer valor del vector

OK = 0; // habilita el pin 6

}

x = sinPWM ; // x toma el valor del vector correspondiente a la posición i (i es cero indexado)

i = i + 1; // ir a la siguiente posición

si (OK == 0) {

OCR0B = 0; // hacer pin 5 0

OCR0A = x; // habilita el pin 6 al ciclo de trabajo correspondiente

si (OK == 1) {

OCR0A = 0; // hacer pin 6 0

OCR0B = x; // habilita el pin 5 al ciclo de trabajo correspondiente

}

}

Paso 4: conducción de un puente H y filtrado de la señal Pwm

Las señales que se obtienen de arduino son la parte de control para aplicaciones inverter porque ambas son positivas. Para hacer una onda sinusoidal completa y un inversor práctico tenemos que usar un puente hy para limpiar la pwm un filtro de paso bajo.

El puente H se presenta aquí.

El filtro de paso bajo probado con pequeños motores de CA, aquí.

Recomendado: