PWM调速信号的计算与输出
查阅资料可知,PWM调速风扇的四根线分别是:电源正负、PWM控制输入、FG转速反馈。经过测试,PWM脚悬空即可获得最大转速,施加电压调整为0-5V,风扇转速平稳地上升或下降。至此可以确认,风扇内部有对PWM脚的低通滤波、弱上拉电路,在这里我们使用Arduino控制转速时,只要简单产生0%-100%的PWM调速信号,就可以实现风扇油门调节。
风扇测速信号的获取、计算、转换、显示
风扇的测速信号比起PWM调速控制更加费工夫,已知风扇的黄色线为测速线,因此我将其连接到了Arduino UNO开发板的A0引脚上,但是从模拟引脚读出的数值波动性大,很显然这并非风扇的转速,因此我通过查阅资料得知测速线输出的是FG方波信号,我现在需要读取到方波的频率p,因此我使用了pulseIn()函数,其中方波波长λ满足下式:
得出了方波的波长λ,已知λ的单位是μs,已知1s=1000000μs通过简单的单位换算可以得出方波的频率p:
由已知知识可知,转子每圈旋转,FG信号输出两个方波周期,因此可得转速与方波频率的关系如下:
电路设计图
项目的源代码
#include "DHT.h"
//调用温湿度传感器的库文件
#include <LiquidCrystal.h>
//调用1602显示屏的库文件
#define D 9
//定义传感器引脚位
DHT dht(D,DHT11);
//设置读取结果变量dht
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
//通过关联任何需要的LCD接口引脚初始化库
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
//它所连接的开发板引脚号
const int analogWritePin = 6;
int sensorValue = 0;
int outputValue = 0;
int sensorInput = 13;
unsigned long duration;
unsigned long rpm;
byte degree[8] = {
B00111,
B00101,
B00111,
B00000,
B00000,
B00000,
B00000,
B00000,
};
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(sensorInput,INPUT_PULLUP);
pinMode(analogWritePin,OUTPUT);
dht.begin();
//开始读取温度和湿度
lcd.begin(16,2);
//初始化LCD显示屏,显示方式为双行每行16个字符
lcd.createChar(0,degree);
//创建用户字符,字符数据为degree,字符编号为0
}
void loop() {
// put your main code here, to run repeatedly:
float t = dht.readTemperature();
//读取dht温度(摄氏度)
outputValue = map(t,10,30,0,255);
//通过实时温度匹配风扇转速
analogWrite(analogWritePin,outputValue);
//驱动风扇旋转
duration = pulseIn(sensorInput,HIGH);
//得出方波的半波长
rpm = 1000000/duration/2*30;
//通过算法计算实时转速
lcd.setCursor(0,0);
//设置光标到第一行第一列
lcd.print("TEMP:");
//打印“T:(temperature温度)”
lcd.print(t);
//打印实时湿度
lcd.write(byte(0));
//打印自定义字符degree
lcd.print("C");
//打印“C”,与自定义字符组成完整的摄氏温度单位
lcd.setCursor(0,1);
//设置光标到第二行第一列
lcd.print("RPM:");
lcd.print(rpm);
//打印实时转速
lcd.print("r/min");
delay(200);
}
示波器信号输出