Índice:

Arduino Sinewave para inversores: 4 etapas
Arduino Sinewave para inversores: 4 etapas

Vídeo: Arduino Sinewave para inversores: 4 etapas

Vídeo: Arduino Sinewave para inversores: 4 etapas
Vídeo: Pr#72 - Inversor DC-AC sinusoidal con SPWM 2024, Novembro
Anonim
Arduino Sinewave para Inversores
Arduino Sinewave para Inversores

Neste projeto, gerei um sinal SPWM (modulação ampla de pulso de onda senoidal) a partir de duas saídas digitais arduino pwm.

Porque para fazer tal programa eu tenho que falar sobre muitas outras funções e propriedades do arduino, o projeto completo incluindo imagens de osciloscópios e para diferentes frequências, por favor visite meu website:

eprojectszone

Etapa 1: Gerando o sinal Pwm para 50 Hz

Para gerar um sinal de 50 Hz em frequência mais alta é necessário fazer alguns cálculos. As frequências do Arduino podem ser de 8 MHz, mas queremos um sinal com ciclo de trabalho variável.

Para entender os tipos de ciclos de trabalho variáveis do Arduino, você pode ler estas 3 partes do mesmo post 1, 2 e 3.

Vamos supor que nossa frequência seja 50 Hz, o que significa que o período de tempo é de 20 ms. Portanto, 10 ms é o período de meio ciclo. Nesses 10ms, precisamos ter muitos pulsos com diferentes ciclos de trabalho começando com pequenos ciclos de trabalho, no meio do sinal temos ciclos de trabalho máximos e finalizando também com pequenos ciclos de trabalho. Para gerar uma onda senoidal usaremos dois pinos um para meio ciclo positivo e um para meio ciclo negativo. Em nossa postagem para isso, usamos os pinos 5 e 6 que significa Timer 0.

Para um sinal suave, escolhemos pwm com correção de fase em uma frequência de 31372 Hz - consulte o post anterior. Um dos maiores problemas é como calculamos o ciclo de trabalho necessário para cada pulso. Então, como nossa frequência é f = 31372Hz, o período de cada pulso é T = 1/31372 = 31,8 us, então o número de pulsos para um meio ciclo é N = 10ms / 31,8us = 314 pulsos. Agora, para calcular o ciclo de trabalho para cada pulso, temos y = sinx, mas nesta equação precisamos de graus, então meio ciclo tem 180 graus para 314 pulsos. Para cada pulso, temos 180/314 = 0,57deg / pulso. Isso significa que, para cada pulso, avançamos com 0,57deg.

y é o ciclo de serviço ex o valor da posição na metade do ciclo de serviço. no início, x é 0, depois de x = 0,57, x = 1,14 e assim por diante até x = 180.

se calcularmos todos os 314 valores, obteremos um array de 314 elementos (digite "int" para ser calculado mais facilmente pelo arduino).

Essa matriz é:

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};

Você pode ver que, como uma onda senoidal, o ciclo de trabalho é mais baixo no primeiro e no último elemento e mais alto no meio.

Etapa 2: Programa Arduino para Ciclo de Trabalho Variável

Programa Arduino para Ciclo de Trabalho Variável
Programa Arduino para Ciclo de Trabalho Variável

Na imagem acima, temos sinais de ciclos de trabalho variáveis com valores da matriz.

Mas como fazer esse sinal ??

a parte do programa abaixo usa interrupções para alterar os valores dos ciclos de trabalho

sei (); // habilita interrupções

}

ISR (TIMER1_COMPA_vect) {// interromper quando o temporizador 1 corresponder ao valor OCR1A

if (i> 313 && OK == 0) {// valor final do vetor para o pino 6

i = 0; // vai para o primeiro valor do vetor (matriz)

OK = 1; // habilita o pino 5

}

x = sinPWM ; // x obtém o valor do vetor correspondente à posição i (i é indexado por zero) -valor do ciclo de trabalho

i = i + 1; // vai para a próxima posição

}

Etapa 3: alternando em pinos Arduino de 50 Hz

Alternando em pinos Arduino de 50 Hz
Alternando em pinos Arduino de 50 Hz

Porque cada pino gera apenas meio ciclo de trabalho para fazer uma onda senoidal completa, usamos dois pinos que se alternam após exatos 10 msegundos (para 50 Hz). Essa troca de pinos é feita no final da matriz - depois, digamos que o pino 5 tenha gerado 314 pulsos, esse pino é desligado e habilitado o pino 6, o que faz a mesma coisa, mas para o ciclo de trabalho negativo.

Como o arduino pode gerar apenas sinais positivos, o ciclo de trabalho negativo é feito na ponte h- você pode ler aqui sobre isso

O programa para troca de pinos:

sei (); // habilita interrupções

}

ISR (TIMER1_COMPA_vect) {// interromper quando o temporizador 1 corresponder ao valor OCR1A

if (i> 313 && OK == 0) {// valor final do vetor para o pino 6

i = 0; // vai para o primeiro valor do vetor

OK = 1; // habilita o pino 5

}

if (i> 313 && OK == 1) {// valor final do vetor para o pino 5

i = 0; // vai para o primeiro valor do vetor

OK = 0; // habilita o pino 6

}

x = sinPWM ; // x obtém o valor do vetor correspondente à posição i (i é indexado por zero)

i = i + 1; // vai para a próxima posição

if (OK == 0) {

OCR0B = 0; // torna o pino 5 0

OCR0A = x; // habilita o pino 6 para o ciclo de trabalho correspondente

if (OK == 1) {

OCR0A = 0; // faça pino 6 0

OCR0B = x; // habilita o pino 5 para o ciclo de trabalho correspondente

}

}

Etapa 4: conduzindo uma ponte H e filtrando o sinal Pwm

Os sinais obtidos do Arduino são a parte de controle para as aplicações do inversor, pois ambos são positivos. Para fazer uma onda senoidal completa e um inversor prático, temos que usar uma ponte he para limpar o pwm um filtro passa-baixo.

A ponte H é apresentada aqui.

O filtro passa-baixa testado com pequenos motores Ac - aqui.

Recomendado: