Fórum témák
» Több friss téma |
A klónok CH340 Soros-USB illesztőjének drivere (Letöltés)
Lehet hogy az arduino lassú és korlátozott, de nekem ide pont elég lenne. Maga a kód nagyjából ennyi lenne:
Vagyis pontosabban:
Ahol pin3 és pin1 ugyanarra a jelre van rákötve, de 1v1 referenciával mérek, és hasznos jel esetén 1v1 alatt vagyok, egyébként pedig vcc közelében, amivel foglalkozni se érdemes. Arra gondoltam, hogy először megírom "arduinóban" a dolgot, aztán ha ez kevés (vagy csak kedvem van hozzá), akkor akkor átírom a kritikus részeket. De még az elején elakadtam. Szóval nem tudom, hogy az arduino IDE/lib/whatever mennyire piszkál bele a beállításokba, regiszterekbe, de az analogWrite fv érdemi része kb. így néz ki:
Innen: ~/arduino/arduino-1.6.5/hardware/arduino/avr/cores/arduino/wiring_analog.c És ez alapján nem értem... A hozzászólás módosítva: Júl 16, 2018
Nem "matematikailag", de írtam valamit.
Az alapötlet az, hogy meghatározok egy max. különbséget, amit semmiképp se érhet el 2 mérés között. Erre belőttem 180 fokot, mert ha ettől nagyobb előfordulhat akkor semmiben se lehetsz biztos. A diff adja vissza az eltérést fokban, a dir pedig az irány (signed: ha + irányba mentünk akkor +1, ha - irányba akkor -1, ha nem mozdult akkor 0.
Sziasztok,
Lenne egy gyors kérdésem: Egy ESP32 modullal szeretnék LCD kijelzőt, érintőkijelzőt, infra ledet, bluetooth-ot, wifi-t, CAN buszt, meg egy csomó mindent vezérelni, viszont a projekt negyede sincs kész, máris 538 sornál tart a forráskód, van kb. 21 függvény, amikor a 403-adik sorból kell a 120-adikra visszaugrani, modosítani, majd megint visszamenni a 403-adikra, olyankor teljesen összezavarodok. ![]() Már így is olyan hosszú sorok is vannak, amik egy full HD-s kijelzőn se férnek ki, a forráskód olvashatóságáról nem is beszélve. Hogyan lehetne a függvényeket külön fájlba átteni, annélkül, hogy könyvtárat kellene írni? A könyvtár írással egyedül az a bajom, hogy sok idő és energia kell hozza, de ha nincs más alternatíva, akkor nekifogok annak. A választ előre is köszönöm! A hozzászólás módosítva: Júl 16, 2018
A kettes és hetes lábát úgy kapcsolod be, beleírod egy char változóba hogy 0b01000010, és küldöd a shiftOuttal a regiszterre ahogyan a példa mutatta. Vársz egy másodpercet, aztán a 0b00010100 bájtot küldöd ki. Ennyi.
Csináltam tesztet.
A program:
Az eredmény: diff = 6, dir = 1 diff = 10, dir = -1 diff = 354, dir = 1 Alkúl! A 2 első adat már jó. A balra mozgás még nem OK! A hozzászólás módosítva: Júl 16, 2018
Ezt én ugy csinálnám, hogy írnék egy segéd függvényt, ami ellenőrzi hogy a művelet elvégzése után az eredmény belefér-e a 0-360 fokba. Ha nem, akkor kivonnék a 353 fokból 180—ot, ezzel biztosan elvégezhető a művelet, lehet tesztelni. Egyszer már megoldottam ezt a problémát, csak most nem vagyok otthon egy hétig, próbálom felidézni
![]() Szerk: látom kapu kolléga is hasonló megoldással próbálkozik.. A hozzászólás módosítva: Júl 16, 2018
Ez lessz a végleges megoldás:
diff = 6, dir = 1 diff = 10, dir = -1 diff = 10, dir = 1 diff = 6, dir = -1 Most jó az eredmény! A hozzászólás módosítva: Júl 16, 2018
Lusta voltam letesztelni, csak érzésből írtam. Ezek szerint érzésből erre a tesztesetre nem gondoltam. Na mindegy, majd nekiállok egyszer ha addig nem oldja meg valaki.
Szerk: köszi a javítást. A hozzászólás módosítva: Júl 16, 2018
Köszi a segítséget!
Meg érdemled a mancsot érte! A többit már megoldottam, a te nyomdokodban! ![]() A hozzászólás módosítva: Júl 16, 2018
Szívesen, félig működő, trehányan tesztelt algoritmusok írásában jó vagyok
![]()
Az analogWrite nem.lehet probléma, viszont ha a timer regisztereit piszkálod, figyelembe kell venned, hogy azoknak már van egy kezdő értéke Arduino alatt, ami nem biztos, hogy nulla! Én mindig kinullázom, és utána állítom be. De ki is írathatod soros portra indulás után közvetlenül, és látni fogod a kezdő értéket. Ebbe a high speed timer-be még nem akadtam bele jobban, de érdekesen hangzik. Adatlapot kellene átolvasni rendesen, hogyan tud nagyobb frekin menni a timer1, ha az órajel 1MHz. PLL van használatban? A PLL-t konfiguráltad?
A hozzászólás módosítva: Júl 16, 2018
Még egy változat az irányprobléma megoldására:
'a' a kiindulási szög 'b' az új szög visszatérési érték b-a, -180..+180° tartományra korlátozva, óramutató járása a pozitív irány Ha a és b értéke garantáltan a 0..359 tartományba esik, az első két if else if szerkezet elhagyható. A hozzászólás módosítva: Júl 16, 2018
A timer regisztereknek szerintem elég egyértelműen adok értéket, nem hiszem hogy a nullázás ezen sokat segítene, de majd kipróbálom. A soros port attiny esetén nem triviális, de majd arra is ránézek. A datasheet triviális megoldás, de bő 200 oldalt elolvasni, megérteni és megjegyezni, hát ahhoz kicsit kevés az agykapacitásom mostanában.
A PLL-t nem piszkáltam, annyi a kód amit írtam, de ennek még utánanézek, kösz a tippet. Remélem holnap (ma) kicsit könnyebb napom lesz mint ma (tegnap), hátha lesz kis időm ennek utánanézni.
Köszönöm.
![]()
Köszönöm.
![]()
Ezt lehet, hogy nem gondoltam végig eléggé... Régebben két abszolút szöghelyzetadó forgását kellett szinkronizálnom, beállítható szögeltéréssel, ott volt valami hasonló a megoldás. Csak már nem emlékeztem pontosan...
De úgy látom, azóta már megoldódott. ![]() Idézet: Méréskor sosem kapsz nagyobb számot.„if(a>359)” Ezzel az a gond, hogy az iránytűn nincsen nagyobb szám! 0 - 359, és kezdi elölröl a 360 = 0. Idézet: És mi van ha másik irányba fordulsz? B < A?„diff=b-a;” A gond akkor jön elő mikor valamelyik irányba átlépjuk a bűvős 360 fokot. A hozzászólás módosítva: Júl 17, 2018
Ha 240 foknál nagyobb mérési eredményt követően kapunk 120 foknál kisebbet, akkor az aktuális szög 360-al nagyobb, mint a mért érték.
Hasonlóan a másik irányban.
Bocsi az értetlenkedésért!
Úgy tűnik, mégis működik a teszt:
Eredmény: 6 -10 10 -6 OK! Köszönöm a segítséget! Így talán már nem bolondul meg a dronom. ![]()
Szia!
Lehet, hogy most szívesebben választanád a könnyebbik utat, a spagetti kód átfaragására. De én inkább ajánlanám ezt a módszert: Bővebben: Link Meg fogod köszönni, hogy megfogadtad, a későbbi könnyebb hibakeresések alkalmával!
Köszönöm a segítséget, Te vezettél nyomra.
A PLL beállítás hiányzott, miután ez megvan a TCCR1 és az OCRC1 regiszterek piszkálásával szépen be tudtam állítani 250 kHz és 20 kHz PWM frekit is. Hátha valakinek hasznoslesz, iderakom a kódot kommentekkel:
További kérdés még: a uC-re nézve van valami előnye/hátránya annak, ha kisebb vagy nagyobb PWM frekvenciát használok? A hozzászólás módosítva: Júl 17, 2018
Szívesen. Nem csak neked volt hasznos, régebben én is "rácsodáltam", hogy a kis IC milyen szuper PWM-et tud produkálni, aztán feledésbe merült.
Szerintem az uC-nek teljesen mindegy, mekkora frekin ketyeg a timer-je, egyedül instabilitásra hívja fel a figyelmet az adatlap nagyon magas frekvenciákon. A hozzászólás módosítva: Júl 17, 2018
Üdv mindenkinek!
A PWM kérdéseiteket válaszotokat figyeltem, utána is olvastam, de ez mindenképpen kell? analogWrite(LED_PIN_PWM, 128); Mármint a loop-ba? Nem elég, ha a Setup-ban be van állítva? A 128 az 50% körüli kitöltést adja meg nem? (A frekvenciát nem változtatja) Rosszul gondolom? Mert ha igen, akkor minek kell minden egyes-loop-ban kiadni ezt? Ha több kódot írok a loop-ba akkor ráadásul nem azonos időközönként megy ki ez a parancs. A gondom az, hogy ez a parancs nem befolyásolja a PWM-jelet? Gondolom a timer counter-t nullázza egy ilyen nem? (Ok nem biztos) Mert ha igen akkor teljesen felesleges kiadni ezt az utasítást ennyiszer, elég csak akkor, ha az változik.
Mért nem használsz ezt?
Tök egyszerü! A hozzászólás módosítva: Júl 17, 2018
Szerintem ez nem tud PLL beállítást, pl. ezért nem használja.
Frekit is akart nem csak kitöltést ahogy látom...
![]()
Igazad van, most hülyeség odatenni. A későbbi kód egy analóg feszültségszintet fog ADC-vel vizsgálni, és ettől függően fog PWM-et állítani, ha szükséges, másodpercenként max. 2-3 frissítést tervezek. Akkor pedig már a loop()-ban lesz rá szükség, szerintem ezért tettem tesztelésnél is oda. Ma nekem is kiszúrta szemem, de annyira nem zavart hogy érdemben belenyúljak. Most még csak a pwm működésénél tartok, illetve - hála a segítségeteknek - azon már talán túl is vagyok
![]()
A fogyasztás most lényegtelen. Egy jobb pillanataiban 70 Wattot fogyasztó, hálózati táplálású eszközhöz készül egy mérőmodul.
Köszi,
Ezt két dolog miatt nem használtam, az egyik hogy nem tudtam róla. ![]() A másik pedig az, hogy ez egy _nagyon_ egyszerű kód, de tényleg: a loop-ban ADC mérés után PWM beállítás esetleg egy delay utána, és ennyi. Ez annyira alap dolog, hogy jó feladatnak találtam az attiny-val való ismerkedésre (ami ügyes kis cucc egyébként). Ezen kívül annyi (volt) a "nehézség", hogy egy nagyobb PWM frekit kihozzak a uC-ből, amit egyébként adatlap szerint simán tud, csak én voltam béna. Nem akarom mindig újra feltalálni a kereket, de az indokolatlan lib-használatnak sem vagyok nagy barátja. Itt konkrétan 3 darab regisztert kell beállítani ahhoz amit akarok (jó, tettem bele egy delay-t és egy vizsgálatot is), a linkelt lib-nek csak a header file-ja 4,7 kB, még ha a nagyja komment is. Szerintem az egész kódom nem lesz ennyi, kommentekkel együtt sem. És még egy probléma van, ezt írja a header file-ban: Idézet: „/* This library is built to support two of the AVR Architecture 'groups' that Arduino uses a) ATmega48/88/168/328, b) ATmega640/1280/1281/2560/2561 */” Én pedig ATtiny85-tel játszok, bár a kódnak az Attiny25 is elég lenne szerintem. |
Bejelentkezés
Hirdetés |