Zapis bitowy do analogowego kodu PIN
Dopiero zaczynam uczyć się operandów bitowych i oto moje pytanie. Aby to zrobić:
pinMode (13, OUTPUT);
digitalWrite (13, HIGH);
bitowe mogę zrobić tak:
DDRB |= B00100000; //set PIN13 as OUTPUT
PORTB |= B00100000; //set PIN13 HIGH
ale jak mogę to zrobić:
analogWrite(9, 200);
Wiem, jak przekonwertować numery DEC na BIN, ale jak wysłać ten numer na PIN PWM? Nie mogę znaleźć żadnego dobrego przykładu w sieci. Dziękuję!
Odpowiedzi
Uwaga, nie określiłeś, którego Arduino używasz. Zakładam tutaj Arduino oparte na Atmega328p (Uno, Nano, Mini), chociaż zasada działa z każdym mikrokontrolerem AVR, który ma ten sprzęt).
Z analogWrite()
są nie wysyłają danych bitowo z pinu. Konfiguruje zegar sprzętowy do ustawiania tego styku na określoną częstotliwość i z określonym cyklem pracy. Więc analogWrite()
aktywuje zupełnie inny element sprzętowy wewnątrz mikrokontrolera.
Aby to zrobić bez funkcji Arduino analogWrite()
, musisz najpierw zdecydować, którą drogą iść:
- Możesz wygenerować przerwanie za pomocą timera sprzętowego, a następnie ustawić pożądany pin za pomocą oprogramowania wewnątrz ISR (co daje ci wolny wybór pinów, ale także wprowadza pewne jitter w sygnale)
- lub możesz pozwolić zegarowi sprzętowemu samemu przełączać pin, co nie wymaga żadnego oprogramowania do uruchamiania (oznacza to, że możesz użyć tylko jednego z 2 pinów, które są powiązane z odpowiednim timerem, ale otrzymasz znacznie bardziej stabilny sygnał )
W sieci jest wiele samouczków, jak to zrobić. Wyszukiwanie „arduino timer register pwm” dało mi obiecujące wyniki, na przykład ten , w którym wyjaśniają, jak uzyskać PWM za pomocą rejestrów Timer1 i dowolną częstotliwość. (To jest 3-częściowa seria, jedna część dla każdego timera. Część 1 dla timera 0 jest tutaj , chociaż możesz chcieć zachować Timer 0 tak, jak jest, aby działał normalnie delay()
i millis()
nadal działał). Na tej stronie jest też wiele takich pytań, na przykład ta .
Innym bardzo ważnym źródłem wszystkiego, co dotyczy sprzętu, jest arkusz danych odpowiedniego mikrokontrolera. W przypadku Uno, Nano lub Mini, czyli Atmega328p, którego arkusz danych można znaleźć na stronie mikroczipa tutaj (lub podczas wyszukiwania w Google nazwy mikrokontrolera)