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

Dec 02 2020

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

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

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

DDRB |= B00100000;   //set PIN13 as OUTPUT
PORTB |= B00100000;  //set PIN13 HIGH

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

analogWrite(9, 200);

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

Ответы

3 chrisl Dec 02 2020 at 15:05

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

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

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

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

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

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