Sterowanie wentylatorem za pomocą PWM

0

Witam, robię sobie projekt, jest to moduł mechanicznej modulacji światła na arduino, steruję wentylatorem 4 pinowym za pomocą pwm zmienionego na 30kHz, do tego mam czujnik szczelinowy który zlicza prędkość, potencjometry do regulacji wypełnienia PWM oraz lcd który pokazuje aktualna prędkość. Problem polega na tym, że wszystko ładnie działa, ale tylko wtedy kiedy pwm jest 100%. Pokazuje wtedy prędkosc 2200 rpm a jak zahamuje wentylator palcem to stopniowo maleje. Gdy zmniejsze wypełnienie pozniej 100% to nagle skacze z 2200 na 3800 a nastepnie stopniowo spada wraz ze mniejszaniem wypełnienia, jednak te wartosci skacza w zakresie 100rpm wiec to i tak jakies bzdury. Dodam, że jak ustawie wartosc PWM na sztywno to dzieje się to samo. Juz nie wiem co to moze byc, Timer 1 zlicza predkosc a timer 2 przestawia PWM na 30kHz. Prosze o pomoc

#include <LiquidCrystal_I2C.h>
#include "TimerOne.h"
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 16, 2);
const byte SpeedSensor = 2;
volatile unsigned int counter = 0;
volatile unsigned int counterStan = 0;
float diskslots = 6;
float Speed = 0;

int timeToWait = 1000; //Czas, który ma czekać
int setTime=0;               
int aktualTime=0;
int done;

int odczytanaWartosc = 0;
void ISR_count()
{
  counter++;
}

void ISR_timerone()
{
  Timer1.detachInterrupt();
  counterStan = counter;
  Speed = (counter / diskslots) * 60.00;
  counter = 0;
  Timer1.attachInterrupt( ISR_timerone );
}
void setup() {

   TCCR2B = TCCR2B & B11111000 | B00000001; // Set PWM for D3 & D11
    pinMode(3, OUTPUT); // Sets the pin as output
  
  Timer1.initialize(1000000);
  attachInterrupt(digitalPinToInterrupt (2), ISR_count, RISING);
  Timer1.attachInterrupt( ISR_timerone);
  
  lcd.init();
  lcd.backlight(); 
  
}

void loop() {
 
 lcd.clear();
  
  setTime = millis();
  done=1; 
  while(done){  //Wykonuje się tak długo aż upłynie 1s i wykona się reszta kodu
    aktualTime = millis();
    if (aktualTime < setTime+timeToWait){
  lcd.setCursor(0,0);
  lcd.print("Frequence: ");
  lcd.print(counterStan);
  lcd.setCursor(0,1);
  lcd.print("RPM: ");
  lcd.print(Speed);
}
else
  {   
    odczytanaWartosc = analogRead(A3);
    analogWrite( 3,(odczytanaWartosc/4));
    done=0;
    }
}
}

title

0

Nie podałeś schematu, dlatego odpowiedź w takiej formie.

[Jeśli sterujesz wiatrak przy pomocy tranzystora ze sterowaniem na PWM]:
30Khz na sterowanie wypełnieniem dla silnika to jakieś nieporozumienie.
Zastosuj częstotliwość do 200Hz (Hertzów - nie kilo). Tak po prawdzie najlepiej jest na 20-30 hz w górę w zależności od obciążenia.
Najlepiej jakbyś jeszcze policzył ilość cewek na wirniku, to wtedy mógłbyś dobrać odpowiednią częstotliwość PWM'a do aktualnej prędkości lub wymaganej.
W tej chwili ładujesz i rozładowujesz (tak się dzieje nawet przy napięciach 0 -> +V) cewkę wirnika kilka/ kilkadziesiąt/ może kilkaset razy na przesunięcie, nad kolejny magnes.

[Jeśli stabilizujesz napięcie na stabilizatorze, a PWM służy jako DAC]:
To przyczyn może być kilka.
Za wolny kondensator na tą częstotliwość (możesz zastosować polimerowe lub tantalowe lub low-esr[ale mogą się nie wyrobić], jeśli potrzebujesz takiej częstotliwości).
Za słaby filtr.
Zła konstrukcja podłączenia.
Ogólnie warto sprawdzić oscyloskopem. Lub zwykłym multimetrem jakie jest napięcie wyjściowe w zależności od wysterowania.

[finalnie]:
Do precyzyjniejszego sterowania prędkością warto wykorzystać wiatraki na silniku BLDC, z pomiarem na hallu (tak jak masz w cdromie).

1 użytkowników online, w tym zalogowanych: 0, gości: 1