DigiLAB  corfu
  • Start page
  • Βοηθηματα >>
    • Links
    • Βοηθήματα
  • Projects >>
    • Projects
    • Παραδείγματα περιφερειακών μ/ε PIC >
      • Κατάλογος
      • WDT
      • TIMER 0
      • TIMER 1 και 2
      • TIMER 3
      • INTERRUPTS
      • SLEEP
      • CCP CAPTURE
      • CCP COMPARE
      • CCP PWM
  • Photo Gallery

CCP_PWM



#include <18F2550.h>
#FUSES NOWDT, INTRC_IO, NOPUT, NOMCLR                  
#DEVICE ADC=8
#use delay(clock=4M)

void main()
{
   int a=0;
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_2(T2_DIV_BY_1,255,1);
   setup_ccp1(CCP_PWM);
   setup_adc(ADC_CLOCK_DIV_16 );
   setup_adc_ports(AN0);
   While (1)
   {
      a=read_adc();
      set_pwm1_duty(a);
   }
}


Picture
Picture

το κύκλωμα της δοκιμής

Picture
Η συχνότητα του pwm καθορίζεται από την τιμή του καταχωρητή PR2 (του timer2)  με PWM period=(PR2+1)*4*Tosc*(TMR2 prescaler value)                                                 
ή  PWM period=(PR2+1)*Tcy*(TMR2 prescaler value) και φυσικά η συχνότητα του είναι
PWM freq=1/PWM period.

To Duty cycle μπορεί να είναι 8 ή 10 bit (σαν μέγιστο) αλλά όσο η συχνότητα ανεβαίνει η ανάλυση του πέφτει (μικραίνοντας τον PR2 όχι τον prescaler),

PWM max resolution (σε bit)=log(Fosc/Fpwm) / log(2),

έτσι λοιπόν είναι ποιο εύκολο να χρησιμοποιούμαι τιμή του PR2 ίση με 255 και 8 bit ανάλυση,

αν όμως χρειαστεί 10bit ανάλυση και PR2 κάτω από 255 τότε ο υπολογισμός του γίνεται με:

duty cycle=Τιμή / [4*(PR2+1)]      ή

Τιμή (για 100% duty cycle)=4*(PR2+1)

πχ. PR2=150 και duty cycle (με 10bit ανάλυση)=604 θα μας δώσει

604/(4*151)=1 => 100% duty cycle

αν θέλαμε 50% τότε θα χρειαζόμασταν τιμή duty cycle 604*0,5=302.

Στο ποιο πάνω παράδειγμα ορίζω τον ADC σαν 8bit και την τιμή του την δίνω στον duty cycle register που γίνεται και αυτή 8bit (*) και έτσι μας δίνει από 0% έως 100% ρυθμίζοντας το ποτενσιόμετρο από την αρχή έως το τέλος του, η συχνότητα του είναι 3906Hz.

(*) Στον compiler ορίζεται αυτόματα από default είναι 8bit και αν του βάλεις 10bit αλλάζει (όταν ορίζουμε κατευθείαν την τιμή στην συνάρτηση του set_pwm1_duty() και είναι μικρότερη από 255 ενώ εμείς θέλουμε 10bit ανάλυση τότε το κάνω έτσι set_pwm1_duty(150L), με το L στο τέλος την μετατρέπει σε long 16bit)


Κατάλογος
Powered by Create your own unique website with customizable templates.