Побитовая запись на аналоговый вывод
Я только начинаю изучать побитовые операнды, и вот мой вопрос. Для этого:
pinMode (13, OUTPUT);
digitalWrite (13, HIGH);
побитово я могу сделать так:
DDRB |= B00100000; //установить PIN13 в качестве ВЫХОДНОГО сигнала
PORTB |= B00100000; //установить ВЫСОКИЙ PIN13
но как я могу это сделать:
analogWrite(9, 200);
Я знаю, как преобразовать числа DEC в BIN, но как отправить это число на PIN PWM? Я не могу найти ни одного хорошего примера в Интернете.. Спасибо!
@wotesi, 👍2
Обсуждение1 ответ
Лучший ответ:
Обратите внимание, вы не указали, какой 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
- Есть ли способ воспроизводить звуки с Arduino без использования звукового экрана?
- В чем разница между analogWrite и digitalWrite?
- Какова частота PWM-выхода на Arduino
- Как вывести истинное аналоговое напряжение на выходной контакт
- Отправка значения с одного Arduino на другой
- Проблема с выходным контактом ШИМ (PWM)
- Пассивный зуммер работает с AnalogWrite(), но не с DigitalWrite(). Он также имеет постоянный статический шум.
- Не могу контролировать скорость двигателей постоянного тока с помощью analogWrite()
analogWrite - это оболочка, которая скрывает от вас сложность. Вам нужно будет настроить один из этих таймеров / счетчиков для выполнения ШИМ и соответствующим образом установить несколько регистров., @Kwasmich
Спасибо! У вас есть какой-нибудь материал, где можно почитать об этом подробнее и как это сделать?, @wotesi