Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

PIC18F4431 pwm nie działa prawidłowo powyżej 1,2kHz

draco2 21 Lip 2010 13:46 1597 5
  • #1 21 Lip 2010 13:46
    draco2
    Poziom 8  

    Witam,

    Uzywam PIC18f4431 do sterowania silnika DC za pomoca PC PWM. W programie sterujacym zmieniam dynamicznie szerokosc impulsu od 0% do okolo 80% wypelnienia. Wszystko dziala dobrze ale tylko do czestotliwosci PWM 1.2 kHz a jak zwieksze czestotliwosc - dla kazdego wypelnienia powyzej 50% mam na wyjsciu 100% zamiast zadanego.Probowalem juz z roznymi kwarcami i wewnetrznym kwarcu ale caly czas jest tak samo:( probowalem tez na 2 roznych Pic-ach ale bez zmian.
    Czy moze ktos sie spotkal z tym problemem?
    Zgory dzieki za pomoc

    Pawel

    inventco.eu - temat poprawiłem. Regulamin p.11.1

    0 5
  • #2 22 Lip 2010 07:09
    Doktor_UC
    Poziom 9  

    Myślę, że analiza programu pomoże. Przeczytałem, że kolega testował różne sposoby taktowania układu. A przy jakim oscylatorze program testowany jest najczęściej?

    0
  • #3 22 Lip 2010 23:46
    draco2
    Poziom 8  

    Witam,
    dzięki za odpowiedź,
    Program jest zazwyczaj testowany przy taktowaniu 20MHz ale testowałem z 8MHz i 32MHz wewnętrzny oscylator i to samo - limitem jest ta sama częstotliwość :( Normalnie przy 20MHz powinno się dać nawet do 300KHz według noty technicznej. Testowałem do 9.6KHz i z wypełnieniem do 50% działa ta częstotliwość ale jak zwiększę wypełnienie to już nie
    Poniżej zamieszczam procedurę inicjacyjna z wypełnieniem 0% potem jest zwiększane wypełnienie w programie.

    Code:
    void initPWM(void)
    
    {
    PDC0L=0x00;//set to zero as no output - motor stopped
    PDC0H=0x00;//jesli mniej to mniejsze wypelnienie przy 0xfff jest 1/4 przy 0x3fff jest caly czas 5V na wyjsciu
    //przy  0x2fff jest okolo 75% wypelnienia
    PWMCON0=0;
    OVDCOND=0xff; //niepotrzebne
    PTCON0bits.PTMOD1=1; //for continues mode //if both disabled dziala if enabled tylko dziala z mala czestotliwoscia
    PTCON0bits.PTMOD0=1; // single shot mode //if both enabled continuous up/down mode
    PWMCON0bits.PWMEN2=0; //pwm1 and  3 enabled
    PWMCON0bits.PWMEN1=1;
    PWMCON0bits.PWMEN0=1; //on reset is 1 so it has to be changed to 0 to disable other PWMs
    PWMCON0bits.PMOD1=1; //pwm2,3 independent
    PWMCON0bits.PMOD0=1; //pwm0,1 complimentary mode
    PWMCON1=0;
    PTPERL=0xff; // frequency of PWM period 12bit register max value:0x0fff  then minimum frequency
    PTPERH=0x0f; 
    DTCON=0x02; //small deadtime 200ns@20MHz
    FLTCONFIG=0x80; //disable pwm fault detection f
    }


    niektóre komentarze nie są zgodne z ustawieniami:) zbyt częste zmiany

    0
  • #5 24 Lip 2010 07:32
    Doktor_UC
    Poziom 9  

    Draco2 przedstawił funkcję startującą PWM. Ja bym raczej upatrywał błędu gdzieś w dalszej części programu. Jak wiadomo, przy obsłudze zwykłego PWM Microchip umieszcza notatkę

    Cytat:

    If the PWM duty cycle value is longer than the PWM period, the CCP1 pin will not be cleared.

    Ja łamię sobie głowę, czy w przypadku draco2 nie miałaby ona zastosowania.

    0
  • #6 24 Lip 2010 20:19
    draco2
    Poziom 8  

    mpietras napisał:
    może problemem jest nierezystancyjny charakter obwodu sterowanego, albo tranzystor jakiś lewy


    Niestety nie bo bez podłączenia mostka sterującego jest zły sygnał PWM generowany:(

    Dodano po 16 [minuty]:

    Doktor_UC napisał:
    Draco2 przedstawił funkcję startującą PWM. Ja bym raczej upatrywał błędu gdzieś w dalszej części programu. Jak wiadomo, przy obsłudze zwykłego PWM Microchip umieszcza notatkę
    Cytat:

    If the PWM duty cycle value is longer than the PWM period, the CCP1 pin will not be cleared.

    Ja łamię sobie głowę, czy w przypadku draco2 nie miałaby ona zastosowania.

    Dzięki za uwagę ale używam PCPWM a nota dotyczy zwykłego PWM.
    bardziej dokładnie program działa tak - Do Pica-a są podłączone dwa przyciski i w zależności który naciśnięty obraca silnik w zadaną stronę. Po naciśnięciu przycisku ustawiony jest jeden pin definujący kierunek obrotu silnika i
    wykonywane jest poniższa procedura:

    void change_smooth_dcycleupPWM(void) //increasing duty cycle - starting motor
    {
    change_dutycyclePWM(0x00ff);
    Delay10KTCYx(100*2);//delay 100ms multiplied by 2 to get right delay (50ns*10k*2=1ms)
    change_dutycyclePWM(0x0fff);
    Delay10KTCYx(190*2);
    change_dutycyclePWM(0x1fff);
    Delay10KTCYx(180*2);
    change_dutycyclePWM(0x2f00);
    Delay10KTCYx(180*2);
    change_dutycyclePWM(0x2fff);
    }
    odwołuje sie do tej:
    void change_dutycyclePWM(unsigned int newdutycycle)
    {
    PWMCON1bits.UDIS = 1; //disable updates from duty cycle and period buffers
    PDC0L = newdutycycle; //change duty cycle
    PDC0H = (newdutycycle >>8) & 0x3f; //14bit register
    PWMCON1bits.UDIS = 0; //enable updates back
    }
    To jest zaimpementowane aby zmniejszyć prąd potrzebny do rozruchu silnika (poprawić płynnność sterowania stopniowo zwiekszajac napiecie na silniku)
    Praca magisterska:)

    0