Sari la conținut
ELFORUM - Forumul electronistilor

PIC16F690


Postări Recomandate

La o varianta cu folosirea unei iesiri PWM (hard) te-ai gandit?Setezi perioada PWM la 20 ms si modifici factorul de umplere in functie de valoarea ADC.N-am nici un cod, dar n-ar trebui sa fie chiar asa complicat, ai formule pentru perioada si factor de umplere in data-sheet. Avantajul e ca nu modulul PWM lucreaza 'singur', tu trebuie sa-l accesezi doar cand modifici factorul de umplere.

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

Top autori în acest subiect

Top autori în acest subiect

Vizitator iulianvalentin

Am incercat acum ceva vreme cu un cristal de 4MHz si nu merge pentru ca nu va cobora pana la frecventa dorita trebuie folosit oscilatorul intern la frecvente mai mici. Trebuie ca frecventa de lucru sa fie sub 1MHzSi ar mai fi o problema cu rezolutia, un servo lucreaza cu 10% din toata plaja care poate fi setat pentru 100 de unitati (pasi) la un PWM de 10 biti sau 25 de unitati (pasi) pentru unul de 8 biti.

Link spre comentariu

Da, ai dreptate, nu merge cu PWM hard (n-am aut niciodata nevoie de frecvente asa mici, nu m-am gandit ca n-o sa mearga).Mie rezolutia imi da chiar mai rea. La un PWM pe 10 biti (atat are picul in discutie) mie imi dau ~19.5 us / pas. La o "zona utila" de 1400 us - 1500 us (~850 us stanga, ~2200 us dreapta) ies ~70 de pasi. Pe de alta parte servourile cu care m-am jucat eu se misca aproximativ 90..100°. La 70 de pasi ies cam 1.4° pe pas. Daca in aplicatia de fata e suficient sau nu, n-am de unde sa stiu.

Link spre comentariu
Vizitator iulianvalentin

Eu vreau sa imi fac un hexapod si am procurat circa 10 servomotoare din care am facut doua picioare si mai am 4, costurle nu sunt deloc de neglijat dar sper ca anul acesta sa il termin si problema (dilema) actuala este realizarea unui controler cu 20 de canale minim, problema ar fi cea de fata datorata limitei inferioare iar ca sa reduci frecventa de lucru atat de mult pierzi din puterea de calcul.

Link spre comentariu

In data-sheet la pwm e o caseta cu o nota despre tmr2 postscaler.In nota se mentioneaza ca postscalerul nu e folosit pentru perioada pwm si ca poate fi folosit pentru sincronizarea unui servo la alta frecventa (sau ceva similar, n-am data-sheetul in fata).Poate se poate folosi prescalerul (tmr2if) pentru activarea iesirii pwm la 20 fiecare 20 ms si folosi iesirea pwm la frecvente mai mari?

Link spre comentariu
Vizitator iulianvalentin

In data-sheet la pwm e o caseta cu o nota despre tmr2 postscaler.In nota se mentioneaza ca postscalerul nu e folosit pentru perioada pwm si ca poate fi folosit pentru sincronizarea unui servo la alta frecventa (sau ceva similar, n-am data-sheetul in fata).Poate se poate folosi prescalerul (tmr2if) pentru activarea iesirii pwm la 20 fiecare 20 ms si folosi iesirea pwm la frecvente mai mari?

Am inteles ce zici numai ca nu merge pentru ca se face o comparatie intre valoarea din TMR2 si PR2, aceste doua valori sunt comparate (comparator hard) si cand ajung la egalitate comparatorul este cel care comanda direct iesirea si reseteaza registrul TMR2. Motivul pentru care imi era de mare folos utilizarea unui PWM hardware este ca sunt PIC uri cu 4 module PWM ceea ce imi ofera posibilitatea sa folosesc un pic pe picior.
Link spre comentariu

