
便携涵道小风扇,4档位,12V供电,支持 PD诱骗 +DC直插
简介
便携涵道小风扇,4档位,12V供电,支持 PD诱骗 +DC直插
简介:便携涵道小风扇,4档位,12V供电,支持 PD诱骗 +DC直插开源协议
:GPL 3.0
(未经作者授权,禁止转载)描述
风扇使用的是:GFC0412DS,40*40的尺寸,淘宝价格 如下:我的是设备上拆下来的
使用了8脚STC8G1K08A-36I-SOP8 单片机进行控制 ,
按键逻辑
0档位:停转(初始档位)
1档位,慢速
2档位 中速
3档位 高速
4档位 最快
指示灯
LED指示灯 单片机上电后,亮1秒就灭
然后 LED灯随着 挡位提升,闪烁速度也提升,直至最高挡位一直亮
固件见附件
打板的话 选择 78M05的版本,
板子背面 开了阻焊层,可以堆锡增大电流
源码 参考:
#include
// 定义端口
#define FAN_POWER_PIN P32
#define LED_PIN P33
#define PWM_PIN P54
#define SWITCH_PIN P55
// 定义PWM频率
#define PWM_FREQUENCY 25000
// 档位定义
#define GEAR_0 0
#define GEAR_1 1
#define GEAR_2 2
#define GEAR_3 3
#define GEAR_4 4
// 定义档位对应的占空比
unsigned char duty_cycle[] = {0, 51, 102, 153, 255}; // 对应0%, 20%, 40%, 60%, 100%
unsigned char current_gear = GEAR_0; // 初始档位为0
void delay_ms(unsigned int ms);
void init_ports(void);
void init_pwm(void);
void set_pwm_duty(unsigned char duty);
void switch_gear(void);
void main(void) {
init_ports();
init_pwm();
FAN_POWER_PIN = 0; // 初始关闭风扇电源
// 上电后LED闪烁1秒
LED_PIN = 1;
delay_ms(500);
LED_PIN = 0;
delay_ms(500);
LED_PIN = 1;
delay_ms(500);
LED_PIN = 0;
while(1) {
if (SWITCH_PIN == 0) { // 检测微动开关按下
delay_ms(20); // 消抖
if (SWITCH_PIN == 0) {
switch_gear();
while (SWITCH_PIN == 0); // 等待按键释放
}
}
if (current_gear == GEAR_0) {
FAN_POWER_PIN = 0;
LED_PIN = 0;
} else {
FAN_POWER_PIN = 1;
set_pwm_duty(duty_cycle[current_gear]);
if (current_gear == GEAR_4) {
LED_PIN = 1; // 最高档位时LED常亮
} else {
LED_PIN = !LED_PIN; // 其他档位LED闪烁
delay_ms(1000 / current_gear); // 档位越高闪烁越快
}
}
}
}
void delay_ms(unsigned int ms) {
unsigned int i, j;
for (i = ms; i > 0; i--) {
for (j = 112; j > 0; j--);
}
}
void init_ports(void) {
P3M1 = 0x00;
P3M0 = 0xFF;
P5M1 = 0x00;
P5M0 = 0x30;
}
void init_pwm(void) {
// 配置PWM模块,设置频率为25kHz
// 假设系统时钟为24MHz
PCA_PWM0 = 0x00; // 清除PCA寄存器
PCA_PWM1 = 0x00; // 清除PCA寄存器
CMOD = 0x02; // 设置PCA计数器工作时钟源为系统时钟/2
CL = 0; // 清除计数器
CH = 0; // 清除计数器
CCAP0L = 0x00; // 设置初始占空比为0%
CCAP0H = 0x00; // 设置初始占空比为0%
CCAPM0 = 0x42; // PCA模块0的工作模式设置为PWM模式
CR = 1; // 启动PCA计数器
}
void set_pwm_duty(unsigned char duty) {
CCAP0L = duty; // 设置占空比低字节
CCAP0H = duty; // 设置占空比高字节
}
void switch_gear(void) {
current_gear++;
if (current_gear > GEAR_4) {
current_gear = GEAR_0;
}
}
红、橙 是正极,
黑、灰 是负极,
黄、绿 是调速线
设计图

BOM


评论