Fórum témák
» Több friss téma |
Fórum
Köszönöm! Akkor átírom a programot, próbálok felszabadítani bemeneti pontokat.
Szia!
Mi hajtja meg az RB7 és RB6 lábakat? Akkor lesz gond, ha ezeket a lábakat valamilyen más áramkör alacsony impedanciával hajtja meg. Ekkor a lábat közvetlenül kell a csatlakozóra vezetni, a láb és a meghajtó áramkör közé egy ellenállás kell beiktatni. Égető PicKit 3Sziasztok!Eddig még csak úgy használtam a Pickit 3 égetőt, hogy ha módosítani kellett a programon, akkor kivettem a PIC-et és úgy programoztam át. Most szeretnék olyan NYÁK-ot csinálni, amin ki van vezetve a 6 pont (MCLR; Vdd; Vss; PGD;PGC; PGM). PIC 16F877A-t használok. DE foglalt már a PGD(=RB7) és a PGC (=RB6), mert azok bemenetek. Lesz ebből baj, majd az átprogramozásnál, vagy program üzemmódban mindegy, hogy ezek már bemenetek is? Köszönöm!
Halvány lilám sincs, hogy ez a fordító sajátossága-e vagy sem, de gyaníthatóan szabványban rögzített.
Sem 'b', sem 'c' a döntő. Abból adódik a félreértés, hogy az a = b + c végrehajtási sorrendje más, mint azt elsőre gondolná az ember. b és c összeadódik, majd az eredmény bekerül 'a' változóba. A kényszerkonverzió (cast) a megoldás erre, ahogy írtad is. Itt: Bővebben: Link #9 -es hozzászólás.
Miért lenne integer-ben? Most meg nem mondom, b vagy c tipusdefiníciója dönti el hogy adódik össze, utána konvertál a tipusába. Én ha kicsit is bizonytalan vagyok, beírom a kényszer típuskonverziót, akkor nem ér meglepi...
A hozzászólás módosítva: Dec 12, 2022
a = b + c
b és c összeadódik, majd az eredmény bekerül az 'a' változóba. b és c összeadása integer "dimenzióban" (-32768 ... +32767) történik, itt lehet túlcsordulás ami hibás eredménynek tűnhet. A hozzászólás módosítva: Dec 12, 2022
Változónál használhatsz kényszer konverziót
szam2=(unsigned long int) szam+1UL; https://en.cppreference.com/w/c/language/integer_constant
Rájöttem. A változónál nem kell külön jelölnöm, csak a konstansoknál.
Köszönöm, így már működik
![]() Ezt egy változóval hogyan kell jelölnöm, ha az is van a képletben?
?
Sziasztok. Ismét belefutottam egy furcsa dologba: egy 5digites decimális számot (pl. 97475) akarok számjegyekre felbontani(tízezres, ezres, százas...), és a számolások közben zagyvaságok jönnek ki (csatolt kép).
Leegyszerűsítettem a programot csak egy műveletre, és ott is jelen van a "hiba"
Akkor van a hiba, ha a változó értéke átlépi a 32767-et. A szam2 típusa unsigned long int, a jelenlegi érték bőven a max alatt van. A környezet: MPLAB IDE + HiTech C. Van valakinek ötlete hogy mire nem figyelek? Köszi.
Én csináltam több infra távirányítót is. A PWM modul 36kHz 50%-os négyszögjelre volt beállítva, és az adott billentyű kódjának bitjei ezt kapcsolgatták be-ki. Hibátlanul működnek a mai napig.
Találtam egy oldalt ahol meg tudod nézni ennek az üzemmódnak a működését :
CCPx "Compare" mód
Közben átnéztem a CCP modul leírását és megpróbálhatod még "Compare" üzemmódba használni, de itt be kell kapcsolni a megszakítást hozzá. Ezzel mehet a dolog külső alkatrészek nélkül is...
Attól függ, milyen PIC-ről beszélünk. PWM-et le leht állítani úgy is, hogy adott lábat bemenetre kapcsolod. Az új kontrollerekben ott a bővített tudású Timer2, kapuzható Timer1, CLC, NCO modulok stb. Csak fantázia kérdése.
Hali,
Sajna ez a modul nem egy impulzusra van kitalálva, hanem hogy folyamatosan generálja a PWM modulált négyszögjelet - levéve a terhet a CPU-ról. Csak akkor lehet talán csinálni valamit, ha a kitöltési tényeződ nagyon kicsi és van időd kikapcsolni a PWM-et - ez azonban csak nagy bitszélességű (16bit vagy nagyobb) PWM-el lehet, az viszont csak nagyon kevés PIC-ben lakozik. De ez szerintem macera és ha valami miatt "lekésel" akkor több impulzus is kimehet. Szerintem jobban jársz ha csinálsz valami külső logikai hálózatot amit a PIC triggerel és az állítja elő a megfelelő impulzust - mondjuk egy számláló néhány logikai kapuval amit a PIC órajele léptet. Annak a kimenetére tehetsz egy meghajtót ami már tudja a léptetőmotor áramát kapcsolni. Milyen szélességű impulzus kell a motorhoz?
Sziasztok!
Újabb problémába ütköztem. A szálvezető léptetőmotor vezérlése. Mindenképpen valami megszakításos dolgot kéne létrehozonom. Eddig úgy vezéreltem léptető motorokat (Step/Dir vezérlővel), hogy egy feltételnek megfelelően a mikrovezérlő egyik bitjét 1-re billentettem, majd kis idő elteltével (Delay_ms vagy us) 0-ra. Így létre hozva egy "step" impulzust. Viszont mivel most nagyon számít az idő és nem nagyon akadhat meg a program, így ezt érdemesebb lenne CCPx modullal megoldanom azthiszem. Olvasgattam erről, de nem vagyok benne biztos. Van lehetőség ezzel a modullal csak egy impulzust kiadni mondjuk egy feltételnek megfelelően? Sajnos egyik oldalon sem láttam leírva, hogy hogyan zajlik végbe a folyamat.
Már nem tudtam szerkeszteni, helyesen:
Például 50 mm átmérőre tekercselt 1 menetnyi huzal = 50mm*Pi = 157 mm hosszúságú. Ekkor 1 mm huzal 2048/157 = 13 enkóder értéknek felel meg.
Már megint egyetértünk Gafly-val
![]() Osztás-szorzás nélküli példa negyed fordulat felbontásra: Enkóder <= 512 -> fordulat = 0; 512 < Enkóder <= 1024 -> fordulat = 0,25; 1024 < Enkóder <= 1536 -> fordulat = 0,5; 1536 <Enkóder <= 2000 -> fordulat = 0,75; 2000 < Enkóder -> fordulat = 1. Az 1 fordulat elérésének detektálásához szükséges kis biztonsági tartomány, hiszen az enkóder érték 2047 után 0 jön, ha abszolút enkóderről van szó. Minden 1/2048 = 0,175 foknyi szögváltozást, enkóder érték változást nem könnyű detektálni a mikrovezérlővel. Például 50 mm átmérőre tekercselt 1 menetnyi huzal = 50mm*Pi = 157 mm-es, ami 2048/157 = 13 enkóder értéknek felel meg. A hozzászólás módosítva: Aug 31, 2022
Szia!
Nagyon szépen köszönöm a tömör választ, így már remélhetőleg boldogulni is fogok. Igazából nem feltétlen kell ekkora felbontás. Őszintén szólva én még a tízedes jegyet sem szoktam figyelembe venni, mert nálam általában a cséve adottságai határozzák meg a végleges menetszámot azaz, hogy hol tudom kivezetni a huzalt majd. Ha valahol a vasmagon belül áll meg, hiába, ott nem tudom kivezetni majd, akarva akaratlanul is tovább kell egy negyed vagy fél fordulattal tekernem. Viszont ez egy elég preciz encoder, aztán ha már így van, a programon belül elfér még ez a kódrészlet.
Tekercselőgépnél nem sok értelmét látom a tized/század menetek számlálásának.
![]() De vitathatatlanul lehetséges...
Ezt hívják map-olásnak (a százalékszámítás is ez), amikor egy számtartományt egy másik számtartománnyá alakítasz. Te az enkóder 0-2047 jeltartományát igényled 0-100 fordulatszám tartománnyá alakítani (azért 100, mert századokat is akarsz látni).
Jól írod (majdnem :laugh : fél fordulatnál: 1024*100/2048 = 50, maradékot eldobod.Tehát az enkóder minden kb 20 (pontosan 20.48) értékváltozásának felel meg 0,01 fordulatszám. A kijelzőre kiírod a fordulatszámlálódat (pl ha már 122 fordulatot letekercseltél), majd mellé az 50-et = 122,50 fordulat. Ha az eredményed >=100 (figyelj az esetleges túlcsordulásra), akkor hozzáadsz 1-et a fordulatszámlálódhoz és kiírod: 123,00 enkóder 0-20 21-40 41-61 62-81 82-102... 1003-1023 1024-1044... fordulat 0,01 0,02 0,03 0,04 0,05....... 0,5 0,51............ Bár kérdéses a huzaltekerési gyakorlatban kell-e ilyen felbontás - lehet, hogy elég 0,1, inkább 0,25 (=negyed) vagy 0,5 (=fél) fordulat is... A hozzászólás módosítva: Aug 31, 2022
Gondolm ezt bbb-nek szántad? Idő közben ugyanerről Bakman kolléga is megerősített, hogy bonyolult a használata, és 8 bites vezérlőknél nem kevés erőforrást használ fel a mikrokontroller a lebegőpontos számításokhoz.
Az egész és a törtrész tárolása és azokkal való számolás sokkal kisebb kódot eredményez, mint a float avagy a doubble használata.
Ha a programkódod megosztanád velünk, akkor egyszerűbb lenne... Minden esetre a változókat eléggé rosszul értelmezed. Ha C nyelvről van szó, ott azért válogathatsz a változófajtákból. Van lebegőpontos változófajta is, használhatod azt is (float, double).MPLAB® XC8 C Compiler User’s Guide - 143. oldaltól olvasgasd.
Sziasztok!
Egy tarfó tekercselő elektronikát készítek Bakman kollégáéhoz hasonlót, néhány kiegészítéssel. Az Ő segítségével eljutottam odáig, hogy az encoder által küldött jelet már tudom fogadni a mikrovezérlővel, és ezt ki is tudom jelezni. Ez mindd szép és szuper, csak kevés. Eljutottam oda is, hogy a teljes fordulatokat is ki tudom már jelezni: egész egyszerűen a bejövő jelet elosztva 2048-cal. (2048 inkremenst küldd az encoder egy teljes fordulatra). Viszont nekem nem lenne rossz, ha a tízed és század pontossággal is kiírná ezt az értéket. Ha jól értelmeztem a leírást, akkor a változók csak egész számokat tárolnak... Tehát ha mondjuk az encoderem megtett fél fordulatot az 1024 inkremens. Ha ezt osztom 2048-cal, akkor az 0,5. Ha jól értem ebből a 0,5-ből kéne egész számot varázsolnom még az elején. Vajón járható út-e ez: Maradjunk a fél fordulatnál. (1024*10)/2048. És ezt tárolnám le tömbváltozóban a megfelelő helyen, és ezt jeleníteném meg a kijelzőn?
Rávezettél a megoldásra.
A méret 32bit alapesetben, átállítva 24bitre, jól jelenik meg az érték.
A szimulátorban milyen típusként figyeled a változót? Float ként?
pl 1 esetén milyen értéket látsz?
Beszúrtam még egy float változót, amihez hozzáadnám a "proba" értékét, de nincs változás.
A hozzászólás módosítva: Júl 7, 2022
Nem dolgoztam még nem egész számokkal.
Nekem kell még konvertálnom is? |
Bejelentkezés
Hirdetés |








