Você está na página 1de 6

Aqui está um exemplo de um código em linguagem C que utiliza PWM IBT trifásico para

controlar um motor:

```c
#include <avr/io.h>
#include <avr/interrupt.h>

#define F_CPU 16000000UL


#define PWM_FREQ 20000
#define PERIOD (F_CPU / (PWM_FREQ * 2))

volatile uint16_t duty_cycle = 0;


volatile uint8_t enable = 0;

int main(void)
{
// Configuração do PWM
TCCR1A |= (1 << COM1A1) | (1 << COM1B1) | (1 << COM1C1) | (1 << WGM11);
TCCR1B |= (1 << WGM13) | (1 << WGM12) | (1 << CS10);
ICR1 = PERIOD;

// Configuração dos pinos de saída para as pontes H


DDRD |= (1 << PD5) | (1 << PD6) | (1 << PD7);
PORTD |= (1 << PD5) | (1 << PD6) | (1 << PD7);

// Configuração do pino de entrada para o sinal de "enable"


DDRB &= ~(1 << PB1);
PORTB |= (1 << PB1);

// Configuração das interrupções


TIMSK1 |= (1 << TOIE1);
PCMSK0 |= (1 << PCINT1);
PCICR |= (1 << PCIE0);
sei();

while (1)
{
// Loop principal do programa
}
}

ISR(TIM1_OVF_vect)
{
// Atualiza o duty cycle do PWM
OCR1A = (duty_cycle * PERIOD) / 255;
OCR1B = (duty_cycle * PERIOD) / 255;
OCR1C = (duty_cycle * PERIOD) / 255;
}

ISR(PCINT0_vect)
{
// Ativa ou desativa o sinal de "enable"
if (PINB & (1 << PB1))
{
enable = 0;
}
else
{
enable = 1;
}
}

void motor_forward(uint8_t speed)


{
if (enable)
{
// Configura as pontes H para movimentar o motor para frente
PORTD &= ~(1 << PD5);
PORTD |= (1 << PD6);

// Define o duty cycle do PWM de acordo com a velocidade desejada


duty_cycle = speed;
}
}

void motor_reverse(uint8_t speed)


{
if (enable)
{
// Configura as pontes H para movimentar o motor para trás
PORTD &= ~(1 << PD6);
PORTD |= (1 << PD5);

// Define o duty cycle do PWM de acordo com a velocidade desejada


duty_cycle = speed;
}
}

void motor_stop()
{
// Para o motor
PORTD |= (1 << PD5) | (1 << PD6);

// Zera o duty cycle do PWM


duty_cycle = 0;
}
```

Este código utiliza o Timer 1 do microcontrolador AVR para gerar o sinal PWM e as
portas PD5, PD6 e PD7 como saída para as pontes H que controlam o motor. O sinal de
"enable" é lido através da porta PB1 e as interrupções são utilizadas para ativar
ou desativar o sinal de "enable" e para atualizar o duty cycle do PWM a cada ciclo.

Existem três funções definidas no código: `motor_forward()`, `motor_reverse()` e


`motor_stop()`. A função `motor_forward()` configura as pontes H para movimentar o
motor para frente, a função `motor_reverse()` configura as pontes H para movimentar
o motor para trás e a função `motor_stop()` para o motor. Todas as funções recebem
um parâmetro para definir a velocidade desejada (de 0 a 255).

O código pode ser compilado e gravado em um microcontrolador AVR compatível com a


linguagem C, como o ATmega328P, por exemplo. É importante lembrar que este exemplo
é apenas um guia e pode precisar ser adaptado para diferentes configurações de
hardware ou especificações do motor utilizado.

Mais exemplos veja adiante


Aqui estão alguns exemplos de como controlar a amperagem e outras funções em um
inversor de frequência industrial usando a linguagem C:
1. Controle de Amperagem

Para controlar a amperagem, é necessário monitorar a corrente no motor em tempo


real e ajustar a frequência do sinal de saída de acordo. Você pode fazer isso
usando uma técnica chamada PWM (Pulse Width Modulation), que consiste em variar a
largura dos pulsos do sinal de saída para atingir a amperagem desejada.

Aqui está um exemplo de código C que implementa essa técnica:

```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
float desired_current = 5; //amperagem desejada
float measured_current = 0; //amperagem medida
float pwm_duty_cycle = 0; //largura do pulso PWM

while (1)
{
//mede a corrente no motor
measured_current = read_current_sensor();

//calcula a diferença entre a amperagem medida e a desejada


float error = desired_current - measured_current;

//calcula a largura do pulso PWM para controlar a amperagem


pwm_duty_cycle = error / 10; //10 é o fator de ganho

//envia o sinal PWM para o motor


send_pwm_signal(pwm_duty_cycle);
}

return 0;
}
```

2. Controle de Voltagem

O controle de voltagem é essencial para fornecer a quantidade correta de energia


para o motor. Para fazer isso, você precisa monitorar a tensão no motor em tempo
real e ajustar a amplitude do sinal de saída de acordo. Você pode implementar isso
usando uma técnica de controle PI (proporcional-integral), que ajusta a amplitude
do sinal de saída com base no erro entre a tensão medida e a desejada.

Aqui está um exemplo de código C que implementa essa técnica:

```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
float desired_voltage = 220; //voltagem desejada
float measured_voltage = 0; //voltagem medida
float error = 0; //diferença entre a voltagem medida e a desejada
float pwm_amplitude = 0; //amplitude do sinal PWM

while (1)
{
//mede a tensão no motor
measured_voltage = read_voltage_sensor();

//calcula a diferença entre a tensão medida e a desejada


error = desired_voltage - measured_voltage;

//calcula a amplitude do sinal PWM para controlar a tensão


pwm_amplitude = error / 100; //100 é o fator de ganho

//envia o sinal PWM para o motor


send_pwm_signal(pwm_amplitude);
}

return 0;
}
```

3. Transformada de Fourier

A transformada de Fourier é uma técnica matemática usada para descrever um sinal


complexo em termos de suas componentes de frequência. Ela é útil para gerar sinais
de saída complexos em um inversor de frequência industrial. Você pode implementar a
transformada de Fourier usando uma biblioteca especializada em matemática complexa,
como a FFTW (Fastest Fourier Transform in the West).

Aqui está um exemplo de código C que usa a biblioteca FFTW para gerar um sinal de
saída complexo a partir de um sinal de entrada simples:

```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <fftw3.h>

int main()
{
int n = 128; //número de pontos no sinal de entrada
double input_signal[n]; //sinal de entrada
double output_signal[n]; //sinal de saída
fftw_complex *in, *out; //dados de entrada e saída para a transformada

//prepara os dados de entrada e saída


in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * n);
out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * n);

//preenche o sinal de entrada com uma onda senoidal


for (int k = 0; k < n; ++k)
{
input_signal[k] = sin(2 * M_PI * k / n);
in[k][0] = input_signal[k]; //componente real do sinal de entrada
in[k][1] = 0; //componente imaginária do sinal de entrada
}

//executa a transformada de Fourier


fftw_plan p = fftw_plan_dft_1d(n, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
fftw_execute(p);

//calcula o módulo do sinal de saída


for (int k = 0; k < n; ++k)
{
output_signal[k] = sqrt(out[k][0]*out[k][0] + out[k][1]*out[k][1]) / n;
printf("%f\n", output_signal[k]); //exibe as componentes de frequência
}

//libera a memória alocada


fftw_destroy_plan(p);
fftw_free(in); fftw_free(out);

return 0;
}
```

4. Inteligência Artificial

A inteligência artificial pode ser usada em um inversor de frequência industrial


para aprender e adaptar-se a diferentes condições de operação. Por exemplo, você
pode usar algoritmos de aprendizado de máquina para otimizar a resposta do inversor
a diferentes cargas e condições de operação.

Aqui está um exemplo de código C que usa uma rede neural artificial para prever a
carga em um motor com base nos dados de entrada:

```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <fftw3.h>
#include <torch/torch.h>

int main()
{
//prepara os dados de entrada (velocidade e corrente)
float speed_data[100] = {...}; //dados de velocidade
float current_data[100] = {...}; //dados de corrente
float input_data[2][100]; //dados de entrada da rede neural
for (int i = 0; i < 100; ++i)
{
input_data[0][i] = speed_data[i];
input_data[1][i] = current_data[i];
}

//carrega o modelo pré-treinado da rede neural


torch::jit::script::Module module = torch::jit::load("motor_model.pt");

//executa a rede neural nos dados de entrada


torch::Tensor input_tensor = torch::from_blob(input_data, {2, 100},
torch::kFloat32);
at::Tensor output_tensor = module.forward({input_tensor}).toTensor();
float *output_data = output_tensor.data_ptr<float>();

//exibe os resultados da previsão de carga


for (int i = 0; i < 100; ++i)
{
printf("%f\n", output_data[i]);
}

return 0;
}
```

Observação: Esses exemplos são apenas ilustrativos e podem ser adaptados para
diferentes necessidades de projeto. Além disso, alguns dos exemplos exigem hardware
e software especializados para funcionar corretamente. Consulte um engenheiro
elétrico qualificado para obter informações mais detalhadas sobre como implementar
um inversor de frequência industrial com base em sua aplicação específica.

Exemplos de fabricante de módulos 100a


De inversor frequência

Segue abaixo alguns exemplos de módulos IGBT de cada fabricante mencionado, com
capacidade de plena carga para motores de 100A em inversores de frequência:

- Infineon: FZ1200R12KE3 - Módulo IGBT de 1200V e 1200A, capaz de suportar cargas


de até 100A em inversores de frequência.
- Fuji Electric: 6MBP100RA060 - Módulo IGBT de 600V e 100A, apropriado para
acionamento de motores de alta potência em aplicação industrial.
- Mitsubishi Electric: CM100DY-12H - Módulo IGBT de 1200V e 100A, ideal para
inversores de frequência de alto desempenho e cargas de motor de alto torque.
- Semikron: SKM100GB128D - Módulo IGBT de 1200V e 100A, com alta capacidade de
comutação de frequência e baixa perda de condução.
- Toshiba: MG100Q2YS40 - Módulo IGBT de 1200V e 100A, adequado para inversores de
frequência de alta potência, com baixa perda de comutação e alta eficiência.
- STMicroelectronics: STGW38IH130D - Módulo IGBT de 1300V e 100A, projetado para
acionamento de motores de alta potência e baixo consumo de energia em aplicações
industriais.

Você também pode gostar