2024年6月29日土曜日

Arduino nano PWM制御

 暑いので、PCから抜いたFANで扇風機を作ろうと、、、

手元にあったのが、9cmのDC FAN 4ピンでPWMで制御可能との事

PINハイは下記と通り。

PWM端子はプルアップされており、12Vがそのまま出てきました。
Arduinoを壊すといけないので、Trをつけて駆動。




という事で、Arduinoの古いスケッチを漁る。

確かボリュームでPWM制御を作った記憶がある。

ありました。下記の感じでできます。

これは、PWMの周期を変える事が目的のソースコードです。

PWM周期を変えなければもっと簡単だと思います。

最初5kHz周期にしてみたが、FANの風の感じが荒く。。。

50Hzにしたら細かい制御ができるような気がします。

#include <avr/io.h>


#define PWMPin 10

#define dimmerPIN A0

#define LEDPin 13



unsigned int frq = 50; // 周波数

float duty = 0.0; // 指定したいデューティ比

int dimmerValue = 0;

int oldValue = 0;

int ledValue = 0;

int dledpin = 0;



void setup() {

pinMode(PWMPin, OUTPUT);

pinMode(LEDPin, OUTPUT);

pinMode(dimmerPIN, INPUT);

// モード指定

TCCR1A = 0b00100001;

TCCR1B = 0b00010010;


// TOP値指定

OCR1A = (unsigned int)(1000000 / frq);

Serial.begin(9600);


digitalWrite(LEDPin, LOW);


}


void setpwm(int advalue){

  if(advalue <= 115)  duty = 0;

  else if(advalue >= 908) duty = 1;

  else duty = ((float)advalue-115)/8/100;

  Serial.print("Duty ");

  Serial.println(duty);

  OCR1B = (unsigned int)(1000000 / frq * duty);

  delay(100);

}


void loop() {

  int i;

  for(i=0;i<=4;i++)

  {

    dimmerValue = dimmerValue + analogRead(dimmerPIN);

    delay(20);

  }


  dimmerValue = dimmerValue/5;


  if( dimmerValue == oldValue){

    dimmerValue = 0;

  }

  else {

    oldValue = dimmerValue;

    setpwm(dimmerValue);

    Serial.println("Change dimmerValue");

    Serial.println(dimmerValue);

    dimmerValue = 0;

  }

  

delay(100);


}