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);
}
}
το κύκλωμα της δοκιμής
Η συχνότητα του 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)
ή 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)