Página 1 de 2

Exemplo de PWM 3 níveis com PIC18F4550

MensagemEnviado: 08 Mar 2015 22:14
por KrafT
Bom, como algumas pessoas manifestaram interesse e esse circuito é bem fácil de montar inclusive para quem está começando, estou postando o código fonte para o circuito em malha aberta.

O comando é em ponte completa com IR2110.



Código: Selecionar todos

#include "PWM3Niveis.h"

#define MF 334    //Indice de modulação.
#define MF_2 MF/2 //Um semiciclo.
#byte CCP1CON = 0x0FBD
#byte CCPR1L = 0x0FBE

#include "tabelas.c"

#int_TIMER2
void  TIMER2_isr(void)
{
static int16 k;
static int meio_mf=167;
static int indice=0;

   k=(TAB_SENO[indice++]);
   if(indice>166)indice=0;
   set_pwm1_duty(k);

   if(!--meio_mf){    //Alterna o braço da ponte de mosfets.
      meio_mf=167;
      if(CCP1CON &0x80)CCP1CON&=0x7F;
      else CCP1CON|=0x80;
   }

}




void main()
{

   setup_adc_ports(AN0_TO_AN3|VSS_VDD);
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DIV_BY_4,149,1);
   setup_timer_3(T3_INTERNAL|T3_DIV_BY_1);
   setup_ccp1(CCP_PWM_FULL_BRIDGE|CCP_PWM);
   set_pwm1_duty(0); //Vai para CCPR1L e CCP1CON 4:5
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

   enable_interrupts(INT_TIMER2);
   enable_interrupts(GLOBAL);

   set_tris_a(3); //Duas entradas A/D.
   set_tris_b(0);
   set_tris_c(0);
   set_tris_d(0);
   set_tris_e(0);

   set_pwm1_duty(0);



   for(;;){
        }

}

Re: Exemplo de PWM 3 níveis com PIC18F4550

MensagemEnviado: 09 Mar 2015 22:30
por andre_luis
KrafT,

Tem como postar também os códigos dos arquivos "PWM3Niveis.h" e "tabelas.c" ?

Re: Exemplo de PWM 3 níveis com PIC18F4550

MensagemEnviado: 10 Mar 2015 09:53
por ze
... e o circuito?
1.jpg>1k.txt

Re: Exemplo de PWM 3 níveis com PIC18F4550

MensagemEnviado: 10 Mar 2015 20:29
por KrafT
Bom, seguem os arquivos faltantes.

O interessante nesse circuito é que o trafo de ferro silício filtra os 20 kHz do PWM e deixa o sinal senoidal conforme o vídeo. É possível eliminar o indutor de saída e utilizar a indutância do trafo para esse fim:

080f04.gif


O trafo é necessário para elevação de tensão. Se for circuito abaixador e não for necessário isolação, ele pode ser dispensado. Acredito que reduzir muito sem trafo não fique eficiente, mas essa aplicação não é comum;

Para fazer malha fechada, medir a tensão de saída e aplicar uma lógica de controle sobre o valor lido da tabela PWM;

A tabela foi gerada no Excel;

O uso de dois mosfets só para selecionar o quadrante, permite menos perdas por comutação nos mesmos.

Re: Exemplo de PWM 3 níveis com PIC18F4550

MensagemEnviado: 10 Mar 2015 20:32
por KrafT
Tabela: Observem que ela tem dois quadrantes. Seria possível operar só com um, mas como memória de programa não me faltava...

Re: Exemplo de PWM 3 níveis com PIC18F4550

MensagemEnviado: 10 Mar 2015 20:33
por KrafT
Esquema do microcontrolador...

Re: Exemplo de PWM 3 níveis com PIC18F4550

MensagemEnviado: 10 Mar 2015 20:40
por KrafT
Esquema do módulo de potência.

O capacitor em série com o trafo é para evitar problemas de parar o PWM ao debugar.

A tensão de entrada foi especificada para um sistema foto-voltaico. O mesmo circuito pode operar numa ampla faixa de tensões, a depender só das características dos Mosfets.

Re: Exemplo de PWM 3 níveis com PIC18F4550

MensagemEnviado: 10 Mar 2015 22:19
por andre_luis
Voce fez com uma resolução bastante razoável, 42 pontos por ¼ de ciclo da senoide.
Eu fiz um inversor com 32 pontos, e ainda assim já era quase imperceptível a variação.

Mas só um detalhe que eu não entendi, que foi o título "PWM 3 níveis".
Acho que passei batido por algum detalhe no video...rsrs.

Re: Exemplo de PWM 3 níveis com PIC18F4550

MensagemEnviado: 10 Mar 2015 22:28
por KrafT
Três níveis porque não há uma transição de +V para -V na ponte. Temos, +V, zero e -V, ou seja, três níveis.

O interessante dessa técnica é que o núcleo do trafo vai saturando num semicilho, porque o PWm não inverte no semiciclo. Só no próximo semiciclo o núcleo é "desaturado". Se fosse trafo de ferrite, o resultado não seria satisfatório por causa dessa saturação.

Re: Exemplo de PWM 3 níveis com PIC18F4550

