数码之家

 找回密码
 立即注册
搜索
查看: 6356|回复: 17

[ARM] [小众玩法]莓派硬件输出PWM控制风扇转速

[复制链接]
发表于 2021-6-12 11:35:22 | 显示全部楼层 |阅读模式
为了将数据上传到云服务器上,同时将云服务器的数据/指令接收回来,考虑到编程的方便性、性能和功耗,最终选择了树莓派Zero W来作为中转系统。

系统比较简单:由一个nRF24L01模块传输模块和一个DS18B20温度传感器组成。外加一个DC-DC模块,用洞洞板焊接起来,放在客厅进户的弱电箱上。整个系统的最大功耗大概在1W左右,正常情况下,0.6W左右。
10年前装修的房子,那个时候没有预见到现在的网络发展速度会这么快。所以,弱电箱太小了,放不下现在所有的网络设备。只好买了一个支架,自己改装了一下,将12V开关电源模块、一个光猫、一个路由器、一个移动硬盘,再加上这个系统放在了一起,看起来不那么太凌乱。整体效果如图所示。



装修的时候在弱电箱里面留了220V电源接头的,12V4.3A的开关电源模块给光猫、两个路由器(其中一个是通过不用的闭路电视线给书房路由器供电)、本树莓派系统供电。下图是洞洞板组合起来的树莓派系统。放在支架的顶部位置。


中间那个铝箔包裹起来的就是树莓派zero W。左侧带有天线的是nRF24L01模块,左侧下面是 DC-DC模块,12V转5V。右边木头盒子就是自己做的风扇支架。右侧下面还有一个小模块就是风扇驱动模块。
这个系统,已经运行有3年多了,稳定性还是可以的,不过,第一个夏天太热的时候,发现树莓派的CPU温度能够达到55度以上,所以有时候就热死掉了。后来加上一个CPU风扇,直接使用电源12V,风扇对着树莓派吹风,温度还是可以的,基本上比室温高出一个5度左右。冬天的时候就不需要风扇了,然后就把风扇插头拔了。


除了要手动拔插风扇外,全速运行的风扇,噪音还是有点大的,特别是晚上,声音更明显。还有一个原因:风扇吹了一个夏天,发现树莓派上,特别是正对着风扇的那一面,有许多的油腻垢!所以现在就用了一块铝箔纸包裹了起来(里面有一层绝缘的塑料),清理的时候方便一点。

现在的目的就是做个风扇调速,并且自动控制其转速。手动的拔插,毕竟还是不方便。

因为手头现有的风扇是AMD的原装3线CPU风扇,没有调速功能,只能自己做一个调速模块了,在网上找了一个电路图,上次在给电脑换前面板的时候,搭载一起给做了PCB,切割下来,自己焊接好,测试了一下,效果还是可以的。在PWM占空比50%的时候,风扇启动完全没有问题。但是低于35%的占空比就需要手动拨动一下风扇叶片才能旋转。所以安全起见,就选择50%占空比为最低的转速控制。下图是模块已经安装好的情况。

左侧有个插座,那个是原来的没有调速的风扇接口,右侧是现在的风扇输出接口。


接下来就是怎么生成PWM了,本着少花钱多办事的原则,将树莓派系统功能尽可能发挥出来,就直接用树莓派生成PWM,硬件上改动最小。在网上看到许多都是用软件延时的方式来实现软PWM,虽然简单,但是,CPU的占用可以高达10%左右,显然不合算。

因为要使用PWM,下面就对树莓派zero的CPU(BCM2835)的PWM功能多描述一点。
BCM2835 包含 2 个独立的 PWM 通道(0 和 1),可以在几个特定的 GPIO 引脚上支持硬件 PWM输出。
在BCM2835的文档中,关于PWM的输出引脚,有下面的一个表格:
PWM0 PWM1
GPIO 12Alt Fun 0
-
GPIO 13
- Alt Fun 0
GPIO 18Alt Fun 5 -
GPIO 19
- Alt Fun 5
GPIO 40Alt Fun 0 -
GPIO 41
-Alt Fun 0
GPIO 45
-Alt Fun 0
GPIO 52Alt Fun 1 -
GPIO 53
Alt Fun 1
从上面的表格中可以看出,为了让 GPIO 引脚输出 PWM,必须设置为上面给出的 Alt 功能。至于有哪些GPIO,与树莓派的版本有关。例如我的 树莓派zero,借用网络的图片,其形状和引脚如下图。

