pwm não funciona

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

pwm não funciona

Mensagempor eliandrostz » 14 Nov 2006 14:38

Boa tarde, estou tentando fazer uma saida pwm proporcional a entrada de frequencia, tipo ciclo do pwm variar de 0 a 1023 para uma frequencia de 0 a 5000 Hz, mas na saida do pwm medindo com o osciloscopio só tenho a frequencia que está no timer1 com a amplitude bem menor, será que estou esquecendo algum detalhe.

Se alguém puder me dar uma força, agradeço desde já.
Código: Selecionar todos
#include <16f876A.h>
#use delay(clock=4915200)
#fuses XT,NOWDT,NOPUT,NOLVP
#include <regs_16f87x.h>

#USE fixed_io(B_outputs = PIN_B1, PIN_B2, PIN_B3, PIN_B4, PIN_B5, PIN_B6, PIN_B7)
#USE fixed_io(C_outputs = PIN_C3, PIN_C4, PIN_C5, PIN_C6, PIN_C7)

long int ciclo;

#int_timer0                 //interrupcao do timer0

trata_t0()
{
      long int entrada;
      float freq_max=5000;
      int conta;
      float calc_prop;

      conta++;
      set_timer0(16)
     if (conta >= 20)
     {
         entrada= get_timer1();   
         calc_prop = (1023/freq_max);
         ciclo = (calc_prop * entrada);
         if (ciclo>=1023) ciclo=1023;
         set_timer1 (0);                //zera contagem do timer1
         conta=0;        //zera variavel conta, recomeca contagem
      }
}

void main() {

   setup_timer_0 ( RTCC_INTERNAL | RTCC_DIV_256 );
   setup_timer_1 ( T1_EXTERNAL | T1_DIV_BY_1 );
   setup_timer_2 (T2_DIV_BY_4, 248, 1);
   SETUP_CCP1 (CCP_PWM); //configura modulo ccp para PWM
   SET_PWM1_DUTY (0);
   enable_interrupts ( GLOBAL | INT_TIMER0 );
   
while(TRUE)
      {
         SET_PWM1_DUTY(ciclo);
       }
O conhecimento vem e vai, a sabedoria permanece...
eliandrostz
Nibble
 
Mensagens: 71
Registrado em: 16 Out 2006 13:51

Re: pwm não funciona

Mensagempor andre_luis » 14 Nov 2006 15:03

Vou te enviar a seguir uns trechos do No--break que julgo relevantes para seu caso, onde uso o PWM e funciona :

Código: Selecionar todos
   


   setup_timer_0( RTCC_INTERNAL | RTCC_DIV_8 )        ;
   setup_timer_1( T1_DISABLED )                       ;
   setup_timer_2( T2_DIV_BY_4 , CONST_OSC_LIVRE , 1 ) ; // 166 para sincronismo

   setup_ccp1( CCP_PWM )                              ;
///enable_interrupts( INT_RB )                        ;
   enable_interrupts( INT_TIMER2 ) 



switch ( PWM_counter )
      {
      case 0  : NivelMinimo()   ;  set_pwm1_duty ( 0 )                 ; break ;
...
...
...
...
...
      case 30 :                    set_pwm1_duty ( Duty[PWM_counter] ) ; break ;
      case 31 : NivelMaximo()    ; set_pwm1_duty ( Duty[PWM_counter] ) ; break ;
      }
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor eliandrostz » 14 Nov 2006 15:32

Olá André, pelo que notei a unica diferença nas habilitações seria a interrupção do timer2, o pwm só funciona com essa habilitação?

Grato pelo atenção.
O conhecimento vem e vai, a sabedoria permanece...
eliandrostz
Nibble
 
Mensagens: 71
Registrado em: 16 Out 2006 13:51

Mensagempor andre_luis » 14 Nov 2006 16:07

Me parece que voce nao pode mexer deliberadamente no Timer, mas apenas no Duty, sob o risco de avacalhar o funcionamento previsto. Voce diversas vezes recarrega o timer inteiro.

Vá por este caminho...


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor eliandrostz » 14 Nov 2006 17:15

mas os timers onde eu mudo os valores são o timer0 e o timer1, o timer responsavel pelo Pwm não seria somente o timer2, ou haverá interferencia dos outros timers também.
O conhecimento vem e vai, a sabedoria permanece...
eliandrostz
Nibble
 
Mensagens: 71
Registrado em: 16 Out 2006 13:51

Mensagempor andre_luis » 16 Nov 2006 08:30

Tem razao,

Bom, tenta debugar a variável 'ciclo', pode ser que seja apenas um problema de lógica.
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor zielpunkt » 16 Nov 2006 13:26

Fosse vc isolaria o trecho que trata o PWM, fazendo uma rotina que incrementasse seu valor que utilize um loop FOR e delay. Só então, depois de certificar que as config do PWM estão ok, partiria para utilizar o TMR0 por interrupção. Deve ficar + fácil de interpretar o que acontece. Só sugestão.

Abraço.
"Talento é mais barato que sal. O que separa a pessoa talentosa da bem-sucedida é muito trabalho duro." [ Stephen King ]
zielpunkt
Byte
 
Mensagens: 376
Registrado em: 12 Out 2006 11:36
Localização: Sao Paulo - SP

Mensagempor eliandrostz » 16 Nov 2006 15:47

Olá Ziel, acatei a sua sugestão e consegui com que o PWM funcionasse, depois com a interrupção do timer0 também funcionou, em um trecho do código faço algumas alterações e salvo na eeprom, qdo saio dessa rotina o PWM desaparece, estou tentando isolar o problema. Se o problema for algo de interessante e não uma ..agada volto a postar.

André e Ziel obrigado pela atenção
O conhecimento vem e vai, a sabedoria permanece...
eliandrostz
Nibble
 
Mensagens: 71
Registrado em: 16 Out 2006 13:51

Mensagempor cristian » 16 Nov 2006 21:19

o meu ccs3.200 nao esta funcionando o PWM alguem teve este problema ele nao modifica o duty cicle
cristian
Word
 
Mensagens: 570
Registrado em: 03 Nov 2006 08:15
Localização: serrinha-ba

Mensagempor eliandrostz » 17 Nov 2006 08:09

Pessoal, o uso da diretiva #USE FIXED_IO (C)não funcionou legal, meu problema foi resolvido usando set_tris_C(valor) nas configurações iniciais.

Abraço a todos.
O conhecimento vem e vai, a sabedoria permanece...
eliandrostz
Nibble
 
Mensagens: 71
Registrado em: 16 Out 2006 13:51


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x