MensagemEnviado: 11 Mar 2015 09:23
por ze
há alguns anos fiz um treco deste pra girar um motor dum tanquinho. Como de praxe, postei no efêmero boteco e já era. Dicas preciosas do amigo proex, fabim e ... perdoem-me os d+... idade... já viu. Usei um driver igbt sucateado. Devido a alta indutância, eram apenas 17 'steps' de seno. Olhando com mais calma agora, percebo que a tabela poderia ir até 90º só. Mas era minha 1ª vez pow. dá um tempo...
A senoide ficou bunitinha e rodou direitinho. Deu um previsível apitinho. Ai que fofo. A fonte era um gerador 110vdc que era tocado a água. Atualmente está parado pois o córrego secou.
Colo o conteúdo pra somarmos algo
Código: Selecionar todos
/* Programa para uControlador para controle de motor ac com igbt*/
/* 26/09/2011 V0.0A - alpha pic16f627 com portas nand*/
// 30/09 - pic16f876a 2 pwm
//10/10 -dicas do asm51
#include <pic.h>
#define FOSC 10000000 //cristal
#define SAMPLE 17 //num de amostras por semiciclo
#define FREQ 60*2 //120-> 1 semiciclo
#define FREQINT (SAMPLE*FREQ)//freq de interrupção
#define PRESC 16 //prescaler
#define tmr0 0x100-((FOSC/4)/PRESC)/FREQINT
//************************ configuração fusíveis hitech -c*******************
__CONFIG(CP_ON & FOSC_HS & WDTE_OFF & BOREN_ON & LVP_OFF & PWRTE_ON);
static bit comuta;
unsigned char i; //global

unsigned int const tabseno[17]=
{   
99   ,
199   ,
391   ,
568   ,
723   ,
850   ,
945   ,
1003,
1023,
1003,
945   ,
850   ,
723   ,
568   ,
391   ,
199   ,
99
};

//controle pwm
void duty(unsigned int dt)
{
CCP1Y=CCP2Y=dt; //LSB (bit0 pro bit4 de CCP1CON)
dt>>=1;
CCP1X=CCP2X=dt; //LSB (bit1 pro bit5 de CCP2CON)
dt>>=1;
CCPR1L=CCPR2L=dt; //MSB (byte + significativo)
}

static void interrupt
isr(void)         // Here be interrupt function - the name is unimportant.
{
TMR0=tmr0;//restaura
TMR0IF=0;
if (i>16) //completou um semiciclo
   {
   CCP2CON=CCP1CON=0;//pwm off para garantir 0...
   i=0;
   comuta^=1; //próximo seniciclo
   PORTC=0;//... 0 no outro canal
   }
if (!comuta)
   {
   CCP1CON=0b00001100;//pwm1 on
   RC0=1;//liga igbt H direita
   }
else
   {
   CCP2CON=0b00001100;//pwm2 on
   RC3=1;//liga igbt H esquerda
   }
duty(tabseno[i]);
i++;
}

/**********************************************************************/
void main()
{
TRISA=TRISB=TRISC=0;//tudo saída
PORTA=PORTB=PORTC=0;//tudo zerado
CMCON=0xff;//pinos cmcon=digital
CCP1CON=CCP2CON=0;
PR2=0xff;//ajuste freq pwm
T2CON=0b00000100; //timer2 on, prescaler 1:1
OPTION_REG=0b10000011;// TMR0 prescaler 1:16
TMR0=tmr0;//520uS
TMR0IE=1;//habilita interrupt timer0
GIE=1;//interrupção geral
for (;;)
{
//só interrupt por enquanto
}

}

Meu plano era controlar a velocidade, mas ainda não sei como. Creio que tem que diminuir a freq de 60Hz E amplitude, né isso? Bom... dx a água rolar literalmente primeiro. Quem sabe depois de me aposentar... contagem regressiva

Re: Exemplo de PWM 3 níveis com PIC18F4550

MensagemEnviado: 11 Mar 2015 09:35
por ze
ah sim. antes que o kraft peça, não tenho o circuito. Ou melhor, tenho. Só que está em aranhaico (aff doeu). Se precisar tiro foto da aranha.

Re: Exemplo de PWM 3 níveis com PIC18F4550

MensagemEnviado: 12 Mar 2015 20:13
por KrafT
Que é isso Zé... Esquema é para os fracos, hehehe...

O meu protótipo final ficou assim:

Imagem

Os TO-220 na frente dos mosfets são diodos rápidos que botei para testar uma outra topologia. Não são necessários ao circuito proposto.

Re: Exemplo de PWM 3 níveis com PIC18F4550

MensagemEnviado: 19 Jan 2016 20:51
por Rodrigoev
Olá amigo!

Estou trabalhando num projeto muito parecido, que terá duas variantes:
- Uma versão será um inversor 2 em 1, ou seja, será um inversor senoidal com carregador de baterias. Obviamente que o equipamento terá o modo inversor e o modo carregador.
- Inversor grid-tie.

Assim que começar a evoluir posto as novidades.

Um detalhe, os pdf's que disponibilizaste no forum, referentes aos esquemas abrem em branco. Poderias postar novamente?

Grande abraço a todos.

Re: Exemplo de PWM 3 níveis com PIC18F4550

MensagemEnviado: 20 Jan 2016 21:08
por KrafT
O sol deve ter apagado os PDFs.
SCHEMATIC1 _ 1- CONTROLE.pdf

Re: Exemplo de PWM 3 níveis com PIC18F4550

MensagemEnviado: 20 Jan 2016 21:11
por KrafT
Lembrando que esse circuitinho foi um trabalhinho de aula e com o PIC utilizado até dá para fazer um controle rudimentar, que para algumas aplicações pode ser suficiente. Mas grid-tie é beeeeeeeeeeeeeeem diferente. Teria que usar um FPGA ou DSP, ou os dois.

SCHEMATIC1 _ 2- POTENCIA.pdf


Não vá se machucar com as altas tensões do circuito.