PICでファンのPWM回転制御

[公開:any]

[電子工作/PIC]
[PIC,PWM,MOS FET,LM35DZ,mikroC,TND012NM]

origin 2007-12-09


電子負荷装置の製作で使用(転用)したCPUファンがうるさいので、温度によるPWM回線制御をやってみました。

8ピンのワンチップマイコンは、PICならPIC12F683、AVRならATTINY45が手元にあります。両方とも、A/D変換やPWM出力をハードウェア搭載しているので今回の目的にぴったりです。AVRは、プログラム格納するフラッシュメモリが4KByteもあるため、今回の用途にはもったいないような気がします。

・・・ということで、今回はPIC12F683を使用することにします。

温度センサーは、よく使われているナショナルセミコンダクター社のLM35DZを使用します。LM35DZは、トランジスタみたいなTO-92パッケージで0〜100℃まで検出できます。電源5Vを供給すると、出力端子では10mV/1℃が得られます。つまり、20℃だと200mVの出力が得られることになります。

下の写真のLM35DZは、今売っているレーザー刻印のものではなくて、発売当初のシルク印刷されたもので、15年近く前に購入したものです。

DSC01527.jpg

ブレットボードで開発します。本来なら、LM35DZの出力が数100mV程度なので、オペアンプ等で増幅した信号をPICのAD変換へ入力したほうがノイズ等の影響を受けにくくて良いのですが、今回は部品点数を減らすため直接接続しています。

DSC01618.jpg

最終的に、以下の回路図としました。MOS FETはサンヨー社のTND012NMで秋月電子で10個300200円で売っているものです。最大負荷は60V1.5Aまでと冷却ファン程度なら余裕でドライブできます。PICの電源5Vは、外部から供給してもよかったのですが、電圧計で使用している5V系にノイズ等の影響を与える可能性もあったため、12Vから3端子レギュレータで取り出しています。

fan_ctrl.PNG

LM35DZの出力にノイズ防止のコンデンサ追加(2008-01-14)

3端子レギュレータの発振防止のため、入力にコンデンサ追加(2009-06-01)

PICのプログラムは、mikroCで開発しました。mikroCには、AD変換とPWMのハードウェア制御が標準ライブラリとして準備されているので、ヒジョーに簡単にコーディングできます。
今回使用したソースコードは、以下となります。PWMは8KHzとしてLM35DZが30℃以上を検出すると段階的にPWMのデューティ比をあげていきます。50℃以上で全開となります。
一応のノイズ対策のため、AD変換の読み取りは、5msの間隔で3回行い、その平均値を制御に使います。

PIC12F683のPWMは、10bitなので0〜1023までなのですが、mikroCのライブラリは8bitにしか対応していないようです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
/*
* PWM Fan Speed Control
*
* PIC 16F683
* 
* Device Flags:
* _CP_OFF  _MCLRE_OFF _PWRTE_ON _WDT_OFF _INTRC_OSC_NOCLKOUT
*
*/
 
void main() {
    unsigned int ad1, ad2, ad3;
    unsigned int level;

    OSCCON = 0b01110000;        // 8MHz internal clock
    ANSEL = 0b01011000;            // AN3 and Fosc /16
    ADCON0 = 0b10001101;        // AD control CHS=11(AN3)
    CMCON0 = 0b00000111;       // Comperator not select

    PWM_Init(8000);             // PWM initial 8KHz
    PWM_Start();               // PWM start

    do {
        ad1 = Adc_Read(3);            // Read AN3
        Delay_ms(5);
        ad2 = Adc_Read(3);            // Read AN3
        Delay_ms(5);
        ad3 = Adc_Read(3);            // Read AN3
        level = (int)((ad1 + ad2 + ad3) / 3); // Avg. AN3

        if(level < 50) {                // 25℃以下
            PWM_Change_Duty(0);
        } else if(level > 61 && level < 70) {  // 30℃〜35℃
              PWM_Change_Duty(150);
        } else if(level > 71 && level < 80) {  // 35℃〜40℃
            PWM_Change_Duty(175);
        } else if(level > 81 && level < 90) {  // 40℃〜45℃
            PWM_Change_Duty(200);
        } else if(level > 91 && level < 100) {  // 45℃〜50℃
            PWM_Change_Duty(225);
        } else if(level > 101) {               // 50℃以上
            PWM_Change_Duty(255);
        }
    } while(1);
}


切り出した小さな基板に実装しました。LM35DZは、ヒートシンクにくっつける必要があるため、短めのワイヤーで外付けとしています。

DSC00126.jpg

電子負荷装置に取り付けました。LM35DZは、一応、サンハヤトの放熱用シリコングリスを塗ってヒートシンクに固定してあります。

DSC09133.jpg

電子負荷装置が無負荷の場合は、当然、ファンは回転しません。

DSC01138.jpg

13.8Vで約3Aの負荷をかけると、40秒程度でファンが回転し始めました。このまましばらくほって置くとファンの回転数が若干上がりますが、全開までは行かないようです。

DSC01139.jpg

全開にならない状態では、PWMの周波数8kHzが、”ピィー”と聞こえて耳に付くのが気になります。可聴周波数帯以上ならいいだろうと、20kHz以上を試しましたが、ファンが回転しませんでした。逆に低すぎても回転がギクシャクしたりしてうまくいかないようです。


▲ページ Top へ...