#!/usr/local/bin/php pwm

pwm.c

//arlotto 2006 : Démonstration d'utilisation
//de la pwm par le module CCP1 (sortie sur RC2)
// S3 produit un signal 4Khz 50% sur RC2 (pwm1)
// S2 produit un signal 4Khz 25% sur RC2 (pwm1)
// on peut l'entendre sur la carte picdem+
// en plaçant le cavalier J9
// Calcul de la période : PWMPeriod = (N+1).4.Tosc.Ktrm2
// Ktrm2 = rapport de division du timer 2
// avec Ktmr2=1 et Fosc = 4 Mhz on a :
// Pour 4kHz PWMPeriod = 0.25ms = (N+1).4.0.25us
// d'où N = 249
// Rapport cyclique : Pour 50% => Temps à l'état haut = 0.125ms
// d'où 0.125ms = = R . Tosc = R . 0.25us  => 500
// Pour 25% => R = 250
// En fait 100% correspond à 4.(N+1)  =>
// R = (pourcentage entre 0 et 100) . 4(N+1)/100
// On passe N à la fonction OpenPWM1()
// On passe Ktmr2 à la fonction OpenTimer2()
// Ensuite on peut changer le rapport cyclique en passant
// R à la fonction  SetDCPWM1()
 
#include <p18cxxx.h> 
#include <pwm.h>   // pour fonctions pwm
#include <timers.h> // pour fonction timer2
 
// configuration PICDEM2+ quartz
#pragma config OSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config PBADEN = OFF
 
#define BtnS3   PORTBbits.RB0
#define BtnS2   PORTAbits.RA4
 
#define R50 500  // 50%
#define R25 250  // 25%
#define R0  0    // 0%
#define N   249  // 4Khz à Fosc =4Mhz
 
void main(void){
 
OpenPWM1(N);
OpenTimer2(TIMER_INT_OFF &
           T2_PS_1_1 );
 
for( ;; )
{
   if(BtnS3 == 0 ) {
        SetDCPWM1(R50); }
   else {           
      if(BtnS2 == 0 ) {
           SetDCPWM1(R25); }
      else {
            SetDCPWM1(R0); }
} }
}