|
为了将数据上传到云服务器上,同时将云服务器的数据/指令接收回来,考虑到编程的方便性、性能和功耗,最终选择了树莓派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 12 | Alt Fun 0
| - | GPIO 13
| - | Alt Fun 0 | GPIO 18 | Alt Fun 5 | - | GPIO 19
| - | Alt Fun 5 | GPIO 40 | Alt Fun 0 | - | GPIO 41
| - | Alt Fun 0 | GPIO 45
| - | Alt Fun 0 | GPIO 52 | Alt 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的时间。
基本的代码功能解释如下:
- <font size="4">// BCM PIN13, 物理引脚33引脚输出PWM
- #define PIN RPI_V2_GPIO_P1_33
- // 使用 PWM 通道1
- #define PWM_CHANNEL 1
- #define RANGE 400 // 这个范围的作用上面已经说明 了
- // 设置输出引脚为Alt Fun 0,这样才能输出PWM。
- bcm2835_gpio_fsel(PIN, BCM2835_GPIO_FSEL_ALT0);
- // 预分频 2. 可以根据自己的需要更改
- bcm2835_pwm_set_clock(BCM2835_PWM_CLOCK_DIVIDER_2);
-
- // 设置通道1的Mark-Space 模式
- // 参数说明:第1个参数:0或者1,指定PWM通道。第2个参数:0,Balanced模式;1,Mark-Space模式
- // 第3个参数:1,打开PWM功能。0:关闭PWM功能。
- bcm2835_pwm_set_mode(PWM_CHANNEL, 1, 1);
-
- //设置好PWM参数之一 RANGE
- bcm2835_pwm_set_range(PWM_CHANNEL, RANGE);
-
- // 重点:设置占空比。
- 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
打赏
-
查看全部打赏
|