Sari la conținut
ELFORUM - Forumul electronistilor

Control Servomotor cu PIC 18F4455


Postări Recomandate

Buna ziua!

 

Nu reusesc sa fac un PWM pentru controlul unui servomotor. Dupa cum se stie servomotorul functioneaza la o frecventa de 50Hz care inseamna in timp perioada de 20ms si cu impuls de aprox 1ms pentru unchi de 0 grade respectiv 2ms pentru 180 grade. Cu PIC18F4455 nu pot genera un astfel de PWM decat cu intarzieri ceea ce nu-mi convine ca tine microcontrolerul ocupat in acel timp. Ma poate ajuta cineva cu o solutie mai eleganta?

Codul facut de mine cu intarzieri:

void servoRotate0() //0 grade{    unsigned int i;    for(i=0;i<50;i++)    {       PORTB.F0 = 1;       Delay_us(800);       PORTB.F0 = 0;       Delay_us(19200);    }}void servoRotate90() //90 grade{    unsigned int i;    for(i=0;i<50;i++)    {        PORTB.F0 = 1;        Delay_us(1500);        PORTB.F0 = 0;        Delay_us(18500);    }}void servoRotate180()   //180 grade{    unsigned int i;    for(i=0;i<50;i++)    {        PORTB.F0 = 1;        Delay_us(2200);        PORTB.F0 = 0;        Delay_us(17800);    }}void main(){  TRISB = 0; // PORTB iesire  do  {     servoRotate0(); //0 grade     Delay_ms(2000);     servoRotate90(); //90 grade     Delay_ms(2000);     servoRotate180(); //180 grade  }while(1);}

Va mltumesc!

Link spre comentariu
  • Răspunsuri 9
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Zile populare

Top autori în acest subiect

Salut,

 

Ai incercat sa folosesti modulul Capture/Compare/PWM ?

Modul PWM e in sectiunea 15.4 din foaia de catalog. Ai registre separate pentru perioada si factor de umplere. Odata programate registrele, procesorul isi poate vedea de alte treburi.

 

Se mai poate face cu intreruperi, dar daca tot ai modulele hardware, de ce sa nu le folosesti?

 

Bafta!

Link spre comentariu

E greu de coborat la 50Hz ca sa folosesti PWM hardware. Daca ajungi la 20ms, cum vei regla DC intre 5 si 10% cat mai fin.Cel mai sigur cu intreruperi bazate pe incrementarea unui timer.Dar eu nu mi-as face griji prea multe pentru intarzierile folosite. Servo accepta o plaja larga in jurul celor 50Hz. Probabil +/-5Hz. Deci pe durata celor 18ms de pauza poti face multe operatii care nu vor dura prea mult (sa zicem 1÷2ms, ceea ce reprezinta o groaza de operatii in PIC). Asta daca alte operatii nu sunt sensibile la executarea lor la fiecare 20ms.Incearca dupa cum ti-am sugerat si vezi daca esti multumit.@cirip, stiu ca esti pasionat de RC. Macar principial, poti da mai multe detalii despre sugestia ta din primul paragraf? E in legatura cu primul meu paragraf din mesajul curent.

Link spre comentariu

Domnule  @crip am incercat sa folosesc modulele CCP, dar la un oscilator de 20Mhz nu pot obtine decat o frecventa minima de aproximativ 1220Hz. In legatura cu postscalerul, trebuie sa-l studiez sa vad la ce se refera si intre timp voi incerca varianta cu intreruperi si un timer.

Va multumesc pentru raspunsuri!

Link spre comentariu

foloseste o intrerupere legata de un timer, in care sa faci toggle la pin

 

void interrupt ISR(void)
{
    if(TMR2IE && TMR2IF)            //TMR2 interrupt handler
    {
        TMR2IE=0;
        TMR2IF=0;
        LATA2 = !LATA2;
    }
}
Editat de deejay2k1
Link spre comentariu

Da, cred ca aveti dreptate; frecventa de ceas e prea mare ca sa puteti scoate direct cei 50Hz cu factor de umplere asa de mic. A trecut multa vreme de cand m-am jucat cu asa ceva.

 

Cred ca ramane totusi ideea cu intreruperi combinate cu modulul CCP. Probabil ca 1-2 ms se pot obtine cu o rezolutie de , sa zicem, 2us. Restul de 19ms se pot obtine prin numararea a 19 intreruperi de 1ms. Ceva de genul asta. Totul gestionat de o mica masina de stari (niste flaguri) care spune in ce stare e rutina respectiva, ce intarziere trebuie reprogramata si ce trebuie sa scoata la pin.

 

Din pacate timpul nu imi permite sa va ajut direct cu cod functional.

 

Cirip

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări