Ардуино управление ПК кулером

Много статей написано, точнее скопировано про управление 3х контактным безщеточным кулером, но они все, почти все привязаны на считывание оборотов на прерываниях да и работают неправильно, по крайней мере я проверил 4 разных кулера и ни один не выдавал правильных оборотов. Как исправить это и многое другое под капотом.

Вначале я использовал статьи в сети, но считанные данные оборотов кулера реагировали на изменение скорости ни при помощи ШИМ, ни простым торможением кулера пальцем. Первая проблема с которой столкнулся я — датчик холла в кулере привязан на землю и при управлении кулером NPN транзистором он также отключался, что мешало измерению скорости вращения. Ключ был заменен на управление поплюсу, хотя это немного усложнило схему, понадобились 2 транзистора и 2 резистора вместо одного:

Используя схему выше я получил желаемый результат + ко всему избавился от использования ножек с прерываниями (хотя и сжег пару транзисторов в процессе) , так как они все заняты другой периферией и использовал для считывания аналоговые ножки, а точнее ножку А6, которая на Ардуино Нано имеет ограниченный функционал и может использоваться только для считывания входного сигнала, что мне было и нужно!
Код ниже:

#define fan1 6
#define rpm1 A6

int rpmV = 0;
boolean t1 = 0;
boolean t2 = 0;
unsigned int rpm = 0;
unsigned long timeint1 = 0;
byte rev = 254;

void setup() {
pinMode(fan1, OUTPUT);
analogWrite(fan1,rev);
Serial.begin(9600);

}
void loop() {
rpmV = analogRead(rpm1);
if (rpmV > 1000){
t1 = 1;
}else{
t2 = 1;
}
if(t1 == 1 && t2 == 1){
rpm = rpm + 1;
t1 = 0;
t2 = 0;
}
if((millis() — timeint1) >= 1000){
Serial.println(«Revolution: » + String((rpm/2)*60) + «RPM»);
rpm = 0;
timeint1 = millis();
}
delay(1275/rev);
}

Всем удачного дня!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

wp-puzzle.com logo