Vizitator koss20vl Postat Mai 24, 2010 Partajează Postat Mai 24, 2010 Salut tuturor,Am o problema... incerc sa controlez prin intermediul unui microcontroller dspic30f4011 un motor servo, towerpro mg996R. Am incercat sa il controlez prin intermediul PWM`urilor, mai exact pe portul 37 (PWM1H/RE1) al microcontrollerului pe care il am la dispozitie. Am incercat mai multe variante, ultima dintre ele fiind urmatoarea:/*****************************************************************************************/#include "p30f4011.h" _FOSC(CSW_FSCM_OFF & XT); _FWDT(WDT_OFF); _FBORPOR(PBOR_OFF & MCLR_EN & PWRT_OFF & PWMxH_ACT_HI); _FGS(CODE_PROT_OFF); #define FOSC 4000000 //oscilatorul meu este pe 4mhz#define FCY (FOSC / 4) // 1 inscruction cycle = 4 clock cyclesint main(void){ Init_PWM(); while(1) { PDC1 = 3333; }}void Init_PWM(void){ PTCONbits.PTEN = 0; PWMCON1bits.PEN1H = 1; PTCONbits.PTCKPS = 1; PTCONbits.PTOPS = 0; PTCONbits.PTSIDL = 1; PTCONbits.PTMOD = 0; PTCONbits.PTEN = 1; PTPERbits.PTPER = 11250; } /*****************************************************************************************/Sunt oarecum incepator... am mai lucrat ceva cu microcontrollere, dar este prima oara cand incerc sa folosesc Pulse Width Modulation, sau un motor cu actionare servo. Unde este problema? Imi poate spune cineva ce am gresit, sau ce am omis, sau ce trebuie adaugat pentru a pune in miscare acest motor? Multumesc anticipat! Link spre comentariu
Liviu M Postat Mai 25, 2010 Partajează Postat Mai 25, 2010 Poate ar fi mai bine sa tac, ca n-am folosit nici dsPic nici PWM si sunt sanse sa spun prostii, da'...Din cate stiu, PWM-ul are asociat un timer care trebuie si el programat corespunzator (din cod mie mi se pare ca nu faci nimic cu timerele, da' poate ma insel). Mai ales ca, tot din cate stiu eu de la picurile 16F/18F, timerele sunt multiplexate si trebuie "alocate scopurilor". Link spre comentariu
puiu Postat Mai 25, 2010 Partajează Postat Mai 25, 2010 1. Din pacate eu lucrez in ASM si nu in C, dar am o intrebare: Ce fel de motor servo este cel folosesti tu? Este de curent continuu, este pas cu pas sau de alternativ?2. Intrebarea poate sa fie deplasata, dar nu cunosc acel tip de motor si nici nu ai facut precizarea de ce ai trecut la microntrolere pe 16 biti, in speta la familia dsPIC30F4011, avand in vedere ca nu folosesti decat un pin pentru modulare. Dupa cum stiu eu acel microcontroler poate comanda motoare pe PMV, care se seteaza pana la 10 biti, exact ca cele din familia PIC16Fxxx sau PIC18Fxxx, care sunt pentru date pe 8 biti. Ar trebui sa fie motorul in curent continuu si sa-l folosesti intr-un singur sens pentru ca nu ai utilizat numai un pin si atunci se pune intrebarea ai spus microcontrolerului acest lucru? Adica, l-ai setat corespunzator? Link spre comentariu
Liviu M Postat Mai 25, 2010 Partajează Postat Mai 25, 2010 Cred ca e vorba de un servo in genul celor de modelism, care se comanda pe un singur fir, prin pulsuri de lungime diferita (PPM ?) - 1 ms stanga (sau dreapta, nu conteaza), 2 ms dreapta (sau stanga), 1.5 ms centru - cu o "perioada" de 20 ms. In cazul asta, cred ca o iesire PWM e tot ce trebuie. Link spre comentariu
puiu Postat Mai 25, 2010 Partajează Postat Mai 25, 2010 1. Daca este vorba de un servo comandat clasic cu comanda proportionala nu este necesar sa folosesti dsPIC39F4011. In acest caz va trebui sa ai o intrare in microcontroler care sa-ti spuna ce fel de semnal ai la intrare, adica este mai mare de 1,6ms sau mai mic si atunci trebuie motorul sa-l comanzi in H pentru ca trebuie sa mearga si inainte si in inapoi. Aces tip de comanda se numeste proportionala si simultana, deoarece impulsurile unui canal revin dupa 20 ms. Marimea unui impuls este de la 1,1 ms la 2,1 ms sau altfel spus 0,5 ms este domeniul maxim de variatie. De obicei comanda radio da la receptor acest semnal. Link spre comentariu
Liviu M Postat Mai 25, 2010 Partajează Postat Mai 25, 2010 Cred ca esti in "partea cealalta" a problemei. Eu cred ca el are servoul "capsulat" si incearca sa genereze comanda aia proportionala, cum o numesti tu.Sau?Las' ca vine el si ne spune la un moment dat cum e de fapt. Link spre comentariu
Vizitator koss20vl Postat Mai 25, 2010 Partajează Postat Mai 25, 2010 O sa incerc sa va raspund tuturor, printr`un singur mesaj. Nu am ales calea aceasta... mi s`a cam impus.. mi s`au pus in fata microcontroller`ul si motoarele servo. In legatura cu motoarele, au 3 fire, 2 pentru alimentare, al 3`lea intra pe un pin al microcontroller`ului(al treilea este pentru semnal). Am reusit sa pun motoarele pe un osciloscop... si stiu ca pentru 3.8% dutycycle imi duce axul servoului in pozitia de minim, iar pentru 11.2 % din dutycycle, se duce in pozitia de maxim. Am incercat multe variante,si pana la urma, cu codul urmator, am reusit sa misc axul motoarelor pe 90 de grade. eu am insa nevoie de unghiul maxim. Am urmat pasii dintr`un tutorial gasit pe net, cu ajutorul caruia am calculat toate cele...si asta a fost cel mai bun rezultat obtinut pana acum. Daca stie cineva cum pot introduce direct valoarea dutycycle`ului pe pinul de semnal al servourilor, sau ce anume am gresit si unde... va rog sa`mi spuneti. codul:////////////////////////////////////////////////////////////////////////////////////////////////////////#include "delay.h"#include "p30f4011.h" // Include this in your MPLAB project under "Header Files" from C:\Program Files (x86)\Microchip\MPLAB C30\support\dsPIC30F\h // And include the p30f4011.gld linker script under "Linker Script" from C:\Program Files (x86)\Microchip\MPLAB C30\support\dsPIC30F\gld/*************************************** Configure Fuses ***************************************/_FOSC(CSW_FSCM_OFF & XT); // Disable clock monitor, external 10MHz oscillator_FWDT(WDT_OFF); // Disable Watch-Dog Timer._FBORPOR(PBOR_OFF & MCLR_EN & PWRT_OFF & PWMxH_ACT_HI); // Brown out reset disabled, enable MCLR reset pin, turn off power-up timer, PWMxH acts high_FGS(CODE_PROT_OFF); // Disable Code Protection/*************************************** Oscillator Calculations ***************************************/#define FOSC 4000000 // 10Mhz//4mhz#define FCY (FOSC / 4) // 1 inscruction cycle = 4 clock cycles/***************************************************** Function: int main(void) ** Purpose: program entry point ** Description: This is where the main loop resides. *****************************************************/void Init_PWM(void){ /**** PTCON: PWM Time Base Control Register ****/ PTCONbits.PTEN = 0; // Timer Enable bit: DISABLE MCPWM PWMCON1bits.PEN1H = 1; // PWM1H (pin 37) is enabled for PWM output PWMCON1bits.PEN2H = 1; // PWM2H (pin 35) is enabled for PWM output PTCONbits.PTCKPS = 1; // Input Clock Prescale bits: 1:4 PTCONbits.PTOPS = 0; // Output Clock Postscale bits: 1:1 PTCONbits.PTSIDL = 1; // Stop in Idle Mode: YES PTCONbits.PTMOD = 0; // Mode Select bits: Free Running Mode PTCONbits.PTEN = 1; // Timer Enable bit: ENABLE MCPWM /**** PTPER: PWM Time Base Period Register ****/ PTPERbits.PTPER = 4500; // } int main(void){ Init_PWM(); unsigned int i; i=10; while(i) { DelayMs(1000);//aici astept 1000 ms PDC1 = 1000; // din cate am inteles din tutorial, aici ar trebui introdusa valoarea pentru full forward...unghiul maxim PDC2 = 1000;//valoare care mie mi-a iesit 1000... DelayMs(1000);//aici astept 1000 ms PDC2 = 500;//aici valoarea minima, pentru a aduce axul motorului in pozitia de start... PDC1 = 500; i--; }//while}//main ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////nu stiu sigur daca 4 mhz e frecventa dspic`ului 30f4011, cel putin asa am inteles..Orice sugestie/cod e binevenita... orice mustrare, orice tip de lamurire:P nu ma supar daca va bagati tare in mine, nu am experienta necesara inca in domeniu.Am atasat si o poza cu tipul motoarelor servo folosite. Link spre comentariu
Liviu M Postat Mai 25, 2010 Partajează Postat Mai 25, 2010 Cumva-cumva am pierdut tot ce am scris. Vezi ca ai mai sus explicata comanda "motoarelor" astora. Nu stiu daca stii, da' 90° sunt, in functie de model, cam unghiul maxim. Cele cu care m-am jucat eu aveau ceva mai mult de 45° stanga - dreapta fata de pozitia centrala. In pozitita centrala ajungi cu un numar de pulsuri de 1,5ms lungime repetate la 20 ms, in stanga mergi cu pulsuri de 1 ms, in dreapta cu pulsuri de 2ms. Cum nu mi se pare ca folosesti partea PWM prea intens, mai bine o faci de mana - in functie de directia dorita, tii iesirea in "1" 1ms, 1.5ms sau 2ms, faci iesirea "0" pentru 20 ms si repeti operatia pana ajungi in pozitia dorita. LE Frecventa la care lucreaza PICul e frecventa quarzului/rezonatorului legat la el. LLE In postul asta am pus codul cu care misc eu, cu ajutorul unui 12f508, un servo. Nu ma intereseaza prea multe fineturi, asa ca e un cod urat, da' la mine functioneaza. Link spre comentariu
coco243 Postat August 28, 2010 Partajează Postat August 28, 2010 Salut, de unde ti-ai luat microcontroleru' asta, vreau sa iau si eu unu Link spre comentariu
Vizitator sebustab Postat August 31, 2010 Partajează Postat August 31, 2010 Salut. Daca te uiti in foaia de catalog a dsp'ului ai sa vezi ca el contine si un modul de simple PWM. Capitolul 13.0 Output Compare. Eu am folosit un dsPIC30F3013 pt a genera semnal PWM pt comandarea unui motor de curent continuu. Am sa-ti pun bucati de cod.void init_PWM(void){ OC1CON=0; //; Turn off Output Compare 1 Module. //; Initialize Duty Cycle to 0x0060 OC1RS=250 ; //Write duty cycle buffer register //; Write OC1R to initial duty cycle value OC1R=250;// ; Load the working register with the new duty cycle OC1CON=6; //; compare mode and write to OC1CON // Initialize PR2 with 565 PR2=512 ; T2CONbits.TON=1;}Iar pentru a modifica factorul de umplere folosesti : OC1RS="valoare pentru PWM"; //modifica duty cycle T2CONbits.TON=1; //se reactiveaza Timer2Desigur tu trebuie sa calculezi, in functie de ce frecventa vrei pt PWM, ce frecventa are oscilatorul tau, valorile pentru OC1RS, PR2, prescalerul pentru Timer in caz ca ai nevoie, toate aceste calcule si functionare le gasesti explicate la capitolul 13.4.2 din foaia de catalog. E mult mai simplu sa folosesti modulul simple PWM. Link spre comentariu
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum