Zaslal: po listopad 07 2022, 12:54 Předmět: Arduino PWM regulátor
dobrý den. Postavil jsem si PWM regulátor k řízení modelové železnice s použitím Arduino Nano, PWM-modul s L298N a s OLED displejem 0,96" žluto-modrý I2C. Zapojení používá páku zrychlení - jízda - brzda a 2 tlačítka pro směnu směru, pokud je PWM na Stop. Zařízení funguje, bohužel v nepravidelných intervalech zamrzá displej a řízení rychlosti nebo brzdy je jakoby zrychlené. Interval této chyby je velice náhodný, někdy je to i po několika minutách a nemá to nic společného s rušením (asi), zkoušel jsem samotné Arduino Nano pouze s přepínačem jízda-brzda a s displejem OLED. Nastává stejná chybová situace. Vyzkoušeno již druhé Arduino Nano - dnes nové. precizní klon. Je možné, že je to chybou v programu? Kód je v příloze.
Těžko říct, je to tak trochu věštění z křišťálové koule, může být chyba třeba v té grafické knihovně, ale spíš to vypadá jako by přímo na ten displej… Zkus mu dát víc času (o něco snížit obnovovací frekvenci), a/nebo mu dát více času mezi jednotlivými grafickými povely (pár milisekund, oko si toho nevšimne, ale mu to může stačit). Dej pak vědět.
Pokud tam máš volné vývody, uprav program a rozsvěcuj na nich LEDky. Pak uvidíš, kde se program zakousne. Budou to takové pastičky.
U standardních mikrořadičů (třeba PIC) je watchdog, který je schopen zresetoval procesor. Ale není to řešení příčiny, nýbrž následku. Je-li watchdog i u Arduina, to nevím - nikdy jsem to nepotřeboval. Ale určitě tuto informaci někde najdeš.
Založen: Dec 12, 2005 Příspěvky: 2558 Bydliště: SR, Poprad
Zaslal: po listopad 07 2022, 18:19 Předmět:
prva vec, nikdy nepouzivaj delay. nahrad ho kontrolou na millis. dalej si pozri, ake casovace a prerusenia kniznice pouzivaju - ci sa navzajom nebiju. _________________ No vidis, a tak si sa bal
Ten dlouhý loop() lze rozdělit na menší kousky, které lze lépe odladit. Např. dočasně zakomentovat "//". Ideově nějak takto:
kód:
void my_control (void);
void my_display (void);
loop()
{
my_control();
// my_display(); tady to je zakomentováno, dočasně se neprovádí
}
void my_control (void)
{
...
...
...
}
void my_display (void)
{
...
...
...
}
Jak psal "pocitujlasku", delay() ve funkci loop() nahradit za millis(). Vysvětlení: delay() je pasivní čekání, kdy MCU stojí a nic nedělá. V mnoha případech je lepší mít "časový flag" a např. funkci pro display volat jen co 500ms. Ideově nějak takto:
kód:
void my_control (void);
void my_display (void);
int16_t time_is, time_mem1;
loop()
{
time_is = (int16_t) millis();
my_control();
if ((signed)(time_is-time_mem1-1000)>=0)
{
time_mem1 = time_is;
// tento kód běží 1x za sekundu
my_display();
}
delay() nemusí byť problém, ak sa zvyšná časť programu vykonáva v vždy v rovnakých intervaloch. Ale on tam čaká na nejakú odpoveď od displeja a nie že čaká, ale vykonáva kód medzi do a while, kým sa nestrafí do nejakej nulovej odpovede z oled_1.nextPage(). Nechce sa mi študovať, čo tá funkcia robí a vracia, ale nezdá sa mi, že je to v poriadku. Takže celý chod programu je závislý od nejakých nálad displeja.
delay caka, toto bezi stale a tak napr. reaguje na tlacidla hned. v pripade delay by si ho musel drzat min. taky cas ako je delay, aby prebehol cyklus a precital si stav tlacidla.
a tymto vyriesis aj to, ak ti napr. display neodpoveda. tak jednoducho ti na chvilu zatuhne, ale zbytok programu pobezi dalej.
Este take upozornenie, ten millis pretecie za necelych 50 dni. s tym je potrebne pocitat v programe. idealne obcas ten procak resetnut. _________________ No vidis, a tak si sa bal
Existuje fix tohoto problému. Pokud se číslo v podmínce if(...) porovnává jako signed int potom přetečení proměnné "integer" není problém. Lze to dohledat na webu. Kdysi jsem to zkoušel v debugeru na int16_t a fungovalo to.
Založen: Dec 12, 2005 Příspěvky: 2558 Bydliště: SR, Poprad
Zaslal: st listopad 09 2022, 8:39 Předmět:
samec: tak samozrejme, nedavat tam nikde while, ale kontrolu cez if. To som bral ako samozrejmost, ze nedam nikde while (nieco bude pripravene), ale if (nieco je pripravene)
while jedine v setup, kedy cakam, kym sa inicializuju vsetky komponenty, aby sa program spustil az ked bude vsetko ok.
bdn: to som neskusal, arduino pouzivam skor na take doplnkove veci, kde nevadi, ze sa obcas restartne, na napr. riadenie kurenia by som ho urcite nepouzil. _________________ No vidis, a tak si sa bal
Děkuji všem za odborné rady, bohužel s Arduinem teprve začínám, takže mnoha věcem ještě nerozumím. Pákový ovladač jsem zatím odložil a bleskově jsem vyrobil PWM s potenciometrem, Arduino Nano zůstalo, OLED jsem nahradil LCD 16x2 I2C. Vše funguje bez problémů, velice pomalá jízda vlaků je skvělá. Zítra zde dám pár fotek.
Rozhodně zde chybí schéma a výpis celého programu a jake vládáni chce mít zadavatel aby fachalo !!!!
potom by bylo snadné napsat jednoduchý program i pro nováčka . _________________ Můj e-mail: elnovy@email.cz
Bydliště: JČ
Povolání: Vývoj elektroniky+DPS
Zájmy: Programování C++ ,assembler
Nemůžete odesílat nové téma do tohoto fóra. Nemůžete odpovídat na témata v tomto fóru. Nemůžete upravovat své příspěvky v tomto fóru. Nemůžete mazat své příspěvky v tomto fóru. Nemůžete hlasovat v tomto fóru. Nemůžete připojovat soubory k příspěvkům Můžete stahovat a prohlížet přiložené soubory
Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.