Fórum témák
» Több friss téma |
Fórum » STM32 Discovery Kit programozása
Témaindító: lolhun1988, idő: Feb 11, 2011
Tovább írtam a programot de megint belefutottam egy érdekes dologba:
A beolvasott poti feszültségét szeretném kiírni 7 szegmenses kijelzőre. Ha simán a 4096-ot írnám ki és nem játszok a leosztással akkor szépen mutatja a beolvasott értéket +/- 1 ingadozással ez normális is. Viszont amikor próbálom leosztani 0-3,30V kijelzésre (persze a tizedes pont egyenlőre még nincs a progiban) egyszer jó értéket mutat pl 0,63V a következő frissítésnél felugrik 1,32V-ra. Utána ismét vissza 0,63V-ra látszólag teljesen random időközönként. Ha a cucc változóba fix értékeker töltök pl 322, 323... akkor semmi baj a kijelzéssel szépen kiírja hogy 0,26V ugrálás nélkül. Teljesen mindegy milyen állásban van a poti mindig bevillan egy jóval nagyobb érték. Nem értem hol hibázik a program.
A hozzászólás módosítva: Feb 12, 2016
Közben rájöttem a baj az volt, hogy a main loop-on belül kellett volna deklarálnom a változót így már jól adja mindig az adatokat. Bár nem tudom ez miért van.
Csináltam 1-2 érdekes mérést kíváncsi voltam mennyire gyorsan végez az ADC. Ha nem végzek figyelést hogy mikor van kész az átalakítás akkor 300ns alatt már kaphattam eredményt. Visszarakva az EOC flag figyelését viszont 1,6us. Adatlap 12 biten 1us-t ír kíváncsi lennék azt hogy mérték.
A hozzászólás módosítva: Feb 12, 2016
EOC: End of conversion flag
This bit is set by hardware at the end of each conversion of a channel when a new data result is available in the ADC_DR register. It is cleared by software writing 1 to it or by reading the ADC_DR register. 0: Channel conversion not complete (or the flag event was already acknowledged and cleared by software) 1: Channel conversion complete
Tudom ennek ellenére ha kihagytam akkor is megkaptam az eredményt a kijelzőn. Kérdés az mennyire pontos. Érdekes...
A hozzászólás módosítva: Feb 12, 2016
Amíg nem végez a konverzióval addig nem frissíti a DR-t.
Tehát kiolvashatod, csak felesleges, mert a régi érték lesz benne, amit már előtte kiolvastál.
Értem köszi, így akkor már más a helyzet.
Lenne másik kérdésem. Összeállt a program nyáktervezésnél tartok és a referencia feszültséggel vagyok bajban. Előállítok +2,5V referenciafeszültséget de nem vagyok biztos hogy melyik lábra is kellene kössem. 64 lábú procinak van külön lába VREF bemenettel én viszont a TQFP32 -es STM32F030K6T-t választottam amiben van egy VDDA de VREF nek nem látok semmi mást.
VDDA itt most a ADC referenciája is egyben? Ha megtáplálom 2,5V referenciával akkor ahhoz mérten végzi az átalakítást? Van egy ilyen hogy vrefint channel. Az micsoda? A hozzászólás módosítva: Feb 17, 2016
Üdv.
Játszok ezzel a rossz, STM Studio-val de lehetetlen dolgokat írkál ki. A regiszterek értékét szerettem volna kiolvasni de teljesen lehetetlen érték az összes. Pl ott van a current_dis1 amit 0-ra írok és mégis hülyeségeket ír. Alatta a inic valójában 1 és arra is hülyeség. Miért van ez? Nem értem én azt a programot a neten meg alig vagy nincs is infó róla. A hozzászólás módosítva: Ápr 13, 2016
Üdv.
ADC-vel szeretnék mérni értéket de egész nap ne jutottam semmire. Az ADC folyamatos mintavételi módban megy. A timer3-at 10ms periódusidóval hívom meg ami egyben a 7 szegmenses kijelző frissítése is. Miért van az hogy ha a """aram = ADC1->DR; """ (19. sort) a megszakításba rakom be akkor nem jönnek az adatok viszont ha kirakom a main függvénybe akkor jól megy?
A hozzászólás módosítva: Ápr 28, 2016
Bár rég nem foglalkoztam vele így, de az ADC-t el kell indítani, megvárni amíg lefut és olvasni csak utána? Bár én DMA-val csináltattam szerintem.
Ezek után kezdődik a while(1). Igazából ha simán a main függvénybe teszem a aram = ADC1->DR; sort akkor működik szépen és adogatja az adatokat a kijelzőre viszont ha berakom a timer megszakításába ahol a kijelzőt is frissítgeti 10msec-el akkor nem jönnek az adatok hanem a kezdeti 0 értéket jelzi. Nem lenne szükségem minig ADC mintára így az adc-t úgy állítottam be hogy folyamatosan vegyen mintát egyenlőre csak erről az egy csatornáról és mindig írja felül az előző értéket.
A hozzászólás módosítva: Ápr 28, 2016
ADC inicializálás:
Ha megszakításba teszed akkor törlöd a megszakítás bitet? Az ADC_FLAG_EOC-t megvárod?
Üdv.
Sikerült megoldanom a problémát. Olyan kérdésem lenne, hogy egy felprogramozott procit, hogyan tudom lezárni hogy utána már ne tudják kiolvasni belőle a kódsort és esetlegesen sokszorosítani? Esetemben pl a uVision 5.0 használok. be lehet ennél valahogy állítani ezt? köszi
Lenne 1 véletlen szám generálás feladatom!
Tudnátok segíteni, megoldani? Adott 1 STM32F103: 20bites, 72MHz-vel ketyegő SYSTICK számlálója. SysTick interupt = 0.1ms, 10kHz Ezzel hogyan lehetne véletlen számot generálni mondjuk 10ms-ként (100Hz) 0...7-ig? Minél gyorsabban, mert timer megszakításban kellene elvégezni! Köszi! A hozzászólás módosítva: Aug 2, 2016
Igy próbáltam:
De állandóan csak 2 szám váltakozik! A hozzászólás módosítva: Aug 2, 2016
Szia!
Csinálj gyűrűs számlálót. Mondjuk 8 bites értéket elrotálsz felfelé, a legalsó bit meg a byte.5 és byte.7 EXOR kapcsolata legyen. Aztán kiveszed magadnak valahonnan a 0-7 értéket. Valami kezdőértéket is adhatsz, arra kell vigyázni, hogy csupa 0 ne legyen, akkor a bejövő bit 1 legyen. Álmoskönyvek szerint pl. 5-bites regiszternél a 31 variációhoz a byte.2 és byte.4-et kell XOR-al visszavezetni a bemenetre, de hosszabb regiszterekkel is lehet próbálkozni, az a lényeg, hogy az utolsó és egy belső bit XOR menjen vissza.
Köszi!
Nem igazán értem, de próbálkozok! Eddig van két számlálóm. Egyiket sem piszkálhatom, csak ki olvashatom! HardWares, 20bites 72MHz-vel halytva: SysTick->VAL Ami számol: 0 – 7200-ig. SysTick_SetReload(7200); // SysTick interupt = 0.1ms, 10kHz És van egy 32bites interupt számlálóm: „ sysTick” amit 0.1ms-ként növelek 1-el! Akkor ezekkel kellene valami EXOR műveletet végezni? A hozzászólás módosítva: Aug 2, 2016
Számlálókkal csak akkor van esély, ha különböző forrásból táplálod azokat (SysTick a rendszer órajel - a külső kristállyak satbilizálva, egy másik Timer pedig RC oszcillátorról járatva. A kettő közötti csúszkálás (jitter) többé-kevésbé véletlennek tekinthető.
Analóg jelforrások zajából is generálható valódi véletlenszám. Itt találsz egy érdekes társalgást a véletlenszám generálásról, benne ötletek és mintapélda is.
Köszi!
De az analog mérés túl sok órajel, és még bizonytalan is a hossza! Össze hoztam egy ilyen rutint, a 2 számlálóból:
És az eredmény, RND a +x:
Szerintem megfelelő!?
Van pár variánsa a véletlenszám e-módon előállítására, de az alap ugyan az, egy hosszú shiftregiszter kimenete és egy belső bit XOR kapcsolata lesz a bemeneten.
wiki RND
Köszi neked is! De!
Előzőleg már többször le írtam, hogy ez timer időzítésben fut. Tehát fontos, hogy ismert legyen a müvelet hossza, és lehetőleg rövid legyen. Ezért nem lehet benne while(?) Ciklus, aminek előre ismeretlen a hossza. Úgy nem tudom kalkulálni a timer kezdőértékét. timer 1 órajel= 72MHz-vel az 1/72= 0,0138888888888889 nanoSec Ismernem kel a megszakítás kezdete és a timer újra töltése óta leketyeget órajeleket, hogy ki tudjam vonni a számláló kezdő értékéből. Különben kontrolálhatatlan lesz a véletlen szám értéke! És így a timer megszakítások közötti impulzusok hossza is. A hozzászólás módosítva: Aug 3, 2016
Ezt nem kell nX meghívni, csak minden Timer INT-kor 1x. (persze gondoskodni kell a regiszternek használt változó értékének megmaradásáról). Tehát annyi van Tint-ben, hogy rotálsz és 2 bit XOR eredményét beteszed a 0. helyre és kiolvasod a "regiszter" értékét, aztán mehetsz is vissza. Tehát ez a megoldás minden meghívásra ad egy véletlenszámot időtől függetlenül. Közben eszembe jutott a négyzetközép-összeg megoldás is, de vagy 15 éve használtam utoljára. Valami olyan, hogy a pl. 16-bites számot négyzetre emeled és jobb/bal 4 bitet hozzáadod a középső 8 bithez. Itt is figyelni kell a 0000 értékre, az tiltott. Mindkét megoldásnak kalkulálható a hossza, max 2 értékre (0000 kivétel teljesülése/nem teljesülése okoz pár utasítás eltérést)
Várjunk csak! STMF103 tartalmaz belső hőmérőt. Rémlik valami olyan, hogy a belső hőmérő (ADC) XOR Systick timer. Valami 5-6.5 bit entrópiáról beszéltek, így egész kiegyenlített volt a véletlen számok spektruma. Bár nem tudom, mi a konkrét feladat, számít-e a statisztikai egyenletesség vagy ugrások is lehetnek benne... Szóval ha nem esik ki az ADC-vel való mérés, akkor talán segít. (ha, ahogy írtad, túl sok órajel, a mérést el lehet ám kezdeni valahol máskor, az a lényeg, hogy neked INT-nél már legyen eredményed...valami).
Na, most már bogarat tettél a fülembe, mi is lesz ez
Köszi, a türelmedet!
Az este már fáradt lehettem, hogy jobban bele gondoljak a tanácsodba! Ki fogom próbálni! Az RND ellőre gyártása már nekem is be ugrott! Illetve a timer elindítása után már van időm a következő jel feldolgozásáig. (Ez fény sebesség mérő akar lenni!)
Végül ezt szedtem ki a Wikiböl:
És ez tényleg jobb eredményt produkált:
Még egyszer Köszönöm a segítséget!
Sziasztok!
Hobbi szinten foglalkozok STM32 programozással. STM32F429 boardon játszadozok az ST-s framework használatával. Amit szeretnék az egy egyszerű program amivel az ADC-t szeretném a TIM2 időzítővel triggerelni bizonyos időközönként. Mondjuk 1ms-onként. Van valakinek erre működő kódja, megoldása, segítsége? Nézegettem neten kódokat, de nekem nem működik. Jelenleg olvasgatom az ST-s függvényeket + regisztereket. Pár dolog még nem világos. Nagy segítség lenne a működő kód. Bárminemű segítséget köszönök.
Letöltöd:
STSW-STM32138 Csak 1 regisztrácio! És megtalálsz mindent! A hozzászólás módosítva: Szept 20, 2016
|
Bejelentkezés
Hirdetés |