Inversor senoidal monofásico 110Vac/60Hz/1KVA com PIC16F877A

Autor: andre_luis • Categoria: Microchip PIC • Postado em 19 Jun 2014 22:06 • Visualizado: 4274x

A seguir, será apresentado o projeto de um inversor senoidal desenvolvido originalmente como um No-break, entretanto com as funcionalidades relacionadas ao sincronismo da comutação rede-inversor ainda não estão operacionais no firmware, o projeto será apresentado compativel como inversor.
Para geração da senoide foi utilizado o seguinte arquivo em EXCEL, que gera os valores da tabela em função dos valores inseridos:

Imagem
Download: http://teprom.eng.br/arquivos/Inversor/seno.zip

A cada interrupção do Timer, é recarregado o valor do Duty-cycle ( calculado na tabela acima ). No total, foram 32 amostras por ¼ de ciclo da senoide. Sempre que atingir os limites de 0o e 90o da senoide, as funções NivelMinimo() e NivelMaximo() respectivamente farão a variavel direcao mudar o sentido da contagem, conforme abaixo:

cpp code

////////////////////////////////////////////////////////////////////////
void NivelMinimo ( void )
{
direcao = CRESCENTE ;

cpp code
////////////////////////////////////////////////////////////////////////
void NivelMaximo ( void )
{
direcao = DECRESCENTE ;


Inclusive, um fato interessante que podemos observar é que para cada uma dessas 32 interruções por ¼ de ciclo, podemos distribuir o processamento tal como em "threads" com tempos de execução limitados:
cpp code
void CarregaPWM ( void )
{
if ( direcao == CRESCENTE ) PWM_counter++ ;
else PWM_counter-- ;
switch ( PWM_counter )
{
case 0 : NivelMinimo() ; set_pwm1_duty ( 0 ) ; break ;
case 1 : set_pwm1_duty ( Duty[PWM_counter] ) ; break ;
case 2 : set_pwm1_duty ( Duty[PWM_counter] ) ; break ;
case 3 : set_pwm1_duty ( Duty[PWM_counter] ) ; break ;
case 4 : set_pwm1_duty ( Duty[PWM_counter] ) ; break ;
case 5 : set_pwm1_duty ( Duty[PWM_counter] ) ; break ;
case 6 : set_pwm1_duty ( Duty[PWM_counter] ) ; break ;
case 7 : set_pwm1_duty ( Duty[PWM_counter] ) ; break ;
case 8 : set_pwm1_duty ( Duty[PWM_counter] ) ; break ;
case 9 : set_pwm1_duty ( Duty[PWM_counter] ) ; break ;
case 10 : set_pwm1_duty ( Duty[PWM_counter] ) ; break ;
case 11 : set_pwm1_duty ( Duty[PWM_counter] ) ; break ;
case 12 : set_pwm1_duty ( Duty[PWM_counter] ) ; break ;
case 13 : set_pwm1_duty ( Duty[PWM_counter] ) ; break ;
case 14 : set_pwm1_duty ( Duty[PWM_counter] ) ; break ;
case 15 : set_pwm1_duty ( Duty[PWM_counter] ) ; break ;
case 16 : set_pwm1_duty ( Duty[PWM_counter] ) ; break ;
case 17 : set_pwm1_duty ( Duty[PWM_counter] ) ; break ;
case 18 : set_pwm1_duty ( Duty[PWM_counter] ) ; break ;
case 19 : set_pwm1_duty ( Duty[PWM_counter] ) ; break ;
case 20 : set_pwm1_duty ( Duty[PWM_counter] ) ; break ;
case 21 : set_pwm1_duty ( Duty[PWM_counter] ) ; break ;
case 22 : set_pwm1_duty ( Duty[PWM_counter] ) ; break ;
case 23 : set_pwm1_duty ( Duty[PWM_counter] ) ; break ;
case 24 : set_pwm1_duty ( Duty[PWM_counter] ) ; break ;
case 25 : set_pwm1_duty ( Duty[PWM_counter] ) ; break ;
case 26 : set_pwm1_duty ( Duty[PWM_counter] ) ; break ;
case 27 : set_pwm1_duty ( Duty[PWM_counter] ) ; break ;
case 28 : set_pwm1_duty ( Duty[PWM_counter] ) ; break ;
case 29 : set_pwm1_duty ( Duty[PWM_counter] ) ; break ;
case 30 : set_pwm1_duty ( Duty[PWM_counter] ) ; break ;
case 31 : NivelMaximo() ; set_pwm1_duty ( Duty[PWM_counter] ) ; break ;
}
}

A placa de controle possui ainda diversos recursos, como display de LCD, RTC, UART, etc...
Uma imagem do layout da mesma é apresentado abaixo, bem como o link para baixar o projeto, desenhado em Protel99:


Imagem
Download: http://teprom.eng.br/arquivos/Inversor/UPS.zip

O programa foi feito em linguagem C com compilador CCS.
O firmware pode ser baixado pelo link abaixo:
Download: http://teprom.eng.br/arquivos/Inversor/nb.zip

Adicionar comentário

Registrar or Efetue login para comentar

x