Побитовая запись в аналоговый PIN-код
Я только начинаю изучать побитовые операнды, и вот мой вопрос. Сделать это:
pinMode (13, OUTPUT);
digitalWrite (13, HIGH);
побитово, я могу сделать вот так:
DDRB |= B00100000; //set PIN13 as OUTPUT
PORTB |= B00100000; //set PIN13 HIGH
но как я могу это сделать:
analogWrite(9, 200);
Я знаю, как преобразовать номера DEC в BIN, но как отправить этот номер в PWM PIN? Я не могу найти ни одного хорошего примера в сети .. Спасибо!
Ответы
Обратите внимание, вы не указали, какой 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)