就有上面表格中的前面4个GPIO口可以输出PWM,因为我只需要1路PWM,所以就选择其中的一个GPIO就可以了。根据我的洞洞板上焊接的情况,就近选择了GPIO 13,即物理引脚33来输出PWM。就是图中红色框标记的那个引脚。从上面的表格还可以看出,必须使用该引脚的Alt功能0 。

两个 PWM 通道都由相同的 PWM 时钟驱动,但可以有不同的工作模式和输出频率。每个 PWM 通道都可以在Balanced 或者Mark-Space 模式下运行。在Mark-Space 模式下,硬件将 DATA 时钟脉冲的输出设置为高电平,然后为 RANGE-DATA 时钟脉冲设置为低电平。比较好理解,所以就选择Mark-Space 模式运行。

PWM 时钟源是 19.2MHz 时钟。由预分频器分频后,然后再除以“RANGE ”即得到实际的输出频率。 例如,希望CPU风扇调速PWM工作于25kHz左右,那么先预分频为2,得到的频率为 9.6MHz。再设置RANGE 为 400, 理论上,输出的频率为 24kHz。实际上用示波器测量当RANGE = 400时,输出频率为 23.81kHz。满足CPU风扇的工作条件。

占空比的选择,就在0-400之间变化。例如需要50%占空比,那么设置数据为 (400 * 50)/100。需要70%占空比,那么设置数据为 (400 * 70)/100就可以了。

当然,直接去读些寄存器,未免有点难了,好在有封装好的库可以用。这个是封装库的详细情况和下载地址。
http://www.airspayce.com/mikem/bcm2835/index.html
当前版本是bcm2835  1.69,下载了这个库,并且编译安装了,然后参照它给的例子写一个简单的C语言代码,就可以输出PWM波形了。


通过对BCM2835的寄存器编程,完全可以实现硬件方式的PWM,除了在设置寄存器的时候占用CPU外,输出PWM的时候,几乎不占用CPU的时间。

基本的代码功能解释如下:
  1. <font size="4">// BCM PIN13, 物理引脚33引脚输出PWM
  2. #define PIN  RPI_V2_GPIO_P1_33

  3. // 使用 PWM 通道1
  4. #define PWM_CHANNEL 1        
  5. #define RANGE 400        // 这个范围的作用上面已经说明 了
  6. // 设置输出引脚为Alt Fun 0,这样才能输出PWM。
  7. bcm2835_gpio_fsel(PIN, BCM2835_GPIO_FSEL_ALT0);

  8. // 预分频 2.   可以根据自己的需要更改
  9. bcm2835_pwm_set_clock(BCM2835_PWM_CLOCK_DIVIDER_2);
  10.    
  11. // 设置通道1的Mark-Space 模式
  12. // 参数说明:第1个参数:0或者1,指定PWM通道。第2个参数:0,Balanced模式;1,Mark-Space模式
  13. //           第3个参数:1,打开PWM功能。0:关闭PWM功能。
  14. bcm2835_pwm_set_mode(PWM_CHANNEL, 1, 1);
  15.    
  16. //设置好PWM参数之一 RANGE
  17. bcm2835_pwm_set_range(PWM_CHANNEL, RANGE);
  18.         
  19. // 重点:设置占空比。
  20. bcm2835_pwm_set_data(PWM_CHANNEL, (RANGE * out_duty) / 100);</font>
复制代码


好了,用示波器就可以看到输出的指定频率和占空比的PWM波形了。

有同学肯定想要源代码,我就是在例子源代码的基础上修改输出引脚而已。 源代码在这里。
http://www.airspayce.com/mikem/bcm2835/pwm_8c-example.html

这个图是风扇以50%占空比旋转时候的照片。比较安静了,耳朵靠近了才能听到转动声。



这个图是通过网页看到的树莓派的简单动态信息。树莓派上安装lighttpd,然后用C语言写了CGI程序,通过Ajax方式刷新网页,就可以看到这些信息了。

后期想有时间了,还是打个PCB板,做的漂亮点,同时还用树莓派控制几个用电设备的电源通断。


====END====


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

打赏

参与人数 1家元 +60 收起 理由
家睦 + 60

查看全部打赏

发表于 2021-6-12 12:30:34 | 显示全部楼层
我的4b还没有热死掉过, 只贴了几个小散热片, 是有点热但不至于死机
回复 支持 反对

使用道具 举报

发表于 2021-6-12 15:08:05 | 显示全部楼层
楼主下一步改进下,用esp8266代替树莓派。
回复 支持 反对

使用道具 举报

发表于 2021-6-12 15:37:59 | 显示全部楼层
不错不错,一个基本完善的小应用
回复 支持 反对

