PWM laikotarpį abejonių

E

Eraser

Guest
Labas.

Im daro projektą, su pic 16f877a, man reikia pwm funkcija, tačiau su specifikacija formulė max pwm laikotarpis 4MHz OSC.yra 4ms, ir man reikia 20ms, kad i dont know how can I gauti 20ms, kaip galima i adjuste už 20ms ?????

formulė yra tokia:
PWM laikotarpį = [(pr2) 1] 4 TOSC (TMR2 prescale vertė)

 
Aparatinė PWM blogai tinka valdyti servo variklis.Ar tai programinė įranga.

 
20mS ar 50Hz pwm laikotarpis yra labai lėtas.Pernelyg lėtas naudoti pwm modulis!
Aš neseniai buvo panaši problema ir jos išspręsti naudojant 1mS laikmatis nutraukti.

Have a gobal muitą ir laikotarpį kintama ir logiška veikti vėliava.

Galite ją naudoti, pavyzdžiui, taip:Kodas:/*--- Globalus kintamųjų ---*/Bool veikia = true;

unsigned char muitas = 10;

unsigned char laikotarpį = 20;/*--- 1mS intrrupt ---*/tuščia nutraukti isr (tuščia)

(

statinio unsigned char pwmclock = 0;jei (T0IF == 1)

(

jei (rodyti)

(

jei (pwmclock <muitas) (

PWM_OUT = 1;

)

else (

PWM_OUT = 0;

)jei (pwmclock <laikotarpis) (

pwmclock ;

)

else (

pwmclock = 0;

)

)

else (

PWM_OUT = 0;

)T0IF = 0;

)

)
 
Ok ačiū kabinoje.i will try į programinę įrangą, ir bet boubt i paštu.

 
use the PWM module to generate a longer (lower frequency) period by breaking up the period into shorter PWM "frames" and using an interrupt driven software "helper" to load the correct duty cycle value for each upcoming "frame".

Galite
naudoti PWM modulis generuoti ilgiau (mažesnis dažnis) laikotarpį išardymas laikotarpį į trumpesnį PWM "rėmai" ir naudojant nutraukti varoma įranga "pagalbininkas" įkelti teisinga ciklo vertė kiekvienai Būsimi "frame".Šis metodas gali suteikti daug didesnes rezoliucijos nei būtų gauti, jei jie galėtų pritaikyti PWM modulis 20 ms laikotarpį.

Štai pavyzdys iš ISR "pagalbininkas" kodas 16 arba 4 MHz, Laikrodžiai (prescaler 16 ir 4, atitinkamai), kad numatyta 1 usec impulso pločio rezoliucijos nuo 0 iki 20000 usecs);

Regards, Mike

Kodas:

;************************************************* *****************

;

/ / Konfigūruoti 1000 usec PWM laikotarpio pr2 = 249 ir prescaler

/ / 16:1 (16 MHz clock) 20 PWM "rėmai" per 20 ms servo

/ / Laikotarpį ir 1 usec impulsų plotis rezoliucijos

;

; Int servo = 1500 / / 0 .. 20000 1 usec veiksmus

; Int plotis = 0; / / ISR darbo kintamasis

; Int rėmo = 1; / / rėmo numerį 1 .. 20

;

; Tuščia ISR ()

; (PIR1bits.TMR2IF = 0; / / aišku, Laikmatis 2 pertraukti vėliava

; K - / /

If (rėmas == 0) / / jei pasibaigus 20 ms laikotarpis

; (Rėmo = 20 / / atkurti naujų 20 ms laikotarpis

, Plotis = servosekos / / atkurti "plotis" darbo kintamasis

;)

If ((plotis 1000) / / jei plotis 1000 usecs

; (CCPR1L = 250 / / do 100% ciklo rėmas

; CCP1CONbits.CCP1Y = 0; / /

; CCP1CONbits.CCP1X = 0; / /

, Plotis -= 1000; / / atimti 1000 usecs

;)

; Kita

; (CCP1CONbits.CCP1Y = (plotis & 1);

; CCP1CONbits.CCP1X = (plotis ir 2);

; CCPR1L = (plotis>> 2); / / 0 .. 249 (0 .. 999 usecs)

;      width = 0;              // force remaining frames to 0%
;)

;)

;

 

Welcome to EDABoard.com

Sponsor

Back
Top