Побитовая запись на аналоговый вывод

Я только начинаю изучать побитовые операнды, и вот мой вопрос. Для этого:

pinMode (13, OUTPUT);    
digitalWrite (13, HIGH);

побитово я могу сделать так:

DDRB |= B00100000;   //установить PIN13 в качестве ВЫХОДНОГО сигнала
PORTB |= B00100000;  //установить ВЫСОКИЙ PIN13

но как я могу это сделать:

analogWrite(9, 200);

Я знаю, как преобразовать числа DEC в BIN, но как отправить это число на PIN PWM? Я не могу найти ни одного хорошего примера в Интернете.. Спасибо!

, 👍2

Обсуждение

analogWrite - это оболочка, которая скрывает от вас сложность. Вам нужно будет настроить один из этих таймеров / счетчиков для выполнения ШИМ и соответствующим образом установить несколько регистров., @Kwasmich

Спасибо! У вас есть какой-нибудь материал, где можно почитать об этом подробнее и как это сделать?, @wotesi


1 ответ


Лучший ответ:

2

Обратите внимание, вы не указали, какой Arduino вы используете. Я предполагаю, что здесь используется Arduino на базе Atmega328p (Uno, Nano, Mini), хотя принцип работает с каждым микроконтроллером AVR, который имеет это оборудование).

С помощью analogWrite() мы не отправляем данные побитово из контакта. Он настраивает аппаратный таймер для установки этого вывода на определенную частоту и с определенным рабочим циклом. Таким образом, analogWrite() активирует совершенно другое аппаратное обеспечение внутри микроконтроллера.

Чтобы сделать это без функции Arduino analogWrite(), вам сначала нужно решить, каким путем идти:

  • Вы можете сгенерировать прерывание с помощью аппаратного таймера, а затем установить требуемый контакт с помощью программного обеспечения внутри ISR (что дает вам свободный выбор контакта, но также вносит некоторое дрожание в сигнал).
  • или вы можете позволить аппаратному таймеру самому переключать контакт, что не требует никакого программного обеспечения для запуска (это означает, что вы можете использовать только один из 2 контактов, которые связаны с соответствующим таймером, но вы получите гораздо более стабильный сигнал)

В Интернете есть множество руководств о том, как это сделать. Поиск "arduino timer register pwm" дал мне несколько многообещающих результатов, например, этот, где они объясняют, как получить PWM с помощью регистров Timer1 и свободно выбирать частоту. (Это серия из 3 частей, по одной части для каждого таймера. Часть 1 для таймера 0 находится здесь, хотя вы можете оставить таймер 0 таким, какой он есть, чтобы такие функции, как delay() и millis(), по-прежнему работали в обычном режиме). На этом сайте также есть много подобных вопросов, например, этот.

Другим очень важным источником информации обо всем, что связано с оборудованием, является спецификация соответствующего микроконтроллера. Для Uno, Nano или Mini, который является Atmega328p, технические характеристики которого можно найти на сайте microchip здесь (или при поиске названия микроконтроллера в Google)

,

Мне очень жаль - я использую Nano.., @wotesi

@wotesi Тогда все ссылки, которые я включил, применимы к вашему Arduino. Nano также использует Atmega328p, @chrisl

Отлично! Большое вам спасибо!, @wotesi