Autor Tema: PWM en C18  (Leído 1874 veces)

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

Desconectado churrinfunflais

  • PIC12
  • **
  • Mensajes: 68
PWM en C18
« en: 19 de Diciembre de 2012, 15:30:06 »
Hola amigos!!!

Estoy en un pequeño proyectito en el cual tengo que utilizar una señal portadora a 36khz a traves del PWM,,, solo que no eh podido configurarlo adecuadamente para sacar una señal a esta frecuencia,,, espero me puedan ayudar....

estoy utilizando un 18f4550 + cristal 12Mhz...

Aquí les dejo el código y configuraciones que estoy utilizando...
Código: [Seleccionar]
#include <stdio.h>
#include <stdlib.h>

#include <p18f4550.h> // Processor specific
#include <pwm.h> // Located in the h folder of MCC18
#include <timers.h> // Located in the h folder of MCC18
#include <delays.h>

#pragma config PLLDIV   = 3         // (12 MHz crystal)
#pragma config CPUDIV   = OSC1_PLL2
#pragma config USBDIV   = 2         // Clock source from 96MHz PLL/2
#pragma config FOSC     = HS
#pragma config FCMEN    = OFF
#pragma config IESO     = OFF
#pragma config PWRT     = OFF
#pragma config BOR      = ON
#pragma config BORV     = 3
#pragma config VREGEN   = ON      //USB Voltage Regulator
#pragma config WDT      = OFF
#pragma config WDTPS    = 32768
#pragma config MCLRE    = ON
#pragma config LPT1OSC  = OFF
#pragma config PBADEN   = OFF
//      #pragma config CCP2MX   = ON
#pragma config STVREN   = ON
#pragma config LVP      = OFF
//      #pragma config ICPRT    = OFF       // Dedicated In-Circuit Debug/Programming
#pragma config XINST    = OFF       // Extended Instruction Set
#pragma config CP0      = OFF
#pragma config CP1      = OFF
//      #pragma config CP2      = OFF
//      #pragma config CP3      = OFF
#pragma config CPB      = OFF
//      #pragma config CPD      = OFF
#pragma config WRT0     = OFF
#pragma config WRT1     = OFF
//      #pragma config WRT2     = OFF
//      #pragma config WRT3     = OFF
#pragma config WRTB     = OFF       // Boot Block Write Protection
#pragma config WRTC     = OFF
//      #pragma config WRTD     = OFF
#pragma config EBTR0    = OFF
#pragma config EBTR1    = OFF
//      #pragma config EBTR2    = OFF
//      #pragma config EBTR3    = OFF
#pragma config EBTRB    = OFF

void main(void) {

    TRISC = 0;

    OpenTimer2(TIMER_INT_OFF & T2_PS_1_1 & T2_POST_1_1);
    OpenPWM1(250); // Period - frequency
    SetDCPWM1(0b111110100);

    while (1);
}

Con este código logro una señal a 12Khz a 50%... quiero lograr 36Khz a 50%

Desconectado churrinfunflais

  • PIC12
  • **
  • Mensajes: 68
Re: PWM en C18 [Solucionado cualquier frequencia]
« Respuesta #1 en: 19 de Diciembre de 2012, 18:25:03 »
Hola amigos!!!

He solucionado el problema,,, no se si de una forma correcta pero con esto logro sacar la frecuencia que necesite y con el Duty Cycle que quiera...

Aquí les dejo mi código,, espero no hacer malas practicas de programación... cualquier recomendacion es bienvenida.
Código: [Seleccionar]
    #define Xtal    12000000    // 12MHz Xtal
    #define Freq    36000       // 36Khz PWM frequency
    #define Duty    0.50        // 50% Duty Cycle
    #define PS      1           // Prescaler 1:1

    #define PWM_Freq    (Xtal)/(Freq * 4 * PS)
    #define PWM_Duty    (Duty * Xtal)/(Freq * (1/PS))  

void main(void) {

    TRISC = 0;

    OpenTimer2(TIMER_INT_OFF & T2_PS_1_1 & T2_POST_1_1);
    OpenPWM1(PWM_Freq);         // PWM Frequency output
    SetDCPWM1(PWM_Duty);        // PWM Duty Cycle
    while (1);
}

Saludos...

Desconectado willynovi

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 546
Re: PWM en C18
« Respuesta #2 en: 19 de Diciembre de 2012, 19:07:51 »
Del datasheet salen otras ecuaciones para el calculo, fijate en la sección 15.4.1 y 15.4.2

Lo que tu nombras con Xtal en realidad es la FOSC, para tu caso es el mismo valor porque usas un cristal de 12Mhz, pero en realidad esos 12MIPS (Millones de instrucciones por segundo) salen de dividir el reloj interno por 4 (4 son los ciclos que lleva cada instrucción)

El reloj interno para la configuración que tienes es 48Mhz, por lo que 48/4=12
Intento enseñarte a pescar, si solo quieres pescados, espera que un pescador te regale los suyos.


 

anything