Página 1 de 2

MÓDULO PWM DO PIC

MensagemEnviado: 03 Jan 2010 18:25
por Pask
Amigos, fiz o módulo PWM do PIC 16F876 funcionar para gerar um sinal de 1,22 kHz com ciclo ativo de 20% sem problemas. Este PIC possui 2 módulos PWM com saídas pelos pinos C1 e C2.
Agora estou com um pequeno probleminha: os sinais retangulares que saem pelos pinos C1 e C2 são em fase, ou seja, não tem defasagem entre si. Eu gostaria que houvesse uma defasagem de 180º entre um sinal e outro.
O código, em linguagem C, para geração deste sinal é o seguinte:

setup_timer_2(t2_div_by_16,50,1); //timer2 configurado (prescaler 1:16,PR2=50 e postcaler 1:1)
set_timer2(0); //timer 2 inicializado com zero
setup_ccp1(ccp_pwm); //módulo CCP1 ativado no modo PWM
setup_ccp2(ccp_pwm); //módulo CCP2 ativado no modo PWM dt=41; //valor do duty-cicle aplicado aos registradores do módulo PWM
set_pwm1_duty(dt);
set_pwm2_duty(dt);
}

//Ajusta forma de onda para duty-cicle de 20%
//819,7us = 100% => Um duty-cicle de 20% = 819,7*20% = 164us
//Qual o valor de CCPRL:CCPCON para se atingir esse duty-cicle?
//PWMciclo ativo = Tp * (CCPRL:CCPCON) => 164us = 4,018us * (CCPRL:CCPCON)
//Portanto, CCPRL:CCPCON = 41 (valor da variável dt acima.)
//---------------------------------------------------------------------------------
Espero que seja possível entendê-lo....rsrsrsrs. Está bem comentado!

Se alguém puder me dar uma idéia de como defasar esses sinais de 180° para que não haja coincidência entre seus níveis altos, eu agradeceria muito.
P.S: Eu gostaria que essa defasagem fosse conseguida via programação e não através de componentes adicionais externos ao PIC.
Quero usar esses sinais para acionar um par de transistores em configuração (push-pull) e, como vocês sabem, ambos os transistores não podem conduzir ao mesmo tempo senão ficam em curto-circuito.

Obrigado.

Pask.

MensagemEnviado: 03 Jan 2010 19:06
por Djalma Toledo Rodrigues
Você os acionou simultâneamente, claro que vai sair em fase .

Aciona PWM2 após conclusão Duty1 e mais alguns us


-------------------------------------------------------------------------
"Agente se forma e pensa que vai curar todas as doenças.
Depois se acaba descobrindo que todos os nossos pacientes acabam morrendo. "
( Antigo Ator da Globo -- Depois coloco o nome )
-------

DJ

MensagemEnviado: 03 Jan 2010 19:12
por MOR_AL
Olá Pask. Tudo bem?
Olha eu sou leigo em C, mas estou vendo que parece que você está ativando os dois PWM com instruções consecutivas. O que aconteceria se você colocasse um delay (entre as duas instruções) de T/2, ou 1/(2 * 1,22KHz)?
Acho que eles iniciariam com uma defasagem de 50%.

Verifique!!
MOR_AL

MensagemEnviado: 03 Jan 2010 19:31
por fender
Fala MOR_AL, tudo blz?

Fui tentar acessar o seu site outro dia, e vi que ele se encontra fora do ar.

Não tem mais com ce disponiblizar aquele material sobre Eletrônica Analógica?

Em quais livros você baseou seus estudos?

Abraços
Fender

MensagemEnviado: 03 Jan 2010 19:35
por MOR_AL
fender escreveu:Fala MOR_AL, tudo blz?

Fui tentar acessar o seu site outro dia, e vi que ele se encontra fora do ar.

Não tem mais com ce disponiblizar aquele material sobre Eletrônica Analógica?

Em quais livros você baseou seus estudos?

Abraços
Fender

Olá Fender.
Vou te responder em mensagem particular. Este tópico é sobre outro assunto. Não quero levar um "puxão de orelha" do administrador. OK? :D
Encaminhada!!!
[]'s
MOR_AL

MensagemEnviado: 04 Jan 2010 07:22
por Pask
Olá amigos. O fabricante do PIC cometeu um erro ao meu ver, pois deveria haver um bit especial em algum registrador relacionado ao PWM para inverter a fase de um dos sinais. Isto, infelizmente, não existe no PIC.
Realmente a solução seria provocar uma espécie de "atraso de tempo" entre os acionamentos do PWM1 e do PWM2. Mas, já tentei fazer isto ontém e ainda não deu certo. Será que errei alguma coisa?

Por exemplo: sendo a variável dt=41 (20% de ciclo ativo), eu tentei fazer o seguinte:

set_pwm1_duty(dt);
set_pwm2_duty(2*dt);

Ou, talvez, poderia ser assim:

setup_ccp1(ccp_pwm);
delay_us (410); //50% do tempo de duração do ciclo completo
setup_ccp2(ccp_pwm);

Mas não obtive o resultado desejado nas duas alternativas acima.
Alguém teria uma segestão melhor. Se tiver, eu agradeço.

Obrigado.

MensagemEnviado: 04 Jan 2010 07:33
por fabim
pask,. entra aqui.
www.mikroe.com

vai em exemplos, em basic.

tem um exemplo simples de inversão de fase em duas pwm do pic.

ou se tiver usando um PIC18F, tem o advanced pwm...

Abraços

MensagemEnviado: 04 Jan 2010 07:43
por fabim
www.mikroe.com/en/projects/download/dualpwm.zip

Date: 22-05-2006
This program demosntrates 2 ccp pwm signals 2 khz rate 180 degree out of phase tested on EP3 , 8 mHz , 16F877a , 18F242 , 18F452, 18F4520 and 18F4620. this unit uses Timer1 , CCP1 and CCP2 modules and installs interrupt-services for these . principle : use CCP-module in compare-mode setup timer1 for interrupt every 0.5 ms clear CCP1 output , set CCP2 output setup both CCP-modules to generate interrupt on compare match.

MensagemEnviado: 04 Jan 2010 07:59
por MOR_AL
Se não encontrar solução usando o hardware, faça por software.
1 - Crie uma interrupção a cada T/2.
2 - Na interrupção N, gere um Ton na saída 1. Ton máximo é menor ou igual a T/2 (50%).
3 - Na interrupção N + 1, gere o mesmo Ton na saída 2. Ton máximo é menor ou igual a T/2 (50%).
4 - Altere (ou não) Ton.
5 - Vá para o item 2.

MOR_AL

MensagemEnviado: 04 Jan 2010 08:54
por Djalma Toledo Rodrigues
Pask escreveu: ...set_pwm1_duty(dt);
set_pwm2_duty(2*dt); .


Aqui o que foi feito é Duty PWM2 com o doblo da largura de Duty1, e repetindo
erroneamente o acinamento simultâneo como coloquei em minha msg anterior.

----------------------------------------

Imaginem dois iterruptores:

Switch1 ligado ---> Tempo Duty
Desliga
Switch2 Ligado ----> tempo Duty
Desliga

<-------------->Imagem
(caso Push Pull deverá haver um pequeno intervalo de tempo (dead time) entre eles )


DJ

MensagemEnviado: 04 Jan 2010 16:28
por Pask
Amigos estou analisando as sugestões e as idéias de vocês e, assim que conseguir algo concreto, retornarei e postarei a solução aqui.

Abraços.

MensagemEnviado: 05 Jan 2010 21:02
por Pask
Amigos, realmente ainda não consegui encontrar uma solução para criar uma defasagem entre os sinais gerados.
Aguardo uma resposta mais concreta de algum de vocês e obrigado.

MensagemEnviado: 06 Jan 2010 07:01
por fabim
tio, o que tu quer fazer é atrasar 180° um de outro ?
Tipo como se fosse chavear um trafo em push pull ?

olha novamente o link que eu mandei para você..

MensagemEnviado: 06 Jan 2010 07:40
por Pask
Meu sobrinho, é muito difícil compreender um programa sem comentários.
Mas estive pensando e acho que encontrei a solução via hardware. Usando 2 transistores de sinal comuns, eu posso criar essa defasagem. Depois eu conto mais detalhes.

MensagemEnviado: 06 Jan 2010 10:12
por Djalma Toledo Rodrigues
Pask escreveu: ...Mas estive pensando e acho que encontrei a solução via hardware. Usando 2 transistores de sinal comuns, eu posso criar essa defasagem....


<------>rsrsrs

DJ