Простой ШИМ-регулятор легко можно сделать с помощью Arduino. Для примера возьмём всем известный контроллер Arduino UNO , который построен на ATmega328. Он имеет 14 цифровых входов/выходов ( 6 из которых могут использоваться как выходы ШИМ) и 6 аналоговых входов.
Для наших целей понадобится один аналоговый вход — А0, который используем для подключения переменного резистора, а также один выход ШИМ — возьмём 11. Соберём простую схему :
И напишем простую программу для управления яркостью светодиода , подключённого к 11 выходу ШИМ. Регулировать будем переменным резистором, который подключен к аналоговому входу А0.
int pwnPin = 11; // Выход ШИМ
int analogPin = A0; // Потенциометр подключён к входу А0
int val = 0; // Переменная для хранения значения
void setup()
{
pinMode (pwnPin, OUTPUT); // Установка пина на выход
}
void loop() {
// Считываем напряжение с переменного резистора - значения от 0 до 1023
val = analogRead(analogPin);
// analogRead - значения от 0 до 1023, analogWrite - в диапозоне от 0 до 255
analogWrite(pwnPin, val / 4);
}
Получаем первый результат — яркость светодиода изменяется с помощью переменного резистора. Для управления какой-нибудь силовой нагрузкой включённой в сеть 220 вольт такой ШИМ тоже сгодится, только желательно сделать гальваническую развязку между силовой частью и Arduino.
Провёл небольшие испытания этого ШИМ-регулятора — сначала как обычно подключил активную нагрузку ( лампочку накаливания) а затем и коллекторный двигатель. Всё работает. Снял видео —
Далее
по плану использовать обратную связь от таходатчика коллекторного
двигателя для поддержания стабильных оборотов, а также увеличить частоту
ШИМ.
Добавил обратную связь по таходатчику для регулятора оборотов . Для этого собрал простую схему обработки сигнала таходатчика
и подал это сигнал на аналоговый вход А1. Для защиты входа Ардуино от перенапряжения поставил ещё стабилитрон на 5.1 вольт. Получилась такая схема
Для написания программы управления оборотами коллекторного двигателя использовал библиотеку PID — регулятора для Arduino.
#include <PID_v1.h> // подключаем библиотеку PID-регулирования
double pwmSet, pwmSpeed, pwmOut; // //переменные для пид-регулятора
PID myPID(&pwmSpeed, &pwmOut, &pwmSet, 0.2, 0.5, 0, DIRECT);
// Подобрал коэфф пид-регулятора Kp=0.2, Ki=0.5, Kd=0 .
#define PWM_PIN 11 // выход ШИМ
#define SET_PIN 0 // установка оборотов 0-5 вольт мин-макс
#define TACHO_PIN 1 // сигнал от таходатчика 0-5 вольт мин-макс
void setup() {
myPID.SetMode(AUTOMATIC);
}
void loop() {
pwmOut = constrain ( pwmOut , 0, 250); // это необязательно - по умолчанию 0-255
pwmSet = analogRead(SET_PIN); // считываем показания потенциометра регулировки скорости
pwmSpeed = analogRead(TACHO_PIN); // считываем показания таходатчика
myPID.Compute(); // здесь происходят вычисления пид-регулятора - то есть pwmOut
analogWrite(PWM_PIN, pwmOut);// получаем выходной сигнал ШИМ
}
В результате получилось очень даже неплохо — регулируются обороты двигателя с поддержанием мощности. Снял по этому поводу видео —