Fórum témák

» Több friss téma
Fórum » ARM - Miértek hogyanok
 
Témaindító: gtk, idő: Jún 26, 2007
Lapozás: OK   82 / 175
(#) kissi válasza csabeszq hozzászólására (») Jan 5, 2017 /
 
Nem ismerem az STM-et, de a PIC-eknél csatornaváltás esetén ki kellett várni egy időt, ami megszüntette a csatornák közötti "áthallást" ( a mintavevő kondit fel kell tölteni az új csatorna értékére, folyamatos mérésnél ez nálad is megtörténik ! ) !
A hozzászólás módosítva: Jan 5, 2017
(#) csatti2 válasza kissi hozzászólására (») Jan 5, 2017 /
 
Itt nincs ilyen. pl. felépíthetsz olyan szekvenciákat, hogy egyik ADC mintavételezi mondjuk az 1-es, 2-es, 3-as csatornákat, a másik a 4-es, 5-ös, 6-osakat, majd kezdik előröl és a DMA folyamatosan pakolja be az eredményeket egy bufferbe (lehet körkörös is). A kondi töltése a kiválasztott órajelig tart (1,5-től 239,5-ig ), a tényleges konverzió pedig 12,5 órajelig (ADC clock). A beépitett referenciákra például van megadott javasolt minimum mintavételezési idő.

Amit szerintem Ő elrontott, hogy kikapcsolgatta az ADC-t és nem várta meg a feléledési idejét.
A hozzászólás módosítva: Jan 5, 2017
(#) csabeszq válasza csatti2 hozzászólására (») Jan 5, 2017 /
 
Igen, a joystick-et lehet szekvenciában olvasni, jó is.

- ADC2 olvassa a joysticket.
- ADC1 hallgatja az oszcilloszkóp trigger jelét

Amint a trigger jel megtörténik, akkor állhat elő az, hogy azonnal indítani kell a 2 csatornás mintavételezést, tehát ADC2-t azonnal át kell konfigurálni, hogy amit addig csinált fejezze be. Ezért próbálkoztam DeInit-tel.
A hozzászólás módosítva: Jan 5, 2017
(#) csatti2 válasza csabeszq hozzászólására (») Jan 5, 2017 /
 
Jól értem, hogy szkópot csinálsz?
Akkor nem jó ha ADC-t kapcsolgatsz triggernél, hisz elveszik az információ ami a trigger előtt volt. Ráadásul az átkonfiguráció olyan sokáig tart, hogy elveszted azokat a gyors eseményeket, amiért egyszerre akarod a két ADC-t használni.
Ha félreértettem és egy meglévő szkóp ad triggert, akkor meg miért nem digitálisan veszed azt.
Ha mindenképpen interleaving-gal mintavételeznél és kell a joystick is, akkor pedig használj a high-density sorozatból uC-t, azokban 3 ADC is van.
(#) csabeszq válasza csatti2 hozzászólására (») Jan 5, 2017 /
 
Ezt átgondolom még, amit írtál.

A csatornák megváltoztatása nem biztos, hogy olyan sok idő.

ADC1 triggert keres, ADC2 joystick-ot mér.
Amint megvan a trigger, ADC2 csatornáit meg lehet változtatni.

Jelenleg a triggerem úgy megy, hogy akkor indul ha 10%-ot ugrik a feszültség (felfutó el mérésnél).
ADC1 watchdoggal szerintem ez megoldható. Viszont szerintem a csatornát gyorsan is át lehet állítani, a trigger után mérek, nem előtte. Persze abban is van ráció, hogy mi volt előtte...

Meg lehet, hogy idő közben mégiscsak egy csatornát fogok mérni 2 helyett, esetleg trigger jel keresésnél nem mérem a joysticket, csak mintavétel után...
A hozzászólás módosítva: Jan 5, 2017
(#) csatti2 válasza csabeszq hozzászólására (») Jan 5, 2017 /
 
Kipróbálhatnád, hogy működne az, hogy az ADC1-el és ADC2-vel folyamatosan mintavételezel DMA-val körkörös bufferbe interleaving módban. A joystickot pedig injected csatornaként mintavételezed csak néha. A dokumentáció szerint lehet ilyet, én nem próbáltam. A mintavételezést csinálhatod csak 8 biten (gondolom lesz vmilyen frontend az ADC előtt majd, amivel erősítesz majd) és akkor működhet a végeredményed egy tárolós szkópként is (mondjuk 10k minta és marad még 10k a programodnak).
(#) csabeszq válasza csatti2 hozzászólására (») Jan 6, 2017 /
 
Ennek utánanézek.

A probléma kizárólag a legmagasabb mintavételi frekvenciáknál jön elő. Alacsonyabb frekvenciáknál lehet mintavételezni egyet innen, egyet onnan. Amikor 1MHz körüli jeleket kell mintavételezni, ott nincs elég idő két mintavétel között, hogy joystick lekérés is legyen.

Ilyenkor lehet megoldás pl. az injekted mód, vagy a joystick tiltása és csak tűzgombra ébred fel, akkor nem várja tovább a trigger jelet.

Attiny85-tel is lehetne a joysticket mérni, de igazából az a lényeg, hogy ne bonyolítsam túl az elektronikát. Kis LCD, kis csavaros doboz, USB kábel, az egész vacak elfér a kezemben, nem megalomán láda, hanem apró praktikus kütyü, lehetőleg filléres cuccokból.
(#) csatti2 válasza csabeszq hozzászólására (») Jan 6, 2017 /
 
1MHz körüli jeleket nem fogsz vele mintavételezni, mert nem fog belőle semmi sem látszani. Egyrészt mert az aliasing filtered letörési frekvenciáját vhova 500kHz köré kellene méretezned, mivel az az a frekvencia amiből még láthatsz is majd vmi használhatót (interleavinggal kb. 4 mintavétel jut egy ciklusra ilyenkor). Másrészt mert két mintából nem lesz jelalak.
(#) csabeszq hozzászólása Jan 7, 2017 /
 
Felraktam néhány képet a készülő szkópról. Egyszerű elektronikát szánok neki, egyelőre csak az LCD grafika van valamelyest kész, főként kamu adatokkal dolgozik.

Részei:
- 2xPGA (programozható erősítésű műveleti erősítő MCP6S21), ahol a VREF-et 1.8V-ra kötöm. Ez rail-to-rail erősítő gigaohm körüli belső ellenállással és SPI-vel programozható visszacsatolással. Filléres cucc, valami 250Ft-ért vettem. Amint látható, a 0V-om 1.8V-on lesz. Két csatornát lehet mérni vele egyszerre.
- 1.8V-os REF: TL431 (2.5V) után rakok egy diódát 0.7V, utána egy 220 ohm körül ellenállást, remélem elég lesz. - a bemeneteket 10-zel osztom: 100k / 1 MOhm, amit szükség esetén a PGA visszaszoroz maximum 32-vel
- beraktam még +1 100µF-es kapacitást, még látni kellene, hogy szükséges-e
- a képen az alsó részen van a jelanalizátor csatlakozója, SPI fejlesztésnél nem hátrányos, ha látom, hogy mi van a vonalakon. Ilyenkor vissza kell venni a frekvenviát, hogy beleférjen a 12MHz-es tartományba
- van még egy joystick tűzgombbal és kész
- a tápot USB-ről, esetleg power bankról kaphatja

Sok elektronika nem lesz, bár a vezetékek így is keresztül-kasul fognak menni.
Átlagot, min-max-ot, effektív értéket és jelalakot fog mérni, különféle triggerekkel.
A hozzászólás módosítva: Jan 7, 2017
(#) Kovidivi válasza csabeszq hozzászólására (») Jan 7, 2017 /
 
A TL431-es referenciát a diódával nem lehetne valahogyan kiváltani? Nem tudom, de én soros diódát nem raknék referenciához. Annak nagy a hőmérséklet függése.
A hozzászólás módosítva: Jan 7, 2017
(#) rascal válasza Kovidivi hozzászólására (») Jan 7, 2017 /
 
A dióda és ellenállás helyett pl. egy sima ellenállásosztó szerintem is jobb lenne a tl431-ről hajtva.
(#) Kovidivi válasza rascal hozzászólására (») Jan 7, 2017 /
 
Én is erre gondoltam. Talán az ADC nem terheli be a referenciát, vagy pedig konstans terhelésként viselkedik. TL431-et egyébként is be kell terhelni minimum 1mA-rel, hogy jól tudjon stabilizálni, ez lehet a feszültség osztó.
(#) csatti2 válasza csabeszq hozzászólására (») Jan 7, 2017 /
 
Nem egészen értem ezt a tL431 dolgot. Ha virtuális föld kell, akkor csinálj műveleti erősítővel. A diódás, illetve ellenállás osztós megoldás hátránya (amit TL431 -el csinálnál), hogy vagy nagy lesz az impedancia, vagy pedig függ az áramtól és hőmérséklettől a referenciád feszültsége. Nézd meg a példámat (a plusz alkatrészek az esetleges oszcillációt akadályozzák meg).

Ha ragaszkodsz a külső referenciához (a belső is jó szerintem), akkor kombinálhatod a kettőt és TL431, feszosztó, majd műveleti erősítővel kis impedanciás forrás.
(#) cimopata válasza csatti2 hozzászólására (») Jan 7, 2017 /
 
TL431 referenciának eléggé a legalja.
(#) csatti2 válasza cimopata hozzászólására (») Jan 7, 2017 /
 
Tudom (viszont a diódával sikerült még jobban elrontania). Gyanítom, hogy a beépitett is van olyan jó mint az.
A hozzászólás módosítva: Jan 7, 2017
(#) rascal válasza Kovidivi hozzászólására (») Jan 7, 2017 / 1
 
Én úgy értelmeztem azt az 1mA-t, hogy a tl431-en kell annyi áramnak minimum átfolynia a stabil működéshez. Tehát a meghajtásának kell olyan erősnek lennie, hogy a tl431 felé akkor is meglegyen az 1mA, ha a mellette levő "terhelés" éppen a maximális fogyasztását produkálja.
(#) csatti2 válasza rascal hozzászólására (») Jan 7, 2017 /
 
Jól értelmezed.
(#) rascal válasza cimopata hozzászólására (») Jan 7, 2017 /
 
Ne már, nekem meg van egy marékkal... Megfizethetőbe mit javasolnál helyette?
(#) csatti2 válasza csabeszq hozzászólására (») Jan 7, 2017 /
 
Mint mondtam azok elhanyagolhatóak. A feladatuk a kapacitív terhelések esetén esetleg kialakuló oszcillációk megakadályozása. A 2 ohmos ellenállás feladata, hogy lefojtsa az oszcillációt, a 10k-s ellenállás a kondival pedig megszünteti a DC ofszetet, amit a másik ellenállás okoz az áram függvényében.

Hmm. Hová tűnt a hozzászólás?

Kellett egy kis feszű virtuális föld (kb. 0,1V), amivel egy nagy impedanciás kimenetű IC-nek szántam, aminek a kimenetét betoltam az utána következő műveleti erősítő bemeneti tartományába (0,03V alatti jeleket elveszteném nélküle).
A hozzászólás módosítva: Jan 7, 2017
(#) rascal válasza csatti2 hozzászólására (») Jan 7, 2017 /
 
Vedd úgy, hogy én kérdeztem.
(#) csabeszq válasza csatti2 hozzászólására (») Jan 7, 2017 /
 
Lehet, hogy első menetben kihagynám az oszcilláció fojtását.
(#) csatti2 válasza csabeszq hozzászólására (») Jan 7, 2017 /
 
Hagyd ki nyugodtan. Csak ilyen példám volt hirtelen.
(#) Kovidivi válasza rascal hozzászólására (») Jan 7, 2017 /
 
Én úgy szoktam, hogy ha elhanyagolható a terhelés, mint pl. az ADC referenciája, akkor minimum 1mA folyik a TL431-en, de inkább több.
(#) csabeszq hozzászólása Jan 8, 2017 /
 
Nagyon elszállt a kódméret STM32 alatt C++-ban.

Az egyik absztrakt osztály üres virtuális destruktora szimplán 2kb-tal nyomta meg a kódméretet.
A vtable amit a gcc gyárt 20%-a komplett kódnak.

Ti szoktatok virtuális osztályokat csinálni, vagy mi kell ahhoz, hogy ne triplázzuk a kódméretet?
Nálam elég dinamikusan nő a kódméret egy új osztály hozzáadásával...
(#) Balázs válasza csabeszq hozzászólására (») Jan 8, 2017 /
 
Ami a kódméretet (és a futásidőt) drasztikusan meg tudja növelni C++-ban, az tipikusan a kivételkezelés. Azt érdemes letiltani. Illetve most ugye megvan a lehetőséged egy tisztán virtuális függvény meghívására, ezért valószínűleg hozzáadja a pure virtual function call kezelését. Bővebben lásd itt, "Provide a __cxa_pure_virtual() implementation" rész.
(#) csatti2 válasza csabeszq hozzászólására (») Jan 8, 2017 /
 
Nem biztos, hogy jó döntés olyan pici mikrokontrollerbe C++-ban programozni. Sima C-vel jobban járnál. A C++ képességei úgysem jönnek ki ilyen méretben vagy éppen kockázatos használni, hisz simán megehetik a kicsi rendelkezésre álló memóriát.
(#) csabeszq válasza csatti2 hozzászólására (») Jan 9, 2017 /
 
Igen, a C++ nem java, pláne nem mikrokontroller alatt. Bár virtuális osztályok készíthetőek, de ha 1-2 metódus különbözik, akkor nem új osztályt csinálunk, hanem callback-ezünk, esetleg template-ezünk. Javaban ugye nincs callback, ezért rááll a kezem a virtuális osztályokra. A probléma, hogy mikrovezérlő alatt ettől elszabadul a pokol kódméretben.

Kevés virtuális osztály kevés probléma.
A hozzászólás módosítva: Jan 9, 2017
(#) silent15 hozzászólása Jan 9, 2017 /
 
Sziasztok!

Egy olyan kérdéssel fordulnék hozzátok, hogy szeretnék előállítani egy xMhz-es megszakítást, amihez egy adott kódot rendelnék. STM32-ről lenne szó Atollic környezetben. PIC-nél tudtam olyat hogy bekonfiguráltam a timert hogy miként számoljon, majd csináltam egy megszakítást, ami a timer túlcsordulásánál triggerelt, és akkor elvégezhettem azt a pár parancsot, amit szerettem volna. Ugyanezt szeretném megcsinálni, csak STM32-vel. A neten talált tutorialok nem teljesen tiszták nekem, illetve az egyik teljes ( ez ) nem működik, de nem értem miért. Valaki el tudná nekem magyarázni, hogy hogyan lehet ezt itt megoldani?

Köszönöm!
(#) cpt.zoltan.simon válasza silent15 hozzászólására (») Jan 9, 2017 /
 
Ha arra van szükséged hogy X időnként egy megszakítás az elég egyszerű.
Upcounter mod nulláról n-ig. AHB órajelből annak tovább osztásából (léptető jel) ki lehet számolni mit szeretnél.
Annyit fűznék hozzá, hogy én a PLL minden egyes pontját a Clocks.(ez, az, amaz) struktúrában tárolom, mikor melyik perifériának ami éppen kell, onnan számolja ki saját magát. Tehát a Clocks.APB1TimersFreq az vagy 60, vagy 30MHz (most nem emlékszem melyik mennyi lehet de ezek max értékek az adott domain-hez) 120Mhz core órajel mellett.

  1. //Timer3 Setup
  2. void InitTimer3 (void){
  3. RCC->APB1ENR |= (1<<1); //Enable Timer3
  4. //BaudRate:
  5. TIM3->PSC = 100 * Clocks.APB1TimersFreq;        //1Mhz time base (100us)
  6. TIM3->CR1 = CKD(0) | APRE(1) | CMS(0) | DIR(0) | OPM(0) | URS(1) | UDIS(0) | CEN(0);
  7. TIM3->ARR = 2500;       //100us * 2500 = 0.25s
  8. TIM3->DIER |= 0x01; //Update interrupt enabled
  9. NVIC->ISER[0] |= 0x20000000;    //Timer3 Global Interrupt Enabled
  10. }
A hozzászólás módosítva: Jan 9, 2017
(#) silent15 válasza cpt.zoltan.simon hozzászólására (») Jan 9, 2017 /
 
Köszönöm! Most sajnos nem vagyok eszköz közelében, de holnap kipróbálom
Következő: »»   82 / 175
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem