GPIO控制风扇转速 PWM方案 (wiringPi)

之前总是觉得树莓自带风扇太吵人,百度了一堆教程要么是用继电器简单控制开关的,要没就是用三极管结果是用Python写的程序,这让我这个处女座的C语言起家的人怎么能受的了,二话不说自己撸做吧。

材料:

S8050二极管一个,杜邦线,风扇,面包板,树莓派3B板子。附图S8050针脚图及树莓3B GPIO针脚图.

                          

 

插线方式是我自己试出来的,网上百度贴吧的版本在我试过了并没有啥用处,后来烧了2个二极管后终于愣是给我试出来了,在这里就放送给大家:

电路比较简单,我就不画图了
风扇+极直接接在5v上,-极接在三极管B。
E接GND,C接gpio(最好是GPIO.1,因为GPIO.1支持原生PWM)
接完之后,正常情况下风扇转速随GPIO.1接口的电流的增大而增大
硬件不复杂,但是接错了就容易烧二极管,所以我先在面包板上进行接线,方便插拔。

 

软件代码:

#include <stdio.h>
#include <wiringPi.h>
#include <stdlib.h>
#include <stdint.h>
#include <math.h>
#define M 1

int main(void){
      FILE *fp;
      int temperature;
        double speed=0;
             if(wiringPiSetup()==-1){                                              //初始化针脚
                  printf("erro from wiringPisetup!!\n");
                  exit(1);}
        pinMode(M,PWM_OUTPUT);                                                     //PWM方式启动GPIO.1
             while(1){
                  fp=fopen("/sys/class/thermal/thermal_zone0/temp","r");           //读取CPU温度储存文件
                        if(fp==NULL){
                               printf("erro from fopen()!\n");
                               exit(1);}
                   fscanf(fp,"%d",&temperature);
                   fclose(fp);                                                     //及时关闭文件指针防止后续温度无法正常读取
                         if(temperature>=36000&&temperature<56000){
                              if(speed==0){                                        //此处防止风扇卡停
                                    speed=1023;
                                    pwmWrite(M,speed);
                                    delay(100);}                                   //此处防止风扇卡停
                   speed=768.0+255.0*exp(((temperature-36000.0)/20000.0)-1);       //风扇速度
                   pwmWrite(M,(int)speed);
                   delay(5000);}                                                   //防止CPU过高占用
                          if(temperature>=56000){
                               speed=1023;                                         //56℃上全速运行
                               pwmWrite(M,(int)speed);
                               delay(10000);}                                      //保证温度下降,防止频繁变速
                          if(temperature<36000){                                   //36℃以下彻底不转
                               speed=0;
                               pwmWrite(M,(int)speed);
                               delay(5000);}}
        return 0;
}

来划重点:

1.  /sys/class/thermal/thermal_zone0/temp 这个文件中储存的是CPU的实时温度,由树莓自行获取。

2. 千万不能少了delay()不然CPU很容易又极高的占用,delay()里的数按毫秒来记。

3. 编译方式:

     gcc -o 编译后文件名 编译文件 -lwirirgPi -lm

4. 运行方式:

     sudo ./文件名

好的至此你的风扇PWM也就大工告成了,不过我测试时候有个问题,就是三极管工作时间一长发热就有点厉害,我也不知道是啥问题。

转载请注明出处 :www.zhazhafang.cn