PCEVA,PC绝对领域,探寻真正的电脑知识
打印 上一主题 下一主题
开启左侧

【原创】巧用主板speaker接口实现PWM风扇调速

  [复制链接]
跳转到指定楼层
1#
wsy2220 发表于 2012-6-3 14:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
点击数:37404|回复数:88
本帖最后由 wsy2220 于 2012-6-3 14:06 编辑

       最近略蛋疼,弄了一个服务器上拆下来的台达的暴力扇玩,型号AFC1212DE.12V1.6A,全速4000转,支持pwm调速。我打算接到主板的4pin接口来调速,毕竟暴力扇的噪音不是一般的大。等我接上去之后才发现,尼玛坑爹了。
暴力扇:



      话说两年前我还是小白一枚,去电脑城被忽悠买了这个板,2敏DEG53-RA,790GX+AM39+DDR3.捷波代工的,做工还过得去,但是二三线厂商的BIOS研发能力实在是太烂了。主板上的温度监控和风扇调速芯片是Fintek F71863,这颗芯片是支持PWM调速的,而且主板上的风扇接口也是4pin的。之前一直用的3pin风扇,电压调控是正常的,没试过PWM风扇,这回把风扇插上去,进BIOS一看,居然没有PWM调速的选项,还是只能电压调速。更坑爹的是用AMIBCP打开BIOS看了下,是有PWM调速的相关字符串的,但是实际上显示不出来。所以买主板还是要选一线大厂的,血的教训啊。
BIOS设置中只有转速调接选项:



AMIBCP里PWM调速的相关选项:



      身为穷学生一枚,一直没有足够的预算换主板,所以只能自己想办法解决了。虽然没钱,但是我有折腾的精神。试过改BIOS,甚至试过刷其他厂商的BIOS(http://bbs.pceva.com.cn/thread-44951-1-1.html),但是都没有解决。因此只能想办法DIY了。既然主板能提供12V直流电压输出,那么要实现调速缺少的就是PWM信号了。开始之前,我们先看看PWM风扇调速的原理。

脉冲宽度调制(PWM),是英文“PulseWidth Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。(http://baike.baidu.com/view/168039.htm

简单说来,就是产生一个方波,在一个周期内高电平的时间越长,对风扇来说,转速越快。当信号全部是高电平的时候达到转速最大,全低则为最低转速。
PWM信号的波形:


      
      那么要怎样获得这样一个可调的方波信号呢?我把目光瞄向了主板上的speaker接口。这个插口为speaker提供一个方波信号,在BIOS自检结束以后发出“哔”的一声。
将风扇pwm信号线单独抽出来:




      通过查阅资料了解到,这个接口是由外围接口芯片8255和定时器芯片8253控制的。当然,这是最早期的PC上的情况,现在这些芯片全都集成到主板芯片组里了,但是接口地址依然保持兼容。将61H端口的第0位置0,第1位置1可以输出高电平,第1位置0可输出低电平(实际上是高阻状态)。因此可以通过编程来实现不同占空比的方波输出。
Speaker接口的电路图:



简化的电路(http://www.iteedu.com/plang/asm/asmpcshzhjj/4-1.php):



实际的speaker接口,电容电阻和与门清晰可见:



      不得不感叹一下,几十年过去了,这些设计依然保持着最初的状态,呵呵.

      有意思的是由于speaker接口是直接与8255相连的,因此高电平时输出电平仅有0.1V,而intel规范中的PWM信号低电平上限是0.8V,因此在风扇看来此处的输出高电平是低电平,而此接口的低电平(高阻)则是高电平。所以在编程序的时候要注意高电平的时间越长,风扇转速越低。

      由于在DOS下用汇编语言可以方便的访问IO接口,所以我先用汇编语言写了个小程序,在DOS下试验了一下,效果很好,能够实现无级变速。不过根据intel的PWM规范,提供给PWM风扇的信号频率应该在25KHz左右(感谢R大提供的资料
http://bbs.pceva.com.cn/thread-47104-1-1.html)。而主板为了speaker发出的声音更悦耳(汗),在接口上加了个低通滤波器,导致高于20KHz的信号就无法送到插座上,因此我只能用大约几千HZ的PWM信号。不过事实证明,这样的信号依然能够实现调速,风扇也工作得很好,当然,如果把主板上那个电容抠掉,应该能达到更高的频率,也不会有其他副作用。

  1. 汇编语言代码:

  2. STACK   SEGMENT  STACK 'STACK'
  3.         ST1 DB 128 DUP(?)
  4.         TOP EQU LENGTH ST1
  5. STACK   ENDS
  6. CODE        SEGMENT
  7. ASSUME CS:CODE,SS:STACK     
  8. MAIN PROC FAR
  9. START:  MOV AX,STACK
  10.         MOV SS,AX
  11.         PUSH DS
  12.         MOV AX,0
  13.         PUSH AX
  14.         MOV AL,10110110B
  15.         OUT 43H,AL   
  16.         MOV BX,00FFH
  17.         MOV DX,00FFH
  18. PWM:
  19.         MOV CX,BX
  20. HI:
  21.         MOV AL,2
  22.         OUT 61H,AL
  23.         LOOP HI
  24.         MOV CX,DX
  25. LW:
  26.         MOV AL,0
  27.         OUT 61H,AL
  28.         LOOP LW
  29.         MOV AH,02H
  30.         INT 16H
  31.         TEST AL,01000000B
  32.         JNZ RTN
  33.         TEST AL,00000001B
  34.         JNZ HIPLUS
  35.         TEST AL,00000010B
  36.         JNZ HIMNS
  37.         TEST AL,00000100B
  38.         JNZ LWPLUS
  39.         TEST AL,00001000B
  40.         JNZ LWMNS
  41.         JMP PWM
  42. HIPLUS:
  43.         INC BX
  44.         JMP PWM
  45. HIMNS:
  46.         DEC BX
  47.         JMP PWM
  48. LWPLUS:
  49.         INC DX
  50.         JMP PWM
  51. LWMNS:
  52.         DEC DX
  53.         JMP PWM
  54. RTN:
  55.         MOV AL,2
  56.         OUT 61H,AL
  57.         RET               
  58. MAIN ENDP                                
  59. CODE ENDS                                
  60.         END   
复制代码

      折腾无极限,我又想试试在Windows下也实现调速。不过Windows下为了安全,不允许直接访问I/O端口。当然,对于想折腾的我,哪能被这点困难吓倒。又经过一番折腾,才找到一个办法:winio库。对于一个C++初学者来说,这个过程可不容易
     好不容易写好了一个小程序,令我纠结的事情又来了,Windows运行在保护模式下,要做到精确定时非常难,所以只能调用精度很差的delay函数,仅精确到毫秒级,pwm信号频率也只有100HZ,而且很容易受其他程序的干扰。结果就是,看网页的时候滚动一下,风扇转速就变一下(泪奔)。而要实现高精度计时,就要让一个CPU满载,得不偿失啊。

      好吧,折腾就到此为止吧,这风扇还是留着冲风冷极限用吧,要实现更好的功能,还是单片机更方便。其实我想说,DIY精神在于将手中的东西发挥到极致,在这个过程中动脑筋,折腾,享受折腾思考和学习的乐趣。为了实现这个简单的功能,这几天的折腾查了不少资料,学了不少知识.

      最后附上两个程序和源代码。DOS下左shift和左ctrl增加高电平并减小低电平(转速升高),右shift和右ctrl减小高电平并增加低电平(转速降低).Windows下输入转速等级(1-10),回车开始输出,按ctrl+end停止,运行中可用ctrl+(+)和ctrl+(-)来调节,并且需要在启动时按f8禁用驱动程序强制签名.都是入门水平,老鸟勿喷。

全文完,谢谢各位观看







本帖子中包含更多资源

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

x

评分

参与人数 22活跃度 +161 收起 理由
nokia5510 + 5 很给力!lz你84一般淫!
蜗牛也是牛 + 5 很给力!强大。
bssharp + 5 8253,8255,昨天还用proteus模拟来着!苦逼.
disz + 5 高手高手高高手!
xxy + 5 很给力!
overthink + 5 很给力!
yangmcom + 2 很给力!
幻目之童 + 5 赞一个!
不明真真相 + 5 很给力!
frontwing + 3 这个果断碉堡了
akjz + 5 折腾无极限……
changchar + 5 很给力!技术宅拯救世界!
powerful_j + 5 真技术 牛逼
neoalex + 3 赞一个!
luoyu_1980 + 3 厉害~!
einstein86 + 5 赞一个!
rkingj + 40 赞一个!
qingxigreat + 5 赞一个!
hxl + 5 碉堡了
ggxuelei + 5 很给力!
royalk + 30 这方法好
solonace + 5 赞一个!

查看全部评分

2#
solonace 发表于 2012-6-3 14:37 | 只看该作者
太能折腾了,佩服一个
3#
ach9999 发表于 2012-6-3 14:54 | 只看该作者
楼主动手能力不错啊   强力的狠  学习一下
4#
大D来了 发表于 2012-6-3 14:57 | 只看该作者
真你玛太累了
5#
badaa 发表于 2012-6-3 17:45 | 只看该作者
我是來打救樓主的,10塊錢一片而已

本帖子中包含更多资源

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

x
6#
wsy2220  楼主| 发表于 2012-6-3 17:47 | 只看该作者
badaa 发表于 2012-6-3 17:45
我是來打救樓主的,10塊錢一片而已

买现成的就没意思了

点评

學生就是時間多啊  发表于 2012-6-3 17:55

评分

参与人数 1活跃度 +1 收起 理由
bssharp + 1 我也是学生,咋从没感觉到时间多…….

查看全部评分

7#
tucksky 发表于 2012-6-3 19:49 | 只看该作者
当年读书没认真啊。还是楼主好。
8#
plane501 发表于 2012-6-3 20:02 | 只看该作者
lz碉堡了。。。汇编早就还给老师了
9#
quanx 发表于 2012-6-3 20:04 | 只看该作者
这个不错
学习了
10#
mvp1155 发表于 2012-6-3 20:18 | 只看该作者
楼主厉害 顶·····
11#
ggxuelei 发表于 2012-6-3 20:29 | 只看该作者
碉堡了。。。。。。。
12#
hxl 发表于 2012-6-3 20:49 | 只看该作者
就是玩折腾
13#
xxy 发表于 2012-6-3 20:50 | 只看该作者
本纠结帝看好你

评分

参与人数 1活跃度 +5 收起 理由
wsy2220 + 5 我口水你这个纠结帝勋章很久了~.

查看全部评分

14#
ylw1945 发表于 2012-6-3 20:52 | 只看该作者
顶一下,楼主这个简直碉堡了
自己动手,丰衣足食
15#
534134587 发表于 2012-6-3 21:05 | 只看该作者
这个。。。。太厉害了!
16#
贱狗在飞啊 发表于 2012-6-3 22:08 | 只看该作者
badaa 发表于 2012-6-3 17:45
我是來打救樓主的,10塊錢一片而已

這塊名字是叫啥呢?。請問。
17#
wingvivi 发表于 2012-6-3 22:10 | 只看该作者
你玛太累
18#
Mufasa 发表于 2012-6-3 22:14 | 只看该作者
这个已经强到爆了。。。。

我自己是用C51单片机实现的软件PWM,效果也不错。
19#
wsy2220  楼主| 发表于 2012-6-3 22:23 | 只看该作者
Mufasa 发表于 2012-6-3 22:14
这个已经强到爆了。。。。

我自己是用C51单片机实现的软件PWM,效果也不错。 ...

用单片机就方便多了,现在大部分都有pwm模块了...x86系统的控制功能已经被极度弱化了...
20#
3332243 发表于 2012-6-3 23:08 | 只看该作者
哇哇,LZ数电不错。。我也是学电子的,一窍不通。。。看了要多请教你

点评

我没学过电子...我是学物理的,就了解点皮毛,电子方面还要向你请教呢...  发表于 2012-6-3 23:26
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部