Vítejte na Elektro Bastlírn?
Nuke - Elektro Bastlirna
  Vytvořit účet Hlavní · Fórum · DDump · Profil · Zprávy · Hledat na fóru · Příspěvky na provoz EB

Vlákno na téma KORONAVIRUS - nutná registrace


Nuke - Elektro Bastlirna: Diskuzní fórum

 FAQFAQ   HledatHledat   Uživatelské skupinyUživatelské skupiny   ProfilProfil   Soukromé zprávySoukromé zprávy   PřihlášeníPřihlášení 

Arduino PWM regulátor

 
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
stanix1



Založen: Oct 06, 2016
Příspěvky: 3

PříspěvekZaslal: po listopad 07 2022, 12:54    Předmět: Arduino PWM regulátor Citovat

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.


photo_2022-11-06_11-33-06.jpg
 Komentář:
 Velikost:  123.65 kB
 Zobrazeno:  129 krát

photo_2022-11-06_11-33-06.jpg



pwm_oled.txt
 Komentář:

Stáhnout
 Soubor:  pwm_oled.txt
 Velikost:  4.41 kB
 Staženo:  125 krát

Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
Mahoney



Založen: Oct 26, 2019
Příspěvky: 381

PříspěvekZaslal: po listopad 07 2022, 16:17    Předmět: Citovat

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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
petrfilipi



Založen: Sep 13, 2005
Příspěvky: 2639

PříspěvekZaslal: po listopad 07 2022, 16:19    Předmět: Citovat

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š.

PF
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
samec



Založen: Dec 19, 2017
Příspěvky: 4108

PříspěvekZaslal: po listopad 07 2022, 18:18    Předmět: Citovat

Toto je koncepčný problém tvojho kódu
kód:
  while(oled_1.nextPage());
A ďalší problém môže byť v hociktorej funkcii displejovej knižnice.

Preto je lepšie si naštudovať povely pre displej a napísať vlastné funkcie.

Mimochodom, s takto napísanou podmienkou to funguje len náhodou
kód:
if (Duty_Cycle < 255)
      Duty_Cycle=Duty_Cycle+5;
Ale pre vláčiky to nie je zlé. Horšie, keby to bolo pre cirkulár alebo ohňostroje.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
pocitujlasku



Založen: Dec 12, 2005
Příspěvky: 2152

PříspěvekZaslal: po listopad 07 2022, 18:19    Předmět: Citovat

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
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
bdn



Založen: Jan 16, 2020
Příspěvky: 467

PříspěvekZaslal: út listopad 08 2022, 17:50    Předmět: Citovat

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();
   }

}

void my_control (void)
{
   ...
   ...
   ...
}

void my_display (void)
{
   ...
   ...
   ...
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
samec



Založen: Dec 19, 2017
Příspěvky: 4108

PříspěvekZaslal: út listopad 08 2022, 18:38    Předmět: Citovat

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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
pocitujlasku



Založen: Dec 12, 2005
Příspěvky: 2152

PříspěvekZaslal: út listopad 08 2022, 21:54    Předmět: Citovat

kód:

unsigned long akcia1=0;
unsigned long aktcas=0;

loop()
{
  aktcas=millis();
   if (akcia1<akcas)
   {
      akcia1=aktcas+1000;
      vykonaj akciu;
   }
}

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
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
samec



Založen: Dec 19, 2017
Příspěvky: 4108

PříspěvekZaslal: st listopad 09 2022, 0:22    Předmět: Citovat

pocitujlasku napsal(a):
ak ti napr. display neodpoveda. tak jednoducho ti na chvilu zatuhne, ale zbytok programu pobezi dalej.
Ak "vykonaj akciu" obsahuje while(1), tak sa vykonania zbytku programu nedočkáš a ani keď tam dáš millis() miesto delay().
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
bdn



Založen: Jan 16, 2020
Příspěvky: 467

PříspěvekZaslal: st listopad 09 2022, 7:45    Předmět: Citovat

citace:
...millis pretecie za necelych 50 dni.

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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
pocitujlasku



Založen: Dec 12, 2005
Příspěvky: 2152

PříspěvekZaslal: st listopad 09 2022, 8:39    Předmět: Citovat

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
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
stanix31



Založen: Sep 01, 2013
Příspěvky: 10

PříspěvekZaslal: čt listopad 10 2022, 21:42    Předmět: Citovat

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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
stanix31



Založen: Sep 01, 2013
Příspěvky: 10

PříspěvekZaslal: pá listopad 11 2022, 15:44    Předmět: Citovat

Posílám slíbené fotky nového ovládače


photo_2022-11-11_15-11-18.jpg
 Komentář:
PWM s potenciometrem a LCD 16x2
 Velikost:  81.98 kB
 Zobrazeno:  83 krát

photo_2022-11-11_15-11-18.jpg



photo_2022-11-11_15-00-14.jpg
 Komentář:
 Velikost:  123.57 kB
 Zobrazeno:  88 krát

photo_2022-11-11_15-00-14.jpg



photo_2022-11-11_15-00-36.jpg
 Komentář:
 Velikost:  120.75 kB
 Zobrazeno:  91 krát

photo_2022-11-11_15-00-36.jpg


Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
elnovy



Založen: Jul 04, 2010
Příspěvky: 789

PříspěvekZaslal: st listopad 16 2022, 7:02    Předmět: Citovat

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 . Question Idea Arrow Neutral

_________________
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
Zobrazit příspěvky z předchozích:   
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
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

Powered by phpBB © 2001, 2005 phpBB Group
Forums ©
Nuke - Elektro Bastlirna

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.


PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Čas potřebný ke zpracování stránky 0.20 sekund