Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Idézet: „A nagyobb sebességnek (a dspic33 sorozat pl. 40 MIPS-re képes) a microstepping módban azért van szerepe, mert a névlegesnél nagyobb feszültséggel kell járatni a motort, s közben ADC-vel figyelni a felfutó áramot, ami 1-3 PWM periódus alatt elérheti megengedett értéket, tehát gyorsan kell reagálni.” Kiegészíteném, hogy ekkor a dsPIC figyeli az áramokat is, nincs szükség pl. az i6205 meghajtóra, amiben ez a funkció analog benne van, csak a kitöltésekre kell koncentrálni.
Most akkor i6205 vagy L6205 a szóbanforgás tárgya?
Nekem is bonyolult ezért fordultam hozzátok, hogy ki kellene találni valamit.
Nagyon örülök, hogy foglalkozol a témával. Van egy motor nálam amin sajnos nem tudom a pontos típust leolvasni.Ami biztos, hogy 24V.ot fog kapni, és 400mA a max áram ami folyhat rajta. A lényeg az lenne hogy bele jöjjek A dsPIC pwm hardverének állítgatásába, mivel még soha sem dolgoztam dsP-el. AN1307 elsőre nagyon megijesztett. Tehát nagyon jó volna nekem c-ben egy minta program ami picit már forgatja a mocit- az, hogy melyik láb hova megy az nem lényeg, és az Ena-bemenetek nincsenek használva az L6205-ben. (kész nyákkal kell megvalósítani egy ismerősöm cnc-vezérlője)
Minta programom nincs, de nem túl nehéz a PWM-et belőni. Ha jól olvasom, csak ez jelentene gondot?
Amit a PWM-en be kell állítani, az az, hogy milyen legyen a periódusidő, és milyen módban működjön, esetleg a dead time-ot, ha szükséges(ezt most hirtelen nem tudom kell-e, nem hiszem...). A kitöltés beállítása csak egy regiszter(PWMx duty cycle) feltöltése a megfelelő számmal. A korábban linkelt doksi 3. oldalán a 15-1: ábrán jól át lehet tekinteni, milyen regisztereket kell számba venni. A 15-2:-es ábrán láthatóak az időzítésben szerepet kapó egységek. Érdemes összevetni a beállító regiszterekben található bitnevekkel. Szerintem itt a Free Running mód kéne, 16KHz körüli alapfrekit belőni, és programból vezérelni a 4 Duty Cycle regisztert. A 19. oldalon van a Free Running mód priódusidő kiszámításának módja. Végig kéne ezt nyálazni, és kipróbálni a PIC-ben, vagy MPLAB szimulátorban, ha nincs PIC-ed még.
Van PIC sőt panelban van már, de melyik doksira gondolsz?
Hogy bonyolódjon a dolog úgy kell megírnom, hogy közben a pic-nek figyelni kell egy soros komonikáciot.
Neked csatoltam legutóbb...
A soros port elfér mindemellett. Sejtettem, hogy a vezérlő adatok PC-ről jönnek... De első körben 1 PWM kimenetet fel kell élesszél az eddigiek fényében, utána jöhet a többi. Van mivel mérd a PWM frekit? Ha nincs, vedd fel hangkártyával, és elemezd valami hangszerkesztővel, a frekit látni kell így is. Esetleg valami PC-s szkóp is megfelel. Gondolom a bemenetre tudod illeszteni az 5V-os jelet egy osztóval...
Van egy tárolós oscilloscope-om. Ezeknél a pic-eknél meg lehet azt is csinálni, hogy a pwm jelet bármelyik kimenetre rá tudom irányítani? Vagy csak fixen a pwm lábakon tud kijönni?
Az adatlap elolvasását nem fogod tudni megúszni...
Icsernynek maximálisan igaza van! Egyébként nem lehet, de erre magad is könnyen rájöhettél volna akár a rajzok alapján az ajánlott doksiban, vagy az adatlapból, már az első oldalakon, ahol a PIC lábkiosztása van, nem beszélve a lábak részletezésénél, illetve a PWM modul résznél...
Rögtön gondoltam, de egyszerűbb itt kérdezni mint lapozgatni, vagy nem?? Ahogy tanácsoltad életet lehelek a pwm-kimenetekre, aztán remélem segítetek a Sinus táblázatosításában, még soha sem csináltam ilyesmit.
Idézet: Nem! A topik arra való, hogyha elolvastad, de nem érted, vagy nem elegendő az információ, akkor legyen hol megkérdezni. „egyszerűbb itt kérdezni mint lapozgatni, vagy nem??”
És gondolod, hogy mi itt fejből tudunk mindent és arra várunk, hogy valaki kérdezzen és mi mondhassuk? Fel kell, hogy világosítsalak, hogy a helyzet korántsem ez, hanem nekünk is bele kell nézni az adatlapba, csak mi megtanultuk használni az adatlapot, nem a sültgalambot vártuk a szánkba.
Ebben nagyon tévedsz! Én mind a 128ezer féle PIC adatlapját, valamint az összes erratát fejből ismerem, bármit kérdezhetsz, álmomból is megy!
Idézet: „egyszerűbb itt kérdezni mint lapozgatni, vagy nem??” Oooh, tokeletesen igazad van! Teljes mertekben egyetertek, nagysagrendekkel egyszerubb! Csakhogy:
Hééé nem kell ám nekem esni tisztában vagyok a szabályokkal, és azzal is, hogy böngésznem kell az adatlapot.
Szia! Léptetőmotor vezérléséhez 1 db PWM is elég, az elképzelhetetlen hogy a tekercseket más más kitöltési tényezővel vezéreled egyszerre. Ha az előírt feszültséggel hajtod meg, a PWM abszolút felesleges. A lépőmociknál akkor használják, ha jócskán az előírt feszültség fölött hajtod meg. Ekkor nagyobb a nyomatéka, kisebb motorral nagyobb erőt tudsz kifejteni, viszont az áramerősség a PWM miatt csökken, ezért bírja a nagyobb feszültséget. Ezt PIC nélkül a legegyszerűbb megcsinálni. A PIC szerepe akkor jön képbe amikor a motor megállt. Ilyenkor is teljes feszültség alatt van az adott tekercs, viszont nem kell feszültséget csökkenteni, nem melegszik túl, egyszerűen a PWM kitöltési tényezőjét kisebbre veszed, kevesebb az áramterhelés. Ilyenkor a PIC nagyon jó dolog! Megspórolsz egy csomó plusz alkatrészt, kevesebb az áramköri hibalehetőség(a hibákat majd egy rossz programozással beviszed magad ), egyszerűbb a kapcsolás. Nézd meg ezt a motorokról:Bővebben: LÉPTETOMOTOROK
Sinus táblázatot rengeteget találsz a googliban! Pic vonatkozásában keress rá a hanggenerátoroknál! A Pic kimenő jelét táblázatból olvassák ki.
Már leírtam, hogy miért kell pwm, nézd csak valami ilyesmit szeretnék megoldani. A tekercsekre sinusosan emelkedő majd csökkenő feszültség jut így nagyon halk és egyenletes járása lenne a motornak.
Valóban leírtad, megértettük, válaszoltunk, most rajtad a sor, várjuk az eredményeket! (az ívet pedig viseld bölcsen!)
Meg tudod-e mondani, hogy hány programlépés ( belső órajel ) telik el, mire a megszakítási eseménytől ( komparálási egyezés ) eljut a vezérlés a timer1 nullázásáig ( tehát a timer1 0-ról indul el )? Mindig ugyanannyi lépés fog eltelni? Ha a két kérdés közül akár az egyik megválaszolásában már bizonytalan vagy, akkor magad is tudod, hogy miért jobb az a megoldás, amit korábban javasoltak neked. Segítségül: Letiltod egy bizonyos művelet ( EEPROM írás ) miatt a megszakításokat.
A korábban javasolt megoldásban mindig ugyanannyi és előre meghatározható belső óraütés történik két megszakítási esemény kiváltása között, függetlenül attól ( nem teljesen igaz ), hogy a vezérlés mikor is ér oda a megszakítás kiszolgáló részhez. A timer1 szabadon fut, nincs semmivel sem befolyásolva. Mindig a komparálási értéket tolod magad előtt. A számításigény két 16 bites szám összeadása úgy, hogy a felső átvitellel nem kell foglalkoznod, és éppen ez adja a modulo 65536-os osztást. Az eredmény alsó és felső bájtját pedig bemásolod a CCPRxL és H regiszterekbe. Tehát semmi bonyolult nincs benne. Egyszerű az egész és pontos, következetes eredményt ad.
A komparálási szint elérése után a Timer1 nullázásáig csupán néhány ciklus telik el, mert már a megszakítási ciklus elején tervezem a nullázást.
Ezután persze ujraindul a Timer1, de a következő megszakításig bőven elférek azzal a néhány programlépéssel, amit tervezek. (portra küldenék ki egy adatot) Ebből gondolom, hogy pontos és hibátlan lesz az időzítés. Amit Te javasolsz, az is tetszene, de továbbra is erőforrás igényesebbnek tartom, mert ott van a 16 bites számok összeadása, majd az eredmény CCPRx L-H regiszterekbe írása. Ráadásul, ha működés közben akarnám módosítani az ismétlődési időt, akkor növelésnél összeadást kell használnom, csökkentésnél pedig kivonást. Ennek értékét pedig mindig a korábbi értékhez képest kellene figyelembevenni. Például 5 usec ról megyek 10 usec ra az +5, majd váltok 8 usec ra az -2, de ha közvetlenül álltam volna át az +3 lett volna. (Most a leírt értékek csak példák, ilyen időzítéseket nem tudok az adott órajellel csinálni) Igaz csak egyszer kell kiszámolni a fenti értéket, de bonyolítja a kódot. Ezzel szemben a reset megoldással nincs ilyen gondom, mert tudom a maximális és minimális sebességhez tartozó ismétlődési időt, és ha közbenső érték kell akkor előre definiált táblázatból feltöltöm a CCPRx regisztereket. Lehet rosszul látom a dolgokat, de nekem továbbra is egyszerűbb a resetes megoldás. Ellenben ha nincs igazam, megköszönném, ha megcáfolnátok.
Ismét zaklatnálak titeket, van egy dolog amit nem értek az asm-ben itt találjátok a forrást. movlw high ModeSelectTable ; jump to the current mode MPlab-ban nézve a 97. sorban található ami az én értelmezésemben azt jelenti, hogy a w-be mozgatja a high ModeSelectTable értékét, viszont sehol nem találom azt hogy létre lett volna hozva ilyen nevű regiszter, vagy érték lenne neki adva. El tudnátok nekem mondani, hogy van ez a dolog?
Szia!
Ott van alatta kb. 8 sorral... A részlet egy kiszámított ugrás előkészítése, a táblázat a program memóriában van.
Ezt nem nagyon értem el tudnád mondani részletesen?
Szia!
Kiszámított ugrás magyarázata a 16F684 adatlapjában a 17. oldalon a 2.3.1 "MODIFYING PCL" fejezetben van. A lényeg: Az egész program számláló nem érhető el a pic-ben, csak az alsó 8 bitje a PCL regiszterben. Ha a PCL regisztert módosítjuk, a felső bitek (..8) a PCLATH regiszterből töltödnek át a program számláló felső részébe, az alsó része a PCL módosított értéke lesz. A program futása ettől a címtől folytatódik. |
Bejelentkezés
Hirdetés |