Как прочитать сигнал ШИМ частотой 25 кГц с разъема вентилятора ПК?

pwm

Я хотел бы управлять скоростью двигателя постоянного тока, используя выход ШИМ из разъема моей материнской платы.

Вот стандартная распиновка 4-проводного разъема вентилятора ПК:

╔═══╦════════╦═════════════════╦════════╗
║ # ║  Name  ║   Description   ║  Wire  ║
╠═══╬════════╬═════════════════╬════════╣
║ 1 ║ GND    ║ Ground          ║ black  ║
║ 2 ║ +12V   ║ Fan Power       ║ yellow ║
║ 3 ║ SIGNAL ║ Fan RPM         ║ green  ║
║ 4 ║ PWM    ║ Digital Control ║ blue   ║
╚═══╩════════╩═════════════════╩════════╝

Поскольку мой двигатель постоянного тока не имеет входа ШИМ, я подумал об использовании ATmega328P в моей специальной плате для считывания выхода ШИМ разъема вентилятора (контакт 4) - чтобы я мог могу использовать драйвер двигателя для управления скоростью моего двигателя.

Однако я не уверен, как мне следует считывать сигнал ШИМ с материнской платы.

  1. Каков уровень напряжения HIGH на выходе ШИМ?
    Нужен ли для этого резистор делителя напряжения?

    В источнике управления вентилятором указано, что максимальное значение составляет 5,25 В, но поскольку я сам не проверял это, я не хочу рисковать подавать сигнал 12 В на мой микроконтроллер. строки ввода.

  2. Следует ли мне использовать функцию <code>pulseIn()</code> для 25 кГц ( Диапазон 21~28 кГц) Выход ШИМ?
    Сможет ли ATmega328p справиться с этим диапазоном частот?

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

, 👍0

Обсуждение

Сигнал ШИМ, управляющий вентилятором, может быть от 21 до 28 кГц. Импульсы индикатора оборотов — это просто один (или два) импульса за оборот. Если предположить, что скорость вращения вентилятора составляет 10 000 об/мин (безумно высокая скорость для вентилятора) и два импульса на оборот, вы получите импульсы об/мин только с частотой немногим более 300 Гц. Их легко прочитать с помощью Arduino., @JRE

Но не обязательно использовать команду «импульс». Это дает вам ширину импульса, но не время между импульсами., @JRE


1 ответ


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

1

Должен ли я использовать функциюpulsIn() для выхода ШИМ 25 кГц (диапазон 21–28 кГц)? Сможет ли ATmega328p справиться с этим диапазоном частот?

Нет и нет; 1/25000 = 0,000040 или 40 микросекунд (мкс) и документация дляpulsIn() говорит:

Работает с импульсами длительностью от 10 микросекунд до 3 минут

Однако частота ШИМ является максимальной во времени, при 50 % у вас будет ВЫСОКИЙ прямоугольный сигнал в течение 20 мкс и низкий в течение 20 мкс. PulseIn не будет работать, если коэффициент заполнения ШИМ опустится ниже 25 %

Что вам нужно сделать, так это поместить «аккумулятор» (RC-фильтр) между выходом ШИМ и аналоговым входом и считать с него напряжение.

Однако, поскольку вы этого хотите,

... управлять скоростью двигателя постоянного тока, используя выход ШИМ из разъема моей материнской платы

и заголовок скорости вращения вентилятора уже предназначен для этого, вы просто используете сигнал ШИМ для управления транзистором, который управляет двигателем, сам двигатель здесь будет действовать как аккумулятор; микроконтроллер не нужен!

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

вам потребуется сгенерировать очень похожий, почти наверняка идентичный ШИМ-сигнал для управления контроллером/драйвером двигателя

Источник управления вентилятором указывает, что максимальное напряжение составляет 5,25 В, но поскольку я сам это не проверял, я не хочу рисковать подавать сигнал 12 В на входные линии моего микроконтроллера.

Доверяйте своей документации или проверяйте ее, если не доверяете документации!

,

+1, спасибо за хорошо объясненный ответ, ваше решение имеет смысл! Хотя помимо управления двигателем мне еще очень хотелось бы с помощью чего-нибудь прочитать выходной сигнал ШИМ и передать данные в мой микроконтроллер, чтобы я мог, например, отобразить их. Есть ли способ добиться этого в цифровом формате вместо использования RC-фильтра?, @David Refoua

@DavidRefoua AnalogRead(...) вернет значение от 0 до 1023; где 0 — 0 В, а 1023 — 5 В; RC-фильтр предназначен для стабилизации напряжения, чтобы АЦП мог его прочитать., @esoterik