<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
Mrzí mě, že tomu nerozumím.<br>
<br>
Já jsem synek z dědiny, tak všechno dělám jednoduše.<br>
Chci-li generovat stejné pulzy (jak podle mě znělo zadání), tak
prostě nastavím<br>
časovač a jdu dělat něco jiného. On už si je generuje sám.<br>
<br>
Pokud má být každý pulz jinak dlouhý, tak prostě od reloadu čítače
udělám<br>
přerušení a naprogramuju do čítače délku následujícího pulzu.<br>
<br>
Ale to je jen teorie. V praxi bych použil Blue-pill, který je
levnější než<br>
nějaké Arduino s AVR a je nesrovnatelně výkonnější.<br>
Tam bych nastavil DMA, které bude krmit daný čítač.<br>
Podle komunistického hesla "Práci strojům!".<br>
<br>
PL<br>
<br>
********************<br>
<br>
<div class="moz-cite-prefix">Dne 30.7.2023 v 19:30 Martin Záruba
napsal(a):<br>
</div>
<blockquote type="cite"
cite="mid:9abdc7e2-1234-7b90-7689-1b1d1ca0b4b0@volny.cz">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<p><font face="Arial">Ano. A to ten program přesně dělá. Jen fígl
je v tom, že to dělá pomocí přerušení, takže procesor přitom
může dělat něco jiného. Na opakovací frekvenci cca 20kHz je to
už docela honička.</font><br>
</p>
<pre class="moz-signature" cols="72">Martin Záruba</pre>
<div class="moz-cite-prefix">Dne 30.7.2023 v 19:22 Petr Labaj
napsal(a):<br>
</div>
<blockquote type="cite"
cite="mid:d62398d4-92d3-a17a-8ea6-d1b6985e82f1@volny.cz">
<meta http-equiv="Content-Type" content="text/html;
charset=UTF-8">
Nejsem žádný velký arduinista.<br>
Generování PWM je ale snad principiálně všude stejné, ne?<br>
Nastaví se co nejvyšší základní frekvence čítaní, opakovací
frekvence se nastaví<br>
v nějakém registru pro reload čítače, a šířka pulzu se nastaví v
nějakém registru<br>
pro komparaci s aktuálním stavem čítače.<br>
<br>
Pokud to ty úplně základní knihovny přímo od Arduina neumí, tak
skoro určitě<br>
k nim bude existovat nějaká vylepšená verze.<br>
Pokud tedy programátor nechce řešit nastavení čítače sám, což je
nejlepší.<br>
<br>
I to nejobyčejnější AVR má čítačů víc, takže se nemusí sahat na
ten, který se<br>
používá pro generování TIKů.<br>
<br>
Nebo je tady něco zásadního, co jsem přehlídnul?<br>
<br>
PL<br>
<br>
********************<br>
<br>
<div class="moz-cite-prefix">Dne 30.7.2023 v 19:09 Martin Záruba
napsal(a):<br>
</div>
<blockquote type="cite"
cite="mid:2a9e4031-b2ec-487c-f08a-f38aa2046b3b@volny.cz">
<meta http-equiv="Content-Type" content="text/html;
charset=UTF-8">
<p><font face="Arial">Nevyhoví, protože já potřebuji frekvenci
okolo 20kHz.</font></p>
<p><font face="Arial">Ale snad jsem to vyšrachal. Možná by Vás
to mohlo zajímat. Zde je ukázka programu, který pomocí
přerušení od interního časovače generuje dva různé
nezávislé pulzy na výstupech 9 a 10. Všechny normální
funkce (externí přerušení, delay) by měly zůstat
zachovány.<br>
</font></p>
<p><br>
</p>
<p><font face="Arial">#include <avr/io.h><br>
#include <avr/interrupt.h><br>
<br>
// Proměnné pro uchování šířky pulzů<br>
volatile unsigned int pulseWidth1 = 1000; // Výchozí šířka
pulzu 1 na Counter1 - 1000 us (1 ms)<br>
volatile unsigned int pulseWidth2 = 500; // Výchozí šířka
pulzu 2 na Counter2 - 500 us<br>
<br>
void setup() {<br>
// Nastavení pinů pro výstup pulzů<br>
pinMode(9, OUTPUT);<br>
pinMode(10, OUTPUT);<br>
<br>
// Nastavení časovače Timer/Counter1<br>
cli(); // Vypnutí globálních přerušení<br>
TCCR1A = 0; // Vynulování registru TCCR1A<br>
TCCR1B = 0; // Vynulování registru TCCR1B<br>
<br>
// Nastavení režimu Fast PWM (TOP = ICR1)<br>
TCCR1A |= (1 << WGM11);<br>
TCCR1B |= (1 << WGM13) | (1 << WGM12);<br>
<br>
// Nastavení hodinového děliče na 64 (frekvence časovače
= frekvence CPU / 64)<br>
TCCR1B |= (1 << CS11) | (1 << CS10);<br>
<br>
// Nastavení intervalu pro generování přerušení (1 ms) -
pro frekvenci CPU 16 MHz<br>
// ICR1 = (F_CPU / (časový interval * hodinový dělič)) -
1<br>
ICR1 = 249; // 1 ms při frekvenci CPU 16 MHz a hodinovém
děliči 64<br>
<br>
// Povolení přerušení od časovače Timer/Counter1<br>
TIMSK1 |= (1 << TOIE1);<br>
<br>
// Nastavení časovače Timer/Counter2<br>
TCCR2A = 0; // Vynulování registru TCCR2A<br>
TCCR2B = 0; // Vynulování registru TCCR2B<br>
<br>
// Nastavení režimu Fast PWM (TOP = 255)<br>
TCCR2A |= (1 << WGM21) | (1 << WGM20);<br>
TCCR2B |= (1 << CS22); // Hodinový dělič 64 -
frekvence časovače = frekvence CPU / 64<br>
<br>
// Povolení přerušení od časovače Timer/Counter2<br>
TIMSK2 |= (1 << TOIE2);<br>
<br>
sei(); // Zapnutí globálních přerušení<br>
}<br>
<br>
void loop() {<br>
// V hlavní smyčce (loop) můžete provádět další činnosti<br>
}<br>
<br>
// Obsluha přerušení od časovače Timer/Counter1<br>
ISR(TIMER1_OVF_vect) {<br>
// Generování pulzu 1 na pinu 9 (při logické 1)<br>
digitalWrite(9, HIGH);<br>
<br>
// Počkejte na dobu odpovídající šířce pulzu 1<br>
delayMicroseconds(pulseWidth1);<br>
<br>
// Ukončení pulzu 1 (nastavení logické 0)<br>
digitalWrite(9, LOW);<br>
}<br>
<br>
// Obsluha přerušení od časovače Timer/Counter2<br>
ISR(TIMER2_OVF_vect) {<br>
// Generování pulzu 2 na pinu 10 (při logické 1)<br>
digitalWrite(10, HIGH);<br>
<br>
// Počkejte na dobu odpovídající šířce pulzu 2<br>
delayMicroseconds(pulseWidth2);<br>
<br>
// Ukončení pulzu 2 (nastavení logické 0)<br>
digitalWrite(10, LOW);<br>
}<br>
</font><br>
</p>
<pre class="moz-signature" cols="72">Martin Záruba</pre>
<div class="moz-cite-prefix">Dne 30.7.2023 v 16:36 Jaroslav
Buchta napsal(a):<br>
</div>
<blockquote type="cite"
cite="mid:059308af-82e5-9dc1-bde2-86442186dc29@hascomp.cz">To
zalezi, jaky mate MCU. Treba ESP32 na generovani prubehu i
neperiodickych ma super periferii. <br>
Jinak nevyhovi obecne PWM? To by mely umet vsechny MCU. <br>
<br>
Dne 30.07.2023 v 14:59 Martin Záruba napsal(a): <br>
<blockquote type="cite">Potřeboval bych přimět Arduino
generovat pulzy o frekvenci cca 20kHz, ale s jinou
střídou, než 1:1, jak dělá příkaz tone. Jde to nějak? <br>
</blockquote>
</blockquote>
</blockquote>
</blockquote>
</blockquote>
<br>
</body>
</html>