使用道具 举报

发表于 2021-6-12 16:04:00 | 显示全部楼层
nRF24L01模块;负责什么呢?
回复 支持 反对

使用道具 举报

发表于 2021-6-12 18:31:06 | 显示全部楼层
our420 发表于 2021-6-12 12:30
我的4b还没有热死掉过, 只贴了几个小散热片, 是有点热但不至于死机

我散热片都没贴,那是相当的烫手
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-12 19:45:44 | 显示全部楼层
our420 发表于 2021-6-12 12:30
我的4b还没有热死掉过, 只贴了几个小散热片, 是有点热但不至于死机

CPU频繁运行的时候,比如定时更新系统的时候,温度很高,有可能会热死。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-12 19:49:21 | 显示全部楼层
kkstun 发表于 2021-6-12 15:08
楼主下一步改进下,用esp8266代替树莓派。

我是从ESP8266改过来的。我觉得玩操作系统比较过瘾。:lol:
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-12 19:51:36 | 显示全部楼层
lyy-cy 发表于 2021-6-12 16:04
nRF24L01模块;负责什么呢?

nRF24L01模块负责接收单片机的数据或者发送指令给单片机。
现在有个冰箱的监测器,实时记录其运行参数,并且把数据上传到树莓派后,树莓派再转发到阿里云服务器。
回复 支持 反对

使用道具 举报

发表于 2021-6-12 22:14:43 | 显示全部楼层
ahyu99 发表于 2021-6-12 19:45
CPU频繁运行的时候,比如定时更新系统的时候,温度很高,有可能会热死。 ...

python3是效率低, 但是我观察过upgrade时大部分时间只用了一个核心.
源码编译scipy时占用率高, 4个核心都用上了, 而且动辄6,7个小时, 也没死过. 看了那几个小散热片管点用:lol:
回复 支持 反对

使用道具 举报

发表于 2021-6-12 22:53:01 | 显示全部楼层
ahyu99 发表于 2021-6-12 19:49
我是从ESP8266改过来的。我觉得玩操作系统比较过瘾。

esp8266透传数据到云服务器,随便玩。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-13 08:47:45 | 显示全部楼层
our420 发表于 2021-6-12 22:14
python3是效率低, 但是我观察过upgrade时大部分时间只用了一个核心.
源码编译scipy时占用率高, 4个核心都 ...

树莓派zero w 就是单核的。
我没有用python,我觉得这种小应用,再入住一个大家伙,似乎不值得。再说了,都是调用库,其它的输入输出都是差不多的,为啥不用Native code?
当然,涉及到深度学习之类的,还是用python。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-13 08:50:00 | 显示全部楼层
kkstun 发表于 2021-6-12 22:53
esp8266透传数据到云服务器,随便玩。

我知道,我也试过的。觉得不如树莓派方便。
这个是操作系统,可以直接在其系统上编程运行,可以使用的资源也多。所以就换到树莓派了。
当然ESP8266也有它的优点。
回复 支持 反对

使用道具 举报

发表于 2021-6-13 13:16:57 | 显示全部楼层
ahyu99 发表于 2021-6-13 08:47
树莓派zero w 就是单核的。
我没有用python,我觉得这种小应用,再入住一个大家伙,似乎不值得。再说了, ...

哦, 4b是4核的还真不知道zero是单核, 这样的话还是用c写吧, python效率太低.
其实感觉zero w跑linux都有点吃力
回复 支持 反对

使用道具 举报

发表于 2021-6-13 15:09:57 | 显示全部楼层
ahyu99 发表于 2021-6-13 08:50
我知道,我也试过的。觉得不如树莓派方便。
这个是操作系统,可以直接在其系统上编程运行,可以使用的资 ...

我跟你想法正好相反。树莓派我也有,多年前玩的。云服务更方便,结合手机。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-13 15:54:13 | 显示全部楼层
kkstun 发表于 2021-6-13 15:09
我跟你想法正好相反。树莓派我也有,多年前玩的。云服务更方便,结合手机。 ...

可能吧,个人的想法和爱好不同。各有所长。
回复 支持 反对

使用道具 举报

发表于 2021-6-15 16:34:55 | 显示全部楼层
实时性恐怕不能保证
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-17 19:42:13 | 显示全部楼层
inthsunshine 发表于 2021-6-15 16:34
实时性恐怕不能保证

不需要太高的实时性要求。现在仅仅是上传、下达数据或者指令而已。秒级别的响应,基本上可以满足了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-26 12:42 , Processed in 0.140400 second(s), 10 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表