Autor Tema: Ayuda Con PWM  (Leído 2660 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Evonkc

  • PIC12
  • **
  • Mensajes: 50
Ayuda Con PWM
« en: 04 de Mayo de 2015, 17:18:31 »
Estimados muchos saludos,

Bueno tal como dice el titulo necesito ayuda con PWM  :oops: y bueno les comento que ya he visto suficientes post y blog con el mismo tema y he logrado entender como calcular los valores.

Requiero hacer el pwm para 20 Khz con un Ciclo de duty al 50% , con el pic18f4550 este pic emplea un crystal de 20 MHz, y lo programo con el pic c Compiler o CCS, . después de haberme nutrido de información he realizado los siguientes calculos:

Periodo de duración del PWM, PER_PWM= 1/20khz = 50uS
Tosc= 1/20Mhz = 50nS
PR2= 50us/(50nS*4*1)-1 = 249

Tiempo del ciclo Duty  T_DC= 50uS/2  ( ya que es el 50%) = 25uS
PR2 del duty= 25us/(50nS*1)= 500

Estos valores que que calcule los he comprobado con el wizard de CCS y a lo que me da entender es que estoy bien  :-/ ((:-))  (en caso de que exista algún error me lo podrían indicar ya que estoy en pañales con esto.), por lo que procedí a programar el micro dándome como resultado las siguientes lineas de programación que se encuentran mas abajo. Para verificar los resultados he simulado con proteus 8.0 y me he percatado que los valores de periodo y frecuencia no eran los esperados, dandome como Periodo 7 mS y ciclo duty de 6mS, Les adjunto Imagen, y es aquí donde tengo mi problema ya que según el wizard y mis cálculos debería dar correcto el tiempo y la frecuencia. Que me pueden decir de esto. Saludos.

Código: [Seleccionar]
#include <18F4550.h>
#fuses HS,NOWDT,INTRC, NOPUT, NOPROTECT, NOLVP, NOMCLR, BROWNOUT
#use delay(clock=20000000)
 
void main(void)
{
   

    output_low(PIN_C1);   // Salida CCP1 a 0
    setup_ccp1(CCP_PWM);  // Configuro CCP1 as a PWM


   setup_timer_2(T2_DIV_BY_1,249,1); //
 

   while(1)
       {                           
            set_pwm1_duty(1000);
                       
       }
}

Bueno estimados espero poder llegar a buen puerto con esto ya que me interesa aprender de este metodo y poder aplicarlo a motores. Salu2


Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
Re: Ayuda Con PWM
« Respuesta #1 en: 04 de Mayo de 2015, 17:28:19 »
Hola Evonkc

Vamos a empezar por partes, ¿tienes conocimientos de programación en C y sobre el uso de los timer?

si la respuesta es si, supongo que la función set_pwm1_duty(1000); es una funcion propia del CCS, y eso puede que te lleve a error, ya que no sabes que esta pasando hay dentro, yo te recomiendo que hagas tu PWM con un timer y tengas asi mas control sobre el y puedas ver que esta haciendo tu función.

te dejo un ejemplito de como hacerlo mediante un TIMER aqui debes sustituir tus tiempos para hacer tu duty cicle y tener la señal en alto y bajo los tiempos que necesites un saludo y espero que te sirva.

Citar
////////////////////////////////////////////////////////////////////////////////////////////////////////
//                                                                                                    //
//    solucion2.c                                                                                     //
//    Descripcion: solucion al problema modulacion de un pequeño motor                                //
//    Autor: Juan Jose Perales Serrano                                                                //
//                                                                        //
//                                                                                                    //
////////////////////////////////////////////////////////////////////////////////////////////////////////



#include <18F2550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)

//TICK=(4/Fosc)*Prescaler---->TICK=(4/48000000)*4=0.000333ms --> 3 TICKS = 0.001 ms ---> 3000TICKS =1ms
/////////////////////////////////////////////////////////////////////////////
//
// Definicion de espacio para la carga del bootloader
//
/////////////////////////////////////////////////////////////////////////////

#build (reset=0x1000,interrupt=0x1008)
#org 0x0000,0x0FFF{}

//////////////////////////////////////////////////////////////////////////////

#include <stdlib.h>
    
    
#use standard_io(A)
#use standard_io(B)
#use standard_io(C)

  
 
#define servo PIN_B6                                                                                  
#define SW1 PIN_C2
#define LED PIN_C1
#define SALIDA PIN_B7


int8 i=0,bandera=0;
int16 TicksInterrupcion1=65500;
int1 flag=0;

int16 FPWM=0;                                            



#INT_TIMER1
void TIMER1_isr(void)
{
      if(flag==0)
      {
         output_high(SALIDA);
         TicksInterrupcion1 = 65535 - FPWM;
      }
      if(flag==1)
      {
         output_low(SALIDA);
         TicksInterrupcion1 = 65535 - (60000-FPWM);    
      }
      flag=flag+1;
      set_timer1(TicksInterrupcion1);
}



void main(void)
{

   disable_interrupts(GLOBAL);                          
 

   setup_timer_1(T1_INTERNAL | T1_DIV_BY_4);
   enable_interrupts(INT_TIMER1);
 
   enable_interrupts(GLOBAL);
 
   delay_ms(50);
  
  
   while(TRUE)
   {
      
      
   }
}
« Última modificación: 04 de Mayo de 2015, 17:30:28 por juaperser1 »
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado Evonkc

  • PIC12
  • **
  • Mensajes: 50
Re: Ayuda Con PWM
« Respuesta #2 en: 04 de Mayo de 2015, 18:08:00 »
Hola Juaperse1,

bueno primero que todo gracias por tu respuesta, y tal como preguntas tu si tengo conocimiento en programación en C, la respuesta es no, estoy recién comenzando y solamente tengo mas dominio del PSI (pic simulator ide 18), pero hasta ahora no me ha dejado muy satisfecho, en fin.

el asunto que entiendo poco lo que es el uso de los timer, recién me ha dado por profundizar en este mundo por lo que tendré que investigar mas para poder lograr entender mayormente todo.

Salud2..

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Ayuda Con PWM
« Respuesta #3 en: 04 de Mayo de 2015, 20:18:28 »
  Lo primero es asegurarse que el pic esté trabajando realmente a 20MHz. Yo no utilizo CCS pero imagino que si se lo quiere utilizar con cristal está bien colocar HS e imagino que no se debería colocar INTRC. Además, sacaría el set_pwm1 del ciclo while.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ayuda Con PWM
« Respuesta #4 en: 05 de Mayo de 2015, 00:18:09 »
Citar
Lo primero es asegurarse que el pic esté trabajando realmente a 20MHz

Fijate exactamente eso (que sea 20Mhz), ya que en el proteus le agregas un cristal pero solo le da importancia a la frecuencia que se encuentra en las propiedades del PIC
« Última modificación: 05 de Mayo de 2015, 07:27:50 por KILLERJC »

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
Re: Ayuda Con PWM
« Respuesta #5 en: 05 de Mayo de 2015, 04:56:58 »
Citar
Hola Juaperse1,

bueno primero que todo gracias por tu respuesta, y tal como preguntas tu si tengo conocimiento en programación en C, la respuesta es no, estoy recién comenzando y solamente tengo mas dominio del PSI (pic simulator ide 18), pero hasta ahora no me ha dejado muy satisfecho, en fin.

el asunto que entiendo poco lo que es el uso de los timer, recién me ha dado por profundizar en este mundo por lo que tendré que investigar mas para poder lograr entender mayormente todo.

Salud2..

Es dificil coger el concepto de timer al principio, pero una vez que lo haces es muy sencillo, el CCS no me gusta nada, pero para empezar pues esta muy bien (yo empece por CCS), como te dicen los compañeros lo primero que debes hacer es comprobar que tu micro va a 20Mhz.
2º Intenta arrancar un timer y que entre en la interrupcion.
3º Crea una señal periodica con un tiempo que tu quieras
4º Modifica tu programa para que puedas decidir cuanto tiempo esta en alto la señal y cuanto tiempo esta en bajo.

el 4 paso puedes tomar esto como ejemplo:

Código: [Seleccionar]
void TIMER1_isr(void)
{
      if(flag==0)
      {
         output_high(SALIDA);
         TicksInterrupcion1 = 65535 - FPWM;
      }
      if(flag==1)
      {
         output_low(SALIDA);
         TicksInterrupcion1 = 65535 - (60000-FPWM);   
      }
      flag=flag+1;
      set_timer1(TicksInterrupcion1);
}

una vez manejes esto, seras capaz de crear tu PWM.

Un saludo
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ayuda Con PWM
« Respuesta #6 en: 05 de Mayo de 2015, 06:54:09 »
El tema es por que usar timers, cuando puede usar el PWM xD.

Ahora si requiere muchos y los quiere en sincronia entonces si vas a tener que hacerlo como dije juanperser.

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
Re: Ayuda Con PWM
« Respuesta #7 en: 05 de Mayo de 2015, 07:38:46 »
Bueno tambien se puede hacer por PWM por supuesto, pero si sabe poco de programación no se si sera mas dificil hacerlo por PWM, quizá no, yo particularmente lo veo mas facil con timer, puedes leerte los dos metodos y ver cual ves mas sencillo.

PD:

Citar
como dije juanperser.

Por que casi todos me llamais JUANperser???  :D :D :D me llamo juanjo pero no me gusta que me digan juan xd
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ayuda Con PWM
« Respuesta #8 en: 05 de Mayo de 2015, 09:15:11 »
Con respecto al codigo , tus calculos me parecen correctos, lamentablemente yo tambien odio CCS por no tener una buena documentacion, busque la funcion pero no da muchos detalles.
Realmente no se si se esta cargando esos 249 a PR2, suponiendo que eso este bien.

Los calculos parecen bien, aunque estoy mas seguro que los 50 te los dara a las 502/503 xD segun la formula que dice el manual del CCS en esa funcion.

Parece mas un problema de proteus

y aunque no afecta a la simulacion , tenes que ver tus fuses:

#fuses HS,NOWDT,INTRC, NOPUT, NOPROTECT, NOLVP, NOMCLR, BROWNOUT


Recontra offtopic:

Citar
Por que casi todos me llamais JUANperser???  lol lol lol me llamo juanjo pero no me gusta que me digan juan xd

Eso te pasa por no poner juanjo... yo veo jua y lo primero que se me viene a la cabeza es juan, si al nick lo hiciste para que no te llamen juan entonces te auto boicoteaste vos mismo xD

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
Re: Ayuda Con PWM
« Respuesta #9 en: 05 de Mayo de 2015, 09:51:53 »
Citar
Eso te pasa por no poner juanjo... yo veo jua y lo primero que se me viene a la cabeza es juan, si al nick lo hiciste para que no te llamen juan entonces te auto boicoteaste vos mismo xD

Estaba cogido y puse las 3 primeras letras de mi nombre y apellidos  :( :( que mala gente sois por dios  :D :D :D
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado reiniertl

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1187
Re: Ayuda Con PWM
« Respuesta #10 en: 05 de Mayo de 2015, 11:36:43 »
Esto es típico de CCS, aunque veo algunas posibles fuentes de fallo.

1. Debes configurar los registros de dirección del PIC: (TRIS) de modo que la salida CCP1 quede como salida. Esto es importante porque el módulo CCP no utiliza código para cambiar el estado del PIN, esto se hace por hardware. CCS utiliza una terrible política para la E/S ya que si lees un PIC lo pone de entrada y si lo escribes lo pone de salida, eso por defecto. Lo que sucede es que muchas veces tienes en un mismo puerto pines que son entrada y otros que son salida, si lees el puerto te cambia las salidas a entradas y allá van los dolores de cabeza.

2. Debes verificar que se escriben los valores correctos en los registros de trabajo. Ten en cuenta que en este caso algunos valores pueden estar una parte en un registro y otra en otro registro. Datasheet en la mano y a verificar.

3. Verifica lo que te comentan del reloj de los micros en el PROTEUS.

Por último, tu código utiliza dos módulos del uC para implementar el PWM (TIMER2+CCP1) así que en realidad no está haciendo un PWM por software. Con 20KHz de frecuencia no se puede hacer esto por sw con PIC. Bueno sí se puede pero sólo el PWM y no te va a quedar muy bueno, de allí que esté implementado por hw, lástima que solo suelen traer dos.

Suerte
 Reinier

Desconectado Evonkc

  • PIC12
  • **
  • Mensajes: 50
Re: Ayuda Con PWM
« Respuesta #11 en: 05 de Mayo de 2015, 18:49:55 »
Estimados,

Antes que todo les quiero agradecer por sus post y respuesta sin duda es una retroalimentación positiva y constructiva.


Y ahora respecto a mi problema, era nada mas un error 300, osea entre el programador y el asiento, la solución fue rehacer el esquema en proteus y asunto solucionado dieron los valores que he calculado y a su vez también ccs, resultando todo como uno deseaba.

el código quedo algo asi y resulta.

Código: [Seleccionar]
#include <18F4550.h>
#device adc=10

#FUSES NOWDT,HS,NOPROTECT, MCLR                     

#use delay(clock=20000000)

void main()
{
   set_tris_c(0x00);
   setup_timer_2(T2_DIV_BY_4,255,1);
   setup_ccp1(CCP_PWM);
   set_pwm1_duty(125);
   
//Setup_Oscillator parameter not selected from Intr Oscillotar Config tab

   // TODO: USER CODE!!

 while(1)
 {
 set_pwm1_duty(125);
 }
}

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
Re: Ayuda Con PWM
« Respuesta #12 en: 05 de Mayo de 2015, 19:16:45 »
Me alegro por ti, enorabuena por solucionarlo ;-)

Un saludo
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw


 

anything