在写PWM风扇驱动之前:如何透过FG信号,获取风扇转速?
创作时间:
作者:
@小白创作中心
在写PWM风扇驱动之前:如何透过FG信号,获取风扇转速?
引用
1
来源
1.
https://developer.aliyun.com/article/1599793
本文以全志H713平台为例,详细介绍如何通过FG信号获取PWM风扇的转速信息。文章从风扇规格、FG信号原理到具体的软件算法实现,为嵌入式系统和驱动开发工程师提供了详尽的技术指导。
一、前言
PWM风扇是日常SOC智能设备开发中常见的外围设备,驱动工程师的主要工作是实现风扇的控制驱动,包括设定风扇速度和获取风扇转速信息。PWM风扇通过FG信号线反馈转速信息,本文将基于全志H713平台,介绍FG信号线的用法以及PWM风扇转速获取的算法。
二、风扇规格
2.1 线序
从风扇规格书中,可得知黄色线(YELLOW)为FB线。根据规定线序,接好线。
2.2 FG 信号说明
下图是风扇规格书中的FG信号说明,可以看到最下方有四个公式。对于新手而言,最开始看到这些公式可能会有些疑惑,后续可以通过推导理解公式的具体含义。
三、FG公式推导
FG信号是由风扇根据其转速反馈的一个方波频率信号。从图中可知,风扇转一圈的周期 T=T1+T2+T3+T4。
- 假设方波的频率为 f,则 f = 1 / T
- N = R.P.M,此处的R.P.M代表的是每分钟的转速,例如风扇每分钟转60圈,则N = R.P.M = 60 rpm,所以N就是转速
下面是一些公式的推导和验证,通过自己推导,就可以理解最终 N = FG * 30 的含义:
• N=R.P.M 电机铭牌中_R.P.M_就是指电机的额定转速,单位是:转/分。
• T = T1+T2+T3+T4, 可知 T 代表周期
• N / 60秒 = 每秒钟 n 转, 即 HZ (用 f 表示)
• 60秒 / N = 1 / n = 1 / f = T 周期
• 如按上升沿次数计算,一个周期里面有 2个上升沿,如1秒钟内有 a 个上升沿,a其实就是FG,我们可以通过下面来验证:
• 则 f = a / 2 => T = 2 / a ==> T = 2 / FG ==> FG = 2 / T = 1 / (2T)
• 则 频率 f = 1 / T , 转速 N = fx60秒 = 60秒 x (1/ T) = 60 / ( 2/ FG) = FGx30 , 即 N = FGx30
• 综上,可得知FG = 1秒内出现的上升沿的次数,即上升沿中断的次数,
• 之后可通过 N = FG x 30 得出风扇的R.P.M, 每分钟转速
四、软件算法解析
此软件算法已集成在全志公版代码之中,此处仅贴出必要部分做讲解。
4.1 HZ 的概念
Jiffy是在中声明的内核时间单位。为了理解Jiffy,需要引入一个新的常量HZ,它是jiffies在1s内递增的次数,每个增量被称为一个Tick。在全志内核中 #define HZ 1000
,它代表的含义是1秒内有1000个Tick。
4.2 算法
从FG信号的原理,我们如何进行编码呢?答案是,我们只需要统计1秒内,或者说单位时间内 FG信号的上升沿次数就可以了,也就是利用中断触发的次数来统计,每次有FG的上升沿到来时,就将 nFgCount + 1。
比如,设定1个定时器,这个定时器每秒钟触发1次,每次触发,都读取nFgCount ,将其除以2就是频率f。
下面,演示的就是这个算法:
//(1)FG信号的中断处理函数,每次给自己+1
static irqreturn_t pulse_handler(int irq, void *dev_id)
{
struct pwm_fan_ctx *ctx = dev_id;
//每次FG引脚的中断触发,让pluses + 1
atomic_inc(&ctx->pulses);
return IRQ_HANDLED;
}
//(2)定时器的中断处理函数,每次触发,先获取pulse,用完后又将ctx->pulses归零,方便统计单位时间内次数
static void sample_timer(struct timer_list *t)
{
struct pwm_fan_ctx *ctx = from_timer(ctx, t, rpm_timer);
unsigned int delta = ktime_ms_delta(ktime_get(), ctx->sample_start);
int pulses;
if (delta) {
pulses = atomic_read(&ctx->pulses);//1秒内发生的脉冲次数
atomic_sub(pulses, &ctx->pulses);// 归零
//此处delta的理论值应该是1000ms,但会有些小小误差
//可见此处,最终计算每分钟转速的公式: RPM=FGx30
ctx->rpm = (unsigned int)(pulses * 1000 * 60) /
(ctx->pulses_per_revolution * delta);
ctx->sample_start = ktime_get();
}
mod_timer(&ctx->rpm_timer, jiffies + HZ);//设置+HZ后超时,继续触发sample_timer函数
}
//(3)最后,来看一下这个风扇设备的Probe过程,其中绑定了中断和中断处理函数,初始化了计时器
static int pwm_fan_probe(struct platform_device *pdev)
{
…… 略 ……
//从DTS中解析中断 FG信号线的中断,interrupts
ctx->irq = platform_get_irq_optional(pdev, 0);
if (ctx->irq == -EPROBE_DEFER)
return ctx->irq;
…… 略 ……
timer_setup(&ctx->rpm_timer, sample_timer, 0);//初始化定时器和定时函数
…… 略 ……
of_property_read_u32(dev->of_node, "pulses-per-revolution", &ppr);
ctx->pulses_per_revolution = ppr;//获取一个周期有几个pulses,PWM风扇一般为2个,具体见规格书
if (!ctx->pulses_per_revolution) {
dev_err(dev, "pulses-per-revolution can't be zero.\n");
return -EINVAL;
}
if (ctx->irq > 0) {
ret = devm_request_irq(dev, ctx->irq, pulse_handler, 0,
pdev->name, ctx);//绑定FG中断响应函数
if (ret) {
dev_err(dev, "Failed to request interrupt: %d\n", ret);
return ret;
}
ctx->sample_start = ktime_get();//初始化开始时间
mod_timer(&ctx->rpm_timer, jiffies + HZ);//定时器开始计时,+HZ 后响应定时中断
}
…… 略 ……
//此处,将fan注册为 cooling device, 并提供了查询和设置当前风扇转速等级的函数,供Thermal使用
ctx->pwm_fan_state = ctx->pwm_fan_max_state;
if (IS_ENABLED(CONFIG_THERMAL)) {
cdev = devm_thermal_of_cooling_device_register(dev,
dev->of_node, "pwm-fan", ctx, &pwm_fan_cooling_ops);
if (IS_ERR(cdev)) {
ret = PTR_ERR(cdev);
dev_err(dev,
"Failed to register pwm-fan as cooling device: %d\n",
ret);
return ret;
}
ctx->cdev = cdev;
thermal_cdev_update(cdev);
}
}
五、篇尾
谢谢关注~
热门推荐
《机械工程领域高质量科技期刊分级目录(第二版)》发布
板岩:一种常见的建筑材料
贝林厄姆的职业生涯:能否超越齐达内的传奇?球迷投票显示明显差距
藕的热量(莲藕的热量)
苹果手机关闭屏幕使用时间的详细步骤指南
腾冲旅游十大景点,腾冲旅游景区介绍
@所有人,这些初春时令水果,生活中赶紧安排起来~
AI大模型之对比:如何对比两个AI大模型的性能
“统仓共配”:畅通农村物流“最后一公里”
金川区:客货邮融合发展 铺就乡村振兴 “快车道”
脾胃虚弱的人怎么吃比较好?选择这些易消化的食物
如何拿到气象数据库
天然气行业市场现状及供需格局、未来前景分析2025
夭折的高速轰炸机之梦:苏联M50轰炸机
夭折的高速轰炸机之梦:苏联M50轰炸机
八字揭秘:揭秘你命中的理想职业
选修课也有“黄牛”?选课当有托底机制
赵匡胤与宋朝的建立:终结五代十国混乱局面的历史分析
发现被骗了怎么办?多种退款途径及应对措施详解
锦州自驾租车攻略及注意事项:享受自由出行的便利与乐趣
右下腹淋巴结肿大原因有哪些症状
激光焊接机的工作原理及分类
焊接机器人可划分为哪三类,焊接机器人生产厂家解答
绩效指标达成率计算公式怎么算?
一首儿歌背后的曲折人生 |《卖报歌》
腰椎间盘突出牵引怎么做
如何满足在中国进行PCT国际专利申报的条件?
PCT专利申请详细流程
北京地铁3号线最新进展,顺义出行更便捷!
老人一到冬天就手脚冰凉?泡脚管用吗?医生提醒:调理要做好3点