Stránka 1 z 1

Krokování frekvence u Arduino UNO

Napsal: 06 zář 2021, 16:48
od QRocky
Ahojte, potřeboval bych u Arduina nastavit frekvenci u PWM pinu cca 46 Hz, ale být schopen ji pak krokově jedním tlačítkem zvyšovat a druhým snižovat o cca 0,1 Hz, či dokonce o menší rozdíl.

Snažil jsem se použít PWM.h ( https://codebender.cc/sketch:211750#PWM ... xample.ino ), ale tam lze frekvenci měnit pouze celočíselně.

Nemáte někdo nějaký tip, jak na to?
střída bude 50%, chci měnit jen frekvenci PWM.
Ta by měla být v rozsahu cca 45 - 110 Hz.

Jedná se o regulaci motoru pro gramofonový přehrávač.

Děkuji

Re: Krokování frekvence u Arduino UNO

Napsal: 06 zář 2021, 16:52
od gilhad
46 HZ je na Arduino, co nemá na práci nic lepšího než display a pár tlačítek naprosto směšná frekvence, takže to levou zadní utáhne i přez klasické https://www.arduino.cc/en/Tutorial/Buil ... thoutDelay a s možností regulace na 0.001Hz pokud si tak zamaneš :D

Re: Krokování frekvence u Arduino UNO

Napsal: 07 zář 2021, 10:50
od QRocky
gilhad píše:
06 zář 2021, 16:52
46 HZ je na Arduino, co nemá na práci nic lepšího než display a pár tlačítek naprosto směšná frekvence, takže to levou zadní utáhne i přez klasické https://www.arduino.cc/en/Tutorial/Buil ... thoutDelay a s možností regulace na 0.001Hz pokud si tak zamaneš :D
To jsem zkoušel jako první 😊, jen s tím rozdílem, že jsem nepoužíval millis, ale micros.

S millis jsem moc nepochodil, protože když spočítáš periodu pro

43 Hz:
T = 1 / f = 0,0232558 S > 23,2558 mS

43,1 Hz
T = 1 / f = 0,0232018 S > 23,2018 mS (rozdíl oproti původnímu stavu 0,054 mS)

Pro 109 Hz je perioda 0,0091743 S > 9,1743
Pro 109,1 Hz je zase 0,00916590 S > 9,1659 (rozdíl oproti pův. stavu pouze 0,0084 mS)

Jsou to rozdíly jen v desítkách mikrosekund, což není moc dobré, protože i pokud vím, tak Arduino má toleranci +/- 4 mikrosekundy, kde se může přepočítat.

Pak tam jsou i další problémy, i když samozřejmě řešitelné, například přetečení micros časovače po cca 65 minutách, atd.

Jestli tedy není lepší měnit frekvenci PWM přímo.
Potřebuju ale efektivní skoky…

Re: Krokování frekvence u Arduino UNO

Napsal: 07 zář 2021, 12:35
od ondraN
Použij timer 1 a čítej do něj 1us impulsy (clock/16). Počítej od nějaké hodnoty dolu (s autoreloadem) a pak v ISR proveď změnu stavu IO pinu. Hodnota čítače bude vyjadřovat délku půlperiody signálu. Získáš rozlišeni na 1us a celé to pojede v pozadí. V popředí si budeš tlačítky měnit hodnotu pro čítač a třeba obsuhovat displej. Maximální půlperioda bude 65535uS a min, tak 100us (aby se stihl zápis do portu). Rozlišení 1us.
Mohlo by ti pomoct třeba tohle
https://gammon.com.au/interrupts