树莓派论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3461|回复: 1
收起左侧

[其他] 【原创】【Java on Pi】模拟PWM监控,调节风扇转速

[复制链接]
发表于 2015-11-30 21:57:22 | 显示全部楼层 |阅读模式
本帖最后由 lynnxh 于 2015-11-30 22:00 编辑

受限于Pi的性能,java一直不是Pi 应用的开发首选,不过Pi 2 的性能跑Java已经没有问题啦,跑Eclipse都在可接受的范围内,嘿嘿。

国内Pi上玩java的太少,这里抛砖引玉一下,希望更多的码农在Pi上玩java。

嗯,废话不多说了,进入正题。

华丽的分割线----------------------------------------------------------------------------------------

首先,要有光!Pi的官方系统已经内置了JDK,输入java -version,ok!没有?apt-get install总会用吧?apt-cache search jdk,然后装吧。

其次,要有....PI4J。嗯,这个必须顶一个,实现了GPIO的控制,所以,你要有。还是apt-get install。

上面都是环境准备,好多教程,略过不表,进入正题:

我们都知道12V的电脑调速监控风扇用的是4针接口,这4针的定义请参考:

四针监控调速风扇

四针监控调速风扇
监控风扇转速就要用到SENSE的插针了。Control用来发送PWM信号,调节转速。

很明显Sense需要一个模数转换的过程,如果没有A/D卡,这个就有点复杂了,不想花钱还想要功能,就要多出点力了。模拟吧,好在风扇转速没那么快,Pi 2处理的来。

Sense的输入原理是当风扇旋转一圈,完整的输出1~4个波形。如果把Sense接到GPIO的数字口上,表现为高低电平的变化,也就是说如果我们能够监控GPIO口的电平变化情况,就可以算出1秒钟风扇转的圈数,这样就实现了转速的监控,简单吧?

代码如下:
  1. final GpioController gc = GpioFactory.getInstance();
  2. //注意,使用时必须加高电平,Sense才会输出波形!
  3. GpioPinDigitalInput measurePin = gc.provisionDigitalInputPin(RaspiPin.GPIO_00,"",PinPullResistance.PULL_UP);

  4. //定义一个触发器,每当输入的电瓶变化时,计数器+1
  5. private void initPinTrigger() throws Exception{
  6. if(measurePin == null){
  7. throw new Exception("Error to set Monitor , The GPIO Pin is Null !");
  8. }
  9. measurePin.addTrigger(new GpioCallbackTrigger(new Callable<Void>(){
  10. @Override
  11. public Void call() throws Exception {
  12. count ++ ;
  13. return null;
  14. }
  15. }));
  16. }
复制代码
看,我们已经能对输入的信号计数了,下面就要设置探测的时间间隔,每到间隔时间,重置计数器:
  1. <div>//做个线程,每秒重置计数器一次
  2. int measureTime = 1000;
  3. private float ratio = 0.25f;</div><div>
  4. public void run(){
  5. while(true){
  6. //重置计数器
  7. count = 0;
  8. try {
  9. Thread.sleep(measureTime);
  10. } catch (InterruptedException e) {
  11. // TODO Auto-generated catch block
  12. e.printStackTrace();
  13. }
  14. //计算风扇转速
  15. calculateFanSpeed();
  16. }
  17. }

  18. /**
  19.          * when the time to measure finished, use ratio,count calculate the speed
  20.          */
  21. private void calculateFanSpeed(){
  22. int fanSpeed = (int)(measureTime/1000 * 60 * ratio * count);</div><div>//更新风扇转速的单例
  23. ControllerInformation.getInstance().setFanSpeed(fanSpeed);
  24. }</div>
复制代码
需要注意的是计算风扇转速的时候,一个高电平、低电平的变化计数器累加了2次,因此,最少也要在计数器上除2。另外,还要了解风扇转一圈输出几个波形,实验一下就能简单的得出答案。我使用的台达风扇一圈输出2个波形,因此Ratio设置为0.25。

ok,到此,转速的监控就完成了,简单吧??

下一篇再来给大家介绍OneWire的java访问方法及PWM控制风扇的方法。


三针监控风扇

三针监控风扇
回复

使用道具 举报

发表于 2015-12-1 13:23:11 | 显示全部楼层
这个要前来支持。
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|树莓派论坛 ( 粤ICP备15075382号-1  

GMT+8, 2024-11-23 11:57 , Processed in 1.140625 second(s), 30 queries , Gzip On.

Powered by Shumeipai.net! X3.2

© 2001-2015 树莓派论坛安全联盟

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