如何使用GreenPAK为PC风扇构建PWM控制器

描述

本文介绍了如何使用DialogGreenPAK可配置混合信号IC构建12VPC风扇PWM控制器。该项目涉及旋转编码、PWM控制、PCB设计和C#应用程序编程。

该设计最多可控制16个3针电脑风扇,使用一对DialogGreenPAK可配置混合信号IC来控制每个风扇的占空比,并包括两种改变风扇速度的方法:

带有正交/旋转编码器和

使用Windows应用程序—内置于C#中,通过I2C与GreenPAK进行通信。

系统框图

PWM

图1.系统框图

SLG46108旋转解码器设计

为了手动增加或减少风扇的占空比,我们使用了旋转编码器。该设备在相隔90°的通道A和通道B输出上输出脉冲。有关旋转编码器工作原理的更多信息,请参见AN-1101:非时钟正交解码器。

PWM

图2.旋转编码器框图

然后,我们使用DialogGreenPAKSLG46108创建了一个时钟旋转解码器来处理通道A和通道B信号并将它们输出为逆时针(CCW)和顺时针(CW)脉冲。

当通道A领先于通道B时,设计会在CW上输出一个短脉冲。当通道B超前通道A时,它在CCW上输出一个短脉冲。

PWM

图3.GreenPAKSLG46108旋转解码器设计

我们使用3个DFF将通道A输入与时钟同步。同样,我们使用管道延迟,将OUT0设置为2个DFF,将OUT1设置为3个DFF,为通道B创建相同的功能。

然后,我们使用一些LUT来创建CW和CCW输出。有关此标准旋转解码器设计的更多信息,请访问此网站。

最后,GreenPAKRotaryDecoder将接收到下图中的输入脉冲A和B,并输出如图所示的CW和CCW脉冲。

PWM

图4.旋转信号时序图

异或门之后的电路确保不会同时出现CW脉冲和CCW脉冲,以防旋转编码器出现错误。CW和CCW信号上的8ms下降沿延迟迫使它们在8ms加1个时钟周期内保持高电平,这对于下游SLG46826GreenPAK是必需的。

SLG46826风扇控制器设计

PWM

图5.GreenPAKSLG46826风扇控制器设计

使用偏移计数器生成PWM

为了生成PWM信号,我们使用了一对具有相同周期的偏移计数器。第一个计数器设置DFF,第二个计数器将其重置,从而创建一致的占空比PWM信号,如下所示。

PWM

图6.PWM生成时序图

PWM

图7.使用偏移计数器生成PWM

CNT6设置DFF10,CNT1的反相输出复位DFF10。引脚18和19用于将PWM信号输出到外部电路。

具有时钟注入和时钟跳跃的占空比控制

风扇控制器接收来自旋转解码器的CW和CCW信号作为输入,并使用它们来增加或减少控制风扇速度的PWM信号。我们通过几个数字逻辑组件实现了这一点。

我们需要做的是使占空比在我们接收到CW脉冲时增加。我们可以通过向CNT6模块注入一个额外的时钟脉冲来实现这一点,使其比其他方式早一个时钟周期输出。您可以在下面的时序图中看到此过程。

PWM

图8.时钟脉冲注入

CNT1仍以恒定速率获得时钟,但CNT6注入了几个额外的时钟。每当计数器有一个额外的时钟时,它就会将其输出向左移动一个时钟周期。

相反,如果我们想降低占空比,我们需要为CNT6跳过一个时钟脉冲。您可以在下图中看到该过程,其中CNT1仍然以恒定速率获得时钟,而CNT6有跳过的时钟脉冲,其中计数器没有按预期获得时钟。这样我们就可以将CNT6的输出一次向右推一个时钟周期,从而缩短输出PWM占空比。

PWM

图9.时钟脉冲跳跃

我们使用GreenPAK中的一些数字逻辑元件实现了时钟注入和时钟跳跃功能。我们使用一对多功能块来创建一对锁存器/边缘检测器组合。4位LUT0用于在通用时钟信号(CLK/8)和时钟注入或时钟跳跃信号之间进行复用。此功能将在第5.2.2节防止占空比翻转中更详细地描述。

按钮输入

BUTTON输入去抖20ms,然后用于触发一个锁存器,该锁存器将确定是否选择了该特定芯片。如果选择它,则4位LUT将传递时钟跳跃或注入信号。如果未选择芯片,则4位LUT将简单地传递CLK/8信号。

PWM

图10.时钟跳跃和时钟注入

防止占空比翻转

RS锁存器3位LUT5和3位LUT3用于确保您不能注入或跳过太多时钟,以免偏移计数器翻转。我们不想让系统达到100%的占空比,然后如果它接收到另一个注入的时钟,则翻转到1%的占空比。

RS锁存器通过在系统距离翻转1个时钟周期时锁存多功能模块的输入来防止这种情况发生。我们使用一对DFF将PWM_SET和PWM_nRST信号延迟一个时钟周期,如下图所示。

PWM

图11.BLOCK_CW和BLOCK_CCW

然后,我们使用一对LUT来创建必要的逻辑。如果我们的占空比太低以至于延迟的PWM_SET信号与PWM_nRST信号同时出现,我们不想进一步降低占空比,否则我们将翻转。

PWM

图12.最小占空比翻转情况

同样,如果我们正在接近最大占空比,从而延迟的PWM_nRST信号与PWM_SET信号同时出现,我们不想进一步增加占空比。在这种情况下,我们需要将nRST信号延迟2个时钟周期,以确保系统不会从99%翻转到1%。

PWM

图13.最大占空比翻转情况

具有I2C的占空比控制

该设计采用了另一种控制占空比的方法,而不是时钟跳跃/时钟注入。我们可以使用外部微控制器向GreenPAK写入I2C命令,以编程方式设置占空比。

PWM

图14.I2C占空比控制

如上图中的红色标签所示,控制I2C上的占空比需要控制器执行特定的命令序列。这些命令在下表中按顺序显示。“x”表示用户不应更改的位,“[”表示START位,“]”表示STOP位。

表1.I2C命令

PWM

PDLY模块在CLK/8信号的下降沿产生一个短的高电平有效脉冲,我们称之为!CLK/8。该信号用于以稳定频率为DFF14提供时钟。当I2C_SET异步变高时,!CLK/8的下一个上升沿将导致DFF14输出HIGH,这将触发CNT5OneShot。OneShot将运行上表中“写入CNT5”I2C命令中指定的用户写入的时钟周期数。在这种情况下,它是10个时钟周期。OneShot允许25MHz振荡器准确运行其持续时间,并且不再让3位LUT0接收用户写入CNT5的时钟周期数。

下图显示了这些信号,其中红色时钟是发送到3位LUT0的信号,LUT0将它们传递到CNT6(PWM_SET计数器),从而为占空比生成创建偏移量。

PWM

图15.使用I2C加载占空比(频率不按比例)

转速表读数

如果需要,用户可以读取I2C上的转速计值,通过读取CNT2值来跟踪风扇转动的速度。CNT2将在每次ACMP0H出现上升沿时递增,并且可以通过I2C命令异步复位。(请注意,这是一个可选功能,ACMP0H的阈值需要根据正在使用的特定风扇的规格进行调整。)

PWM

图16.转速计部分

表2.I2C命令

PWM

外部电路设计

PWM

图17.风扇控制器框图

外部电路相当简单。有一个按钮连接到GreenPAK的Pin6以切换是否选择此特定设备进行旋转控制,以及连接到Pin12和Pin13的LED以指示何时选择设备。

由于风扇的电压为12伏,因此我们需要一对FET来控制其开关。GreenPAK的Pin18和Pin19驱动一个nFET。当nFET开启时,它将pFET的栅极拉低,将风扇连接到+12V。当nFET关闭时,PFET的栅极被1k电阻上拉,从而断开风扇从+12v。

PCD设计

我们将几块PCB放在一起来对我们的设计进行原型设计。左侧的PCB是“风扇控制器”,其中包含旋转编码器、12v插孔、SLG46108GreenPAK和FT232HUSB到I2C分线板的连接器。右侧的两个PCB是“风扇板”,其中包含SLG46826GreenPAK、按钮、开关、LED和风扇接头。

PWM

图18.PCB和连接器

每个风扇板的左侧都有一个带罩的公头,右侧有一个母头,因此它们可以菊花链式连接在一起。每个风扇板都可以填充资源以独立控制2个风扇。

C#应用程序

我们编写了一个C#应用程序来通过FT232HUSB-I2C桥接我们的风扇板。此应用程序可用于通过应用程序生成的I2C命令调整每个风扇的频率。

PWM

图19.C#应用程序GUI

应用程序将每秒对所有16个I2C地址执行一次ping操作,并使用存在的从地址填充GUI。在这种情况下,我们将风扇1(从地址0001)和风扇3(从地址0011)连接到电路板。用户可以通过移动滑块或在滑块下方的文本框中输入0-256的值来单独调整每个风扇的占空比。

项目结论

在本文中,我们使用一些DialogGreenPAK可配置混合信号IC创建了一个功能齐全的12vPC风扇PWM控制器。通过我们的设计,我们能够使用旋转编码器或C#应用程序独立控制多达16个风扇(因为有16个可能的I2C从地址)。我们演示了如何使用一对偏移计数器生成PWM信号,以及如何在不翻转的情况下增加和减少该信号的占空比。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分