Fórum témák
» Több friss téma |
A klónok CH340 Soros-USB illesztőjének drivere (Letöltés)
Lehet az a probléma, de megszabadultam a "saját" fügvénytől egyelőre...
Amit linkeltem müxik csak ki kel hámozni a lényeget ami érdekel de mérd meg a felvet áramot cpu vccn ha alszik pár mikro amper csak a fogyasztás!
Üdvözlet!
Lenne egy kérdésem. Belső megszakítással, egy timerről szeretnék időzíteni. Ugye az Arduino teszi a dolgát, jön a megszakítás, eltelik x órajel ciklus, mire félre teszi azt, amit csinál és végrehajtja a megszakítást. Az lenne a kérdésem, hogy az az x órajel ciklus, ami a megszakítási kérelem és a végrehajtás elkezdése között eltelik, az mindig ugyanannyi, bármit is tesz éppen, vagy ez változó?
Magszinten a megkezdett utasítás be fog fejeződni, majd elpusholja a címet és elugrik a megszakításrutinra. 1 utasítás-ciklusban egyszer vizsgálja, hogy jött-e INT kérés, ennyi glitch-et okoz. SW szinten, ha épp fut valami megszakítás, akkor addig nem fogad el másikat (kivéve, ha Te külön nem engedélyezed) míg az vissza nem tér (ha 3 óra, akkor addig csak "gyűjtögeti" a bejövő INT kéréseket, bebillennek a jelzőbitek), majd ha visszatér, akkor egy sorrend alapján kiszolgálja a bejött kéréseket. Sajnos nincs prioritásos megszakításkezelés a kicsi AVR-eknél. Tehát ha alapból fut mondjuk egy 1kHz-es időzítő megszakításod és Te egy másik időzítővel generálsz még egyet, akkor olyan glitch-ed is lehet, aminek változása a folyamatosan futó (pl.1kHz-es) rutin végrehajtási ideje (pont beleköszönne a pont most indult másik INTbe, de nem tud ugyebár).
Multival érdemes lenne megmérni, sikerült-e. Annyit megsúgok, hogy mikor lefut a bootloader, kb. 3mp-ig nem lesz alvó üzemmódban, ha az akksi teljesen üres, és esetleg a brown out detector be van kapcsolva (fuse bit), akkor könnyen előidézhető egy olyan állapot, amikor az AVR folyamatosan indulgat, lemeríti az akksit, amitől resetel, kis idő múlva pedig emelkedik az akksi feszültsége, és minden indul elölről. Kis kapacitású akksit gyorsan mélykisülésbe visz.
Tehát, ha én megszakításban például egy négyszögjelet generálok a timer segítségével, akkor a generált jel fáziszajos lesz a timer fáziszajtalan jeléhez képest. Minél magasabb a frekvencia, annál inkább összemérhető lesz a hiba a timer periódus idejével. Ha jól gondolom.
Köszönöm.
Igen. Ezért érdemes, ha megengedi az alkalmazás a timer HW négyszöggenerátor üzemmódját használni, egyéb esetben külső HW szükséges (lehet, pl. DDS). Ha pl. soroson jönnek be adatok, akkor a soros rutint kell úgy megvésni, hogy belül engedélyezed az INT-et (amit elvesz) vagy nem használsz soros megszakítást, hanem főprogramból figyeled (és megpróbálod elkapni) amikor bejött egy karakter. Sajnos az általad említett esetben is a fáziszaj véletlenszerű lesz, lehet, napokig nem köszönnek össze a timer-int-ek Vagy minden egyéb dolgot letiltasz, ami INT-ből menne és főprogramból figyeled az eseményeket (a timer overflow bit attól még bebillen, csak nem ad INT-et)...konkrét feladat szabja meg.
Köszönöm a válaszodat. Megtudtam, amire kíváncsi voltam.
Mivel még nincs hardwerbe, így nem tudok mérni semmit. Csatlakoztatva feltöltött állapotba lesz.
És igazából a mélykisüléstől se nagyon tartok, ugyanis kb 10-15Ah (nem elírás) cellán lesz rajta, azon biztos elmegy egy két hétig is akár, még akkor is, ha nincs alvás...
A belső megszakításnak ezt a fázishibáját van lehetőség bárhogy kiküszöbölni?
Mondjuk timer előállít egy kiskitöltésű négyszögjelet. Ennek a négyszögjelnek a lefutó élével szeretnék belső megszakítást indítani azzal a céllal, hogy ciklusonként pontosan ugyanabban az időpontban végezzek egy ADC mérést az egyik analóg lábon, az értékkel pedig számoljak és kiírassam lcd-re. 1 microsec csúszás is már durva hibát okozna a mérésben. Tehát pontosan ugyanakkor kellene mérni az analóg lábon. Például esetleg 2 arduino-val? Az egyik szigorúan csak létrehozza a négyszögjelet és mér?
Azaz nem timerrel hozza létre a négyszögjelet, hanem pl digitalwrite -al, és nem belső megszakítással időzítjük a mérést, hanem minden ciklusban pont ugyanazokat az utasítások közés ágyazzuk az analogread-ot, így órajelre ugyanakkor fog mérni?
Nem, mert a háttérben fut pl. millis() fv. interruptja, ami befolyásolja az időket. A szimplán hardveres ADC mérést én kipróbálnám, és oszcilloszkópon ellenőrizném. Nem lehet megmondani, hogy fix-e az interruptbe belépés óraszáma, én sem tudom. Esetleg specifikusan erre rákeresni kapnál választ a kérdésedre, vagy mint mondtam, lemérve.
Ha nem ragaszkodsz kimondottan az AVR-hez?
Már van használhat Arduino IDE ARM alapú boardokhoz. Sloeber, the Eclipse IDE for Arduino Developers Source: Bővebben: Link Az ARM-ban van lehetőség a megszakítások prioritássát állítani. Tudsz periodikusan timer tigerjellel indítani ADC > DMA > Memoria (vagy periféria) átvitelt. Teljesen HW alapú, közben a proci végezheti a dolgát. A hozzászólás módosítva: Júl 26, 2017
Például ez a legkisebb olcsó, de aránylag nagy tudású eszköz:
Bővebben: Link Ajánlom tanulmányozni a lehetőségeket
Csak nagyon alapszinten használom az arduino uno-t.... Ezért előnyben részesítenék egy faék bonyolultsághoz közelítőbb megoldást.
Ha pl digital write-al és delaymicrosecond-al létrehoznék egy négyszögjelet, az ad konvertert a leggyorsabbra állítva - ami kb 10 microsec késleltetést jelent - mérnék mondjuk 10-et egymás után, az értékekkel fix képlet alapján számolnék és kiírnám lcdre, majd új ciklusban kezdődik minden előröl a négyszögjellel. Így sem esnének ugyanarra az órajelre ciklusonként a mérések a négyszögjel lefutó élétől?
Nem! Mert közben microsecundumon ként jön 1 timer megszakítás.
Ami elnyújt minden SoftWeres számlálást. Ezt csak HardWeresen tudod megoldani
Vagy nem is számolnék az értékekkel, hanem pl 100 ciklusban csak adc- mérés, az értéket egy tömbbe feltölteném, aztán 100 ciklus után számolnék és lcd-re küldenék.
Tehát csak négyszögjelet gyártanék digitalwrite-delaymicrosecond kombinációval, analogread, az érték feltöltése egy tömb egy elemének, aztán újra négyszögjel 100×. Itt sem fog ugyanarra az órajelre esni az adc?
Hát ez szomorú...
Sziasztok
A képen látható(muszáj volt így, mert a fórum is használja a sorvég karaktereket) kódba hogyan tudok behelyettesíteni a 100 helyére egy int változót?
NEM! Ez mégrosszab!
Értsd már meg! A legpontosabb időzítést TIMER PWM megszakítással tudsz elérni. Ha közben lekapcsolod az Arduino microsecond számláló megszakítást. Mert az eltolja az ADC mérések indítását. Különben meg 100 mérés átlagolásánál már miértelme az ekkor pontosságnak?
Nem uS-ként jön megszakítás, nem is nagon tudna... A uS érték a mS-ból (ilyen sűrűn jön megszakítás), és a timer aktuális értékéből van számolva. A digitalWrite fv-t el kell felejteni ha valaki normális időzítést akar csinálni...
Én igy probálnám: (van alul Kód gomb, használhatod!)
Azért nem teljesen világos: ugyanaz az utasítássor fut végig általam generált megszakítás nélkül, akkor órajelről órajelre nem ugyanaz történik minden futtatáskor - még ha az utasítások megszakításokat is tartalmaznak - hiszen a megszakítások is ugyanazokra az eseményekre esnek?
Nem az a kérdés számomra, hogy microsecundum mértékegység szerint tudjak időzíteni, hanem az, hogy ugyanazok az utasítások egymásutánisága ciklusonként, ugyanazokra az órajel távolságokra esnek-e.
Azért ez a pontosság utáni versenyfutás, mert egy 5vról kb 10 microsec alatt nullára csökkenő görbe egyik időpillanatában kell ADC mérést végrehajtani úgy, hogy az megismétlődve ugyanazt az értéket adja - azaz 5V / 1024 - kb 0.005V pontossággal.
Ezt megoldani azért nem lenne rossz teljesítmény egy Nano-tól ))
Ha semmi megszakítás nem.fut, akkor az elméleted stimmel. De ez olyan fából vaskarika megoldás. Szerintem amit akarsz, az hardverből tudja, az interruptnak azonos belépési idejűnek kellene lennie, de mondom, le kell tesztelni, felesleges a további beszélgetés erről, korrekt választ csak te fogsz kapni ha tesztelsz. Esetleg az AVR-es témába ugorj át.
Idézet: „azaz 5V / 1024 - kb 0.005V pontossággal.” Ezt a pontosságot nem tudja az AVR ADC-je teljesíteni! Próbáljál mérni valami stabilnak vélt állandó feszültséget, 100 szór. És értékeld az eredményt
Így próbáltam:
de nem jó. Lehet valamit félreértettem. Ez lenne a fogadó progi(14.o), de fogadott adatnak ezt Írja:batt %i (Nekem előnézetnél sort tör a fórum, azért nem úgy küldtem az előzőt.)
Kissé nehezen érthetően írta le szerintem a problémáját Sirbedevir.
Szüksége van egy precíz négyszögjelre, amit a timerrel meg is lehet csinálni. Majd ez után a négyszög jel után nagyon pontosan időzítve jön az ADC mérése. Mivel, ha a timer indítja a belső megszakítást és a megszakításban mér az ADC, mindig csúszások vannak, mert ki tudja mennyi ideig tart kilépni a megszakításba. Ezért most úgy oldja meg, hogy a timer indít egy megszakítást. A megszakításban generál egy négyszögjelet portállítgatással, és delaymicrosecond-dal. Majd ezután vár kicsit, megint csak delaymicrosecond-dal és ezután ADC mérés. Ez viszonylag pontos, de közben nem tud mást csinálni (viszonylag hosszú a négyszögjel) és talán nem is a legelegánsabb megoldás. Próbálkozik(unk) más utat találni.
akkor próbáld bele rakni a stringet 1 char tömbbe.:
|
Bejelentkezés
Hirdetés |