最近DIY了一个风扇调速器给功放机箱散热用,支持接入4个风扇,功能较简单,目前有两种工作模式。
自动控制模式:当温度高于30度,风扇开始旋转,而且随着温度升高,转速越来越快。
手动控制模式:通过EC11机械编码器去调节PWM占空比,最大99%
制作出来的实物图如下:
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
STM32单片机源程序如下:
- #include "stm32f0xx.h"
- #include "time.h"
- #include "led.h"
- #include "TM1640.h"
- #include "ds18b20.h"
- #include "delay.h"
- #include "encoder.h"
- __IO uint16_t temp1;
- __IO uint16_t temp2;
- int ten,one,zero;
- float temp;
- u16 i,pwm;
- u8 a=0,b=0,mode;
- void manual_mode();
- void auto_mode();
- int main(void)
- {
- TIM_Config();
- TIM_PWM_Config();
- TIM3_Config(); //定时器3初始化
- delay_init(); //延时函数初始化
- led_init(); //LED初始化
- TM1640_Init(); //TM1640初始化
- ENCODER_Init(); //旋转编码器初始化
- while(1)
- {
- auto_mode();
- }
- }
- void auto_mode()
- {
- mode=1;
- TM1640_display(0,20); //清屏
- TM1640_display(1,20);
- TM1640_display(2,20);
- TM1640_display(3,20);
- while(1)
- {
-
- temp=TemperatuerResult();
- zero=(int)(temp*10)%10;
- ten=(int)temp/10;
- one=(int)temp%10;
- b=ENCODER_READ(); //读出旋转编码器值
- if(b==3)manual_mode(); //切换为手动模式
- if(temp2>300 && temp2<500)
- {
- TM1640_display(0,23);
- TM1640_display(1,24);
- TM1640_display(2,25);
- TM1640_display(3,26);
-
- }
- if(temp2>600)
- {
- temp2=0;
- TM1640_display(0,ten);
- TM1640_display(1,one+10);
- TM1640_display(2,zero);
- TM1640_display(3,21);
- }
- switch(ten)
- {
- case 0:
- TIM_SetCompare2(TIM2, 0); //占空比设置
- break;
-
- case 1:
- TIM_SetCompare2(TIM2, 0); //占空比设置
- break;
-
- case 2:
- TIM_SetCompare2(TIM2, 0); //占空比设置
- break;
-
- case 3:
- TIM_SetCompare2(TIM2, 480*30); //占空比设置
- break;
-
- case 4:
- TIM_SetCompare2(TIM2, 480*40); //占空比设置
- break;
-
- case 5:
- TIM_SetCompare2(TIM2, 480*60); //占空比设置
- break;
-
- case 6:
- TIM_SetCompare2(TIM2, 480*80); //占空比设置
- break;
-
- case 7:
- TIM_SetCompare2(TIM2, 480*100); //占空比设置
- break;
-
- default:
- TIM_SetCompare2(TIM2, 480*100); //占空比设置
- break;
- }
-
- }
- }
- void manual_mode()
- {
- mode=2;
- TM1640_display(0,27); //清屏
- TM1640_display(1,27);
- TM1640_display(2,27);
- TM1640_display(3,27);
- TIM_SetCompare2(TIM2, 0); //占空比设置
- while (1)
- {
- b=ENCODER_READ(); //读出旋转编码器值
- if(b==1){a++;if(a>100)a=0;} //分析按键值,并加减计数器值。
- if(b==2){if(a==0)a=101;a--;}
- if(b==3)auto_mode(); //切换为自动模式
- if(b!=0) //如果有旋转器的操作
- {
- if(a/100==0)
- TM1640_display(0,20);
- else
- TM1640_display(0,a/100);
- TM1640_display(1,a%100/10); //显示数值
- TM1640_display(2,a%10);
- TM1640_display(3,22);
- TIM_SetCompare2(TIM2, a*480); //占空比设置
- }
- }
- }
复制代码
所有资料51hei提供下载:
调试器2程序.7z
(147.49 KB, 下载次数: 233)
原理图 PCB.rar
(11.03 MB, 下载次数: 206)
|