Zapis bitowy do analogowego kodu PIN

Dec 02 2020

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

3 chrisl Dec 02 2020 at 15:05

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)