Časování pro primitivní dvojitý H-můstek

Odpovědět
Uživatelský avatar
gilhad
Příspěvky: 264
Registrován: 29 kvě 2015, 00:36
Kontaktovat uživatele:

Časování pro primitivní dvojitý H-můstek

Příspěvek od gilhad »

tl;dr; jak na AVR atmega328 rozjet až 8 PWM signálů se zaručeným odstupem mezi některými dvojicemi.

Ahoj, chtěl jsem se zeptat, jestli někdo nuž něco podobného neřešil (nebo neviděl řešení) - zatím při hledání narážím jen na přístup "kup si to od profesionálů" (a nesnaž se moc pochopit, jak to funguje uvnitř), nebo "když se to udělá takhle a nezatíží se to moc, tak je to sice ne zcela dobře, ale nějak to funguje" (protože se to nezatíží moc a trochu chyb to ustojí). A vlastní vývoj mě zavádí do tolika slepých uliček, že si připadám jak Jára da Cimmermann (vždycky nakonec vymyslím, jak se mi moje řešení může rozbít). Ale chtěl bych si to postavit vlastníma silama a zároveň tomu rozumět, být si to schopen opravovat upravovat a být si celkem jist, že mi to náhodně neshoří (jako už tolikrát).

V principu je H-můstek strašně jednoduchý - 4 tranzistory, jeden motor a jedeme. Pak se to trošku zkomplikuje když chceme větší napětí a proudy, ale to se dá třeba přez optočleny celkem snadno. Taky tu jsou větší špičky a zpětné proudy, něco pořeší silnější tranzistory, neco zpětně diody a kondenzátorky než ty diody naběhnou. Horší je to s časováním, obzvláště v režimu brzda-plyn, kde se střídavě zapíná horní a dolní tranzistor půlmůstku - jasné je, že se nesmí zapnout naráz, jinak zkrat napájení na zem a příslušné efekty. Problém je, že intuitivní řešení (tak tam dám inventor a tudíž nebudou moct být zapnuté oba naráz, vždy jen jeden) tak docela neplatí. Protože třeba takový tranzistor https://www.gme.cz/darlingtonuv-tranzistor-tip147-to247 vypadá skvěle, ale plné otevření zvládne za 0.9us, zatímc zavřít se mu trvá 4us. Takže když jedním signálem je překlopím, tak tam aspoň 3.1us mám krásný zkrat zhora dolů, i když by měl být podle napetí na bázi jeden "otevřený" a druhý "zavřený". (no, párkrát to třeba snese, ale hnát to tam tak trvale v desettisících za sekundu mi už nepřijde zcela OK. Takže správný postup vidím na "zavři dolní", "počkej tak 5us", "otevři horní" (a při cestě zpět obdobně).

Stejně to bude samostatný modul, proč to neřídit třeba arduinem, to má nožiček dost a určitě to upočítá, ne? No právě že mi nějak nevychází, jak to upočítat bezpečně. Z PWM to přímo neodvodím (navíc 8 PWM nožiček stejně nemám), takže tak trochu ručně. Mám tam dva timery, každý má dva komparátory, nastavím počítání do 100 a zpět (takže prostě zadané procento dám do registru rovnou, paráda), pověsím tam přerušení na ty komparátory, co bude tak těch 5us od sebe (trochu to poladím s nulou a stovkou, aby to nepreteklo, rekněme, že pojedu do 110 a těch 10 je prostě rezerva, když budu ctít plné napětí furt, dám to jako extra případ). Při náběhu první A vypne a B zapne, při odběhu B vypne a A zapne, krása nebeská, dokud nebudu chtít navíc dělat to samé i tomu druhému motoru a navíc komunikovat s nadřízeným počítačem (o měření motoru ani nemluvě). Protože v tu chvíli se mi tam začnou rojit i jiné interrupty, zpracuje to jen jeden naráz a až pak další, co přišel mezi tím a až pak ještě další, co se schumelil taky a když ten třetí v řadě bude "vypni", tak už bude znatelně opožděný proti plánu, ale "zapni" přijde třeba přesně na čas a tedy hned po něm. A co bude za komunikační bordel na sběrnici a kolik času sežere jeho odbavení si netroufnu předem hádat s dostatečnou jistotou. A 5us to je tak 80 instrukcí, to je pryč hned, zase to nechci nechat čekat uvnitř interruptu v dost dlouhé smyččce, protože nejspíš bude chtít něco dělat i druhý motor (a často to bude chtít dělat stejně jako ten první, stylem "oba motory na XY% a jen dorovnávat odchylky od kurzu")

Má někdo nějaký zajimavý nápad, jak tohle vtipně pořešit? (teď přemýšlím o tom, řídit oba motory jedním časovačem a druhý nechat v krátké smyčce odpočíst ten časový úsek, ať už začne kdekoli, ale nějak se mi to tam komplikuje s tím, že nové nastavení se akceptuje pouze při průchodu nulou, zatímco bych to potřeboval nastavovat průběžně. A dát si přerušení "na každý krok" a pak jen čítat kroky mezi mi přijde už jako hodně velká zhůvěřilost a nesmyslné vytížení procesoru většinou ničím (asi tak v 96% případů).
pgerla
Příspěvky: 400
Registrován: 11 dub 2013, 00:17

Re: Časování pro primitivní dvojitý H-můstek

Příspěvek od pgerla »

Pokud stavíš H můstek co ti brání před invertor přidat kondenzátor s odporem + schmittův klopný obvod, co ti zpozdí signál ? Na 5uS ti to bude stačit ;)
Odhadem R = 5,6K C = 1nF
aladin
Příspěvky: 338
Registrován: 12 kvě 2013, 06:43

Re: Časování pro primitivní dvojitý H-můstek

Příspěvek od aladin »

fischertip.cz, Stavebnice.com, MerkurRobot.cz, KlubTechniku.cz
DavidO
Příspěvky: 1138
Registrován: 01 kvě 2013, 21:27

Re: Časování pro primitivní dvojitý H-můstek

Příspěvek od DavidO »

Můžeš to udělat s pomocí jednoho timeru, který bude obsluhovat frontu událostí (zacyklenou). Každá událost bude představovat časový okamžik, kdy je třeba provést změnu oproti předchozímu stavu a způsobí nastavení na nový stav. Stav je popis toho, co vystavit na všechny výstupy, událost nebude zajímat, jestli se něco mění nebo ne a prostě to vystaví. V případě pokynu shora k jinému plnění na libovolném motoru přepočítáš ty události a sestavíš novou frontu. Komunikaci s nadřízeným vyřídíš standardně v interruptu pro ten který způsob komunikace, v něm si ale jen poznamenáš, co šéf chtěl a vrátíš se do hlavní smyčky, kde budeš sestavovat tu frontu, zatímco tě bude přerušovat vyřizování timerů pro frontu i pro komunikaci, ale to nevadí. Jakmile budeš mít frontu připravenou, počkáš na dokončení jedné celé obrátky té staré a v tu chvíli je vyměníš. I kdyby to předpočítávání trvalo déle, nevadí to, fronta bude pořád konzistentní a nebudou výpadky. Takhle se to dá udělat pro "téměř libovolný" počet výstupů.
Nikoho plánovaně neurážím. Jestli se Vám nelíbí co píšu, tak to nečtěte. A ostatně, třeba za to nemůžu - Researchers believe that dark humor can be a significant symptom of dementia.
Uživatelský avatar
gilhad
Příspěvky: 264
Registrován: 29 kvě 2015, 00:36
Kontaktovat uživatele:

Re: Časování pro primitivní dvojitý H-můstek

Příspěvek od gilhad »

Díky všem za pomoc :)

DavidO: Ještě si to budu muset promyslet, ale přesně tohle nakopnutí jsem potřeboval. Mě vlastně moc nevadí nedodržení časování (o trochu), pokud budou zaručeny minimální rozestupy, (což takhle budou). Zbytečně jsem se fixoval na obsluhu v interruptu, hlavní smyčka má některé velké výhody (hlavně ten zaručený odstup) a když se to správně nakombinuje, tak to půjde ukázkově. (to vystavení všech výstupů jsem plánoval taky, jako součást neprůstřelnosti proti zapomenutí něco nastavit za nějakých podmínek). Zkusím tady tak do týdne poreferovat o svém řešení.

aladin: Tohle je přesně to, co mi chybělo - ten člověk tam popisuje součástky a vztahy do detailů, které mi to plně objasnily a používá některé věci, které jsem dřív neznal. Na moje potřeby trošku overkill, ale tím správným způsobem, stejně se chystám ve verzi 2 udělat něco podstatně výkonnějšího, než teď a tam tohle už bude jen příčetně předimenzované :) Cítím se být osvícen ve svém hledání grálu :)

( googlit jsem zkoušel, ale spousta řešení je takto zjednodušených http://www.dharmanitech.com/2008/11/sma ... ethod.html , kde přesně může (a nejspíš i dochází) k těm zkratům při brzda/plyn, jen to projde díky malým výkonům a měkkým zdrojům)
DavidO
Příspěvky: 1138
Registrován: 01 kvě 2013, 21:27

Re: Časování pro primitivní dvojitý H-můstek

Příspěvek od DavidO »

Pěkné a pochopitelné (a hutné) čtení o H-můstkách je taky tady: H-Bridge Secrets. Jen se nenechte na první prolítnutí zmást jako já, co znamená open a close když popisuje ty stavy tranzistorů :oops:
Nikoho plánovaně neurážím. Jestli se Vám nelíbí co píšu, tak to nečtěte. A ostatně, třeba za to nemůžu - Researchers believe that dark humor can be a significant symptom of dementia.
pgerla
Příspěvky: 400
Registrován: 11 dub 2013, 00:17

Re: Časování pro primitivní dvojitý H-můstek

Příspěvek od pgerla »

Dík za odkaz a ještě víc autorovi za schéma.

Tohle jsem tu doporučoval + on to má doplněno diodou.
Zpožďovací obvod z rezistoru a kondenzátoru.
Obrázek
Odpovědět