Pai da, dar iesirea se poate activa/dezactiva (tris).Modului PWM lucreaza la o frecventa mai mare (sa zicem de 10 ori) si cu "iesirea" prescalerului activezi porturile.Mai pui o rezistenta pulldown sa nu faca prostii cat timp portul e intrare si...Probabil iese mai complicat decat folosit direct tmr1 & tmr2...

Link spre comentariu
Vizitator iulianvalentin

E complicat sa faci asa adica sa schimbi starea portului din mers si sa ai grija sa respecti procedurile read modify write. in timp util.Nu stiu o sa ma mai gandesc, am tot anul la dispozitie.Cand da rateuri servomotorul se smuceste putin dar vizibil. Am mai incercat cu un Chipkit uno, avea o clasa dedicata servourilor dar foarte prost mergea.

Link spre comentariu
Vizitator iulianvalentin

sa respecti procedurile read modify write. in timp util.

N-ai decat write, read nu te intereseaza. :daIn plus nici timingul nu e prea strans, trebuie doar sa fii sigur ca dupa ce ai facut portul iesire astepti destul sa "plece" un puls de comanda.
Ca sa nu imi fac griji de un write corect trebuie rezolvata problema in hardware de mine. Procedura read modify write sa refera la asta:http://www.mikroe.com/download/eng/docu ... lp/rmw.htmEste o procedura destinata unui write pe port.PS. Daca ma gandesc bine ce zici tu pot sa faci doar cu timere fara sa implici modulul PWM. cateva timere intreruperi si aia e.
Link spre comentariu

Multumesc pentru observatia referitoare la rmw. :aplauze Din fericire n-am avut probleme pana acum, desi e clar ca intelesesem gresit.Folosirea 'indirecta' a PWM are avantajul ca se ocupa hardul de pulsurile de comanda a servo-ului. Perioada de 20 ms intre pulsuri nu e chiar asa de stricta, asa ca esti mai 'relaxat'.

Link spre comentariu
Vizitator iulianvalentin

Solutia pentru mine cel mai probabil se afla in timere si intreruperi, e categoria asta noua de PIC-uri enhanced cu o caruta de timere, se poate ca salvarea sa imi vina de acolo. :da Fiecare controler de picior va comanda 3 servo-uri cel mai probabil va efectua ceva masuratori pe piciorul respectiv (senzori) si va comunica cu un modul central care va contine programul cu miscarile posibile.

Link spre comentariu

Un servo analogic va accepta frecventa pulsurilor intre 40 si 60Hz. Am incercat pe mai multe modele (Hitec, Futaba si MG). Aia 20ms nu sunt asa de strict de respectat.

 

Daca PIC nu face decat sa controleze servo in functie de anumite semnale/conditii, atunci poti ocupa PIC-ul numai cu codul de generare PPM.

 

In 20ms (mai mult sau mai putin) poti avea ideal 10 semnale. Uite mai jos cum arata un semnal PPM de la iesirea unui emitator R/C PPM.

Posted ImageVezi ca semnalul este inversat!!!

Jucandu-te cu timerele (2 maximum) poti avea pe un PIC 10 servo controlate.

 

Timer 1 este pentru generare puls (in functie de intrarea/semnalul primit). Acest timer va fi folosit pe rand (intreruperile in bucla principala, cand timerul face overflow treci la pulsul urmator).

 

Timer 2 este pentru controlul celor 20ms. Acest timer are o intrerupere exterioara buclei principale (vezi postul meu de pe pagina 1).

 

Asta faci in program:

Posted Image

Link spre comentariu
Vizitator iulianvalentin

@thunderer,

Multumesc pentru sugestie, am observat ca durata impulsului este intre 750-2250 us pe cele care le am la unghiul maxim de lucru, oricum nu voi folosi mai mult de 120 de grade.

 

pe fiecare brat servomotorul care sustine sarcina cea mai mare este digital cu angrenaje din metal restul sunt analogice cu angrenaje de plastic, si la acele digitale o sa fie mai dificil sa le incadrez in schema (frecventa de lucru este 400 Hz) desi ele merg si cu semnal analogic dar nu merg la acelasi randament sau mai bine zis nu canta la fel. :da

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