 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
vesko Neznanec

Pridružen-a: Pet 23 Mar 2012 22:10 Prispevkov: 1 Aktiv.: 0.01
|
Objavljeno: Ned Mar 25, 2012 1:31 am Naslov sporočila: perioda PWM |
|
|
Pozdravljeni
Delam diplomo in sem naletel na težavo, zato bi vas prosil za pomoč.
Izdelujem aplikacijo segrevanja organskih topil in želim vključevati grelec oz. regulirati temp. z PWM. Problem se pojavi pri nastavitvi periode PWM namreč ne morem je nastaviti na 1 ali 2 s.
Uporabljam DSpic30F4011 in SSR (Solid State Relay) SHARP S202S20.
Izračuni so naslednji: quarz=10 Mhz PLL=8
Fosc=10^6 * 8 = 80 Mhz
Fcy=Fosc / 4= 20 Mhz
PTPER- period register
Fpwm= 1 Hz
PTPER= (Fcy / Fpwm*(PTMR_prescaler))-1
PTPER=312499
postavljeni registri:
PTCONbits.PTEN = 1; enable bit
PTCONbits.PTCKPS = 0b11 prescale value 64
PWMCON1 = 0xF01 RE0 pin pwm out ostali so GPIO
PWMCON2 = 0x0000;
PTPER= 312499;
PTMR = 0x0000; start timer
Dolžina periode kljub po moje pravilnim nastavitvam in izračunom in preizkušanjem ne preseže 100 ms oziroma 10 Hz kar je absolutno prekratko. Frekvenca PWM bi morala biti vsaj 1 Hz oz 0.5 Hz. Preizkusil sem tudi s spreminjanjem prescalerja in post scalerja ampak ne zaleže.
Hvaležen bom za vsako pomoč
Hvala in lepo se imejte
P.S če sem karkoli pozabil dopisati mi sporočite, lahko dodam tudi program in izračune, ki sem jih sedaj simbolično zapisal. _________________ LP marko |
|
Nazaj na vrh |
|
 |
gregoral Član

Pridružen-a: Pet 24 Nov 2006 9:42 Prispevkov: 688 Aktiv.: 3.04 Kraj: Ljubljana
|
Objavljeno: Ned Mar 25, 2012 2:51 am Naslov sporočila: |
|
|
DSpic30F4011 sicer ne poznam, zato ne vem ali je možno sam PWM modul nastaviti kot želiš.
Ampak ker je perioda (1s) kar se tiče uC zeeeeeeelo dolga imaš seveda možnost da:
- na kratek interval (interrupt) povečuješ sistemski čas (10 ms recimo)
- iz main funkcije nato kličeš "MyPWM" funkcijo
- MyPWM funkcijo implementiraš tako da si v statično spremenljivko zapomni kdaj mora zamenjat stanje pina
Recimo nekaj v tem stilu:
Koda: |
static int next_pwm_time = 0;
void MyPWM()
{
int t = sys_time;
// return if PWM is turned off or too soon to switch
if(0 < next_pwm_time && t < next_pwm_time) return;
// if(pinz is on)
if(portx & pinz)
{
// switch pinz off
portx &= ~pinz;
// set next switch time
next_pwm_time = t + off_time;
} else
{
// switch pinz on
portx |= pinz;
// set next switch time
next_pwm_time = t + on_time;
}
} |
pomembno je da si v funkciji MyPWM na začetku zapomniš sys_time (ta mora bit deklariran kot volatile)
to pa zato da čas izvajanja MyPWM ne podaljšuje pwm periode
no sicer ker je perioda v tvojem primeru dolga 1s, potem je verjetno vseeno in lahko povsod uporabiš kar sys_time, ki se med izvajanjem MyPWM lahko spremeni |
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 494 dni
Powered by phpBB © 2001, 2005 phpBB Group
|