好长时间没有写博客了,现在说一下最近做一个关于pwm调节风扇速度的,直接进入正题,风扇速度是通过占空比来调节速度的,
什么是占空比呢,简单的说就是一个周期内高电平拉长的时间与周期的比,成为占空比。
直接贴风扇速度控制部分:
通过上面的说明可以知道如何输出高低电平来控制风扇转速了。
我是通过GPIO模拟PWM来实现的,直接贴代码
/*************************************************************************
> File Name: fan_3.c
> Author:
> Mail:
> Created Time: Wed 06 Mar 2019 07:18:45 PM PST
************************************************************************/
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
//define O_WRONLY and O_RDONLY
//鑺墖澶嶄綅寮曡剼: CPIO4_21
#define SYSFS_GPIO_EXPORT "/sys/class/gpio/export"
#define SYSFS_GPIO_RST_PIN_VAL "106"
#define SYSFS_GPIO_RST_DIR "/sys/class/gpio/gpio1/direction"
#define SYSFS_GPIO_RST_DIR_VAL "out"
#define SYSFS_GPIO_RST_VAL "/sys/class/gpio/gpio1/value"
#define SYSFS_GPIO_RST_VAL_H "1"
#define SYSFS_GPIO_RST_VAL_L "0"
int main()
{
int fd;
int i = 0,j = 0,f = 0;
//鎵撳紑绔彛/sys/class/gpio# echo 117 > export
fd = open(SYSFS_GPIO_EXPORT, O_WRONLY);
if(fd == -1)
{
printf("ERR: Radio hard reset pin open error.\n");
return EXIT_FAILURE;
}
write(fd, SYSFS_GPIO_RST_PIN_VAL ,sizeof(SYSFS_GPIO_RST_PIN_VAL));
close(fd);
//璁剧疆绔彛鏂瑰悜/sys/class/gpio/gpio117# echo out > direction
fd = open(SYSFS_GPIO_RST_DIR, O_WRONLY);
if(fd == -1)
{
printf("ERR: Radio hard reset pin direction open error.\n");
return EXIT_FAILURE;
}
write(fd, SYSFS_GPIO_RST_DIR_VAL, sizeof(SYSFS_GPIO_RST_DIR_VAL));
close(fd);
//杈撳嚭澶嶄綅淇″彿: 鎷夐珮>100ns
fd = open(SYSFS_GPIO_RST_VAL, O_RDWR);
if(fd == -1)
{
printf("ERR: Radio hard reset pin value open error.\n");
return EXIT_FAILURE;
}
while(1)
{
i = 0;
j = 0;
f = 0;
while(f <= 250000)
{
for(j = 0; j < 18;j++)
{
write(fd, SYSFS_GPIO_RST_VAL_H, sizeof(SYSFS_GPIO_RST_VAL_H));
}
for(j = 0; j < 2; j++)
{
write(fd, SYSFS_GPIO_RST_VAL_L, sizeof(SYSFS_GPIO_RST_VAL_L));
}
f++;
}
f = 0;
while(f <= 250000)
{
for(j = 0; j < 2;j++)
{
write(fd, SYSFS_GPIO_RST_VAL_H, sizeof(SYSFS_GPIO_RST_VAL_H));
}
for(j = 0; j < 18; j++)
{
write(fd, SYSFS_GPIO_RST_VAL_L, sizeof(SYSFS_GPIO_RST_VAL_L));
}
f++;
}
f = 0;
while(f <= 250000)
{
for(j = 0; j < 10;j++)
{
write(fd, SYSFS_GPIO_RST_VAL_H, sizeof(SYSFS_GPIO_RST_VAL_H));
}
for(j = 0; j < 10; j++)
{
write(fd, SYSFS_GPIO_RST_VAL_L, sizeof(SYSFS_GPIO_RST_VAL_L));
}
f++;
}
}
close(fd);
printf("INFO: Radio hard reset pin value open error.\n");
return 0;
}
这段代码简单实现了风扇速度的控制,但是有一个弊端,可能长期运行代码的话CPU占用率比较高,我还是建议通过GPIO输出PWM波的形式去控制去,这样会省好多事,也不用实时来拉高和拉低GPIO了,只要通过输入占空比和周期就可以控制了。
后续在补PWM如何控制风扇转速的。
特别提醒:楼主本人犯了一个很低级的错误,由于风扇和你的控制板没有公共的地,造成了直接控制线是无法控制风扇的转速的。我这里使用的是imx6q做CPU来控制风扇的。