吼吼吼!!!土匪出山了,蛋痛做了个35w反激+USB+bost_buck_单片机控制的遥控风扇系统。
1.市电整流及EMI
图纸设计
仿真图1-1
©L1 L2 C1 C2构成EMI电路,消除干扰杂波信号,及降低电路信号对市电的干扰.提高抗干扰能力。 设计功率为45W 较小,因此L选用100uh-10mh左右(根据最大干扰来决定),C选用0.1uf-1uf左右.
如图1-1; 当电路涌出一个600V的尖峰干扰信号,这时 LC将信号阻止,防止勿扰市电。
©加入NTC,开机限浪涌,防止开机瞬间电流过大,对电路的冲击。
©整流管的选取.
功率在45W,按照效率80,输入电流在0.3A以下;选用2A的整流桥.;
© C3的选取
窄电压输入的一般用1U/W,这里采用47U;R1用于C3快速放电(关机时)
2.振荡-反馈-输出
原理:使用UC3845作为pwm芯片,控制MOS, 驱动高频变压器工作.
设计图1-2
此图作为参考;实际使用3845;
RT和RW实际只用一个;作为启动电阻,给C5充电,提供给7脚启动电压;
这里保障启动时间在2S以下,RT设置为100K (RW去掉);
4-8脚频率控制;
由于使用磁芯体积较小,因此这里提高工作频率,弥补功率,设定为180K;
3845频率=1.8/(RTxCT)
因此R6 :1.2K;C:332;
3脚-电流保护端口,高于1V,3845限制输出;电源功率限制在60W,R10设置为0.68R;
加入C9,避免频繁保护,考虑到保护时间问题,这里设置为100P,保证保护及时;
VT1的选取:
市电整流电压在300v左右,功率45-60W,选择耐压高于600v(反激尖峰=电源1-2倍),耐流选择7A(国产标称7A,实际使用在1A以下较为合理);高压MOS,内阻大,发热大;因此必须加散热片;这里选取K4101;
R5 C6的计算;
1脚位补偿端口,2脚为电压比较端口,为了保障输出电压能自动连续可调,将R5设定为100K;C6设定为101;
#include#include //包含头文件 #define uchar unsigned char #define uint unsigned int unsigned char x=15; unsigned char y=1; uchar z=22; uchar m=0; //宏定义 数模控制数 //////////////////// sbit dj=P1^0;//电机控制端接口 sbit DQ=P2^2;//温度传感器接口 //////////按键接口///////////////////////////////// sbit key1=P3^2;//设置温度 sbit key2=P3^3;//温度加 sbit key3=P3^5;//温度减 sbit key4=P3^4;//档位控制 sbit key5=P3^7;//切换数模控制、、, sbit w5=P2^3;////////////////////////////////////////////////////// sbit w1=P2^4; //数码管四个位 sbit w2=P2^5; sbit w3=P2^6; sbit led2=P1^2;//呼吸灯 unsigned char id=0; sbit JD=P1^3;//kongzhi jidianqi 继电器控制 sbit w4=P2^7; //附加显示 //数码管的四个位 /////共阴数码管段选////////////////////////////////////////////// uchar table[26]= {0x3F,0x06,0x5B,0x4F,0x66, 0x6D,0x7D,0x07,0x7F,0x6F, 0x77,0x7C,0x39,0x5E,0x79,0x71, 0x40,0x38,0x76,0x00,0xff,0x37,0x26,0x25,0x27,0x65};//'-',L,H,灭,全亮,n 16-21 uint wen_du; //温度变量 uint shang,xia; //对比温度暂存变量 uchar dang;//档位显示 uchar flag; uchar d1,d2,d3,d4; uchar i;//显示数据暂存变量 void delay(uint ms) //延时函数,大约延时25us { uchar x; for(ms;ms>0;ms--) for(x=10;x>0;x--); } /***********ds18b20延迟子函数(晶振12MHz )*******/ void delay_18B20(uint i) { while(i--); } /**********ds18b20初始化函数**********************/ void Init_DS18B20() { uchar x=0; DQ=1; //DQ复位 delay_18B20(8); //稍做延时 DQ=0; //单片机将DQ拉低 delay_18B20(80); //精确延时 大于 480us DQ=1; //拉高总线 delay_18B20(14); x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay_18B20(20); } /*ds18b20读一个字节*/ uchar ReadOneChar() { uchar i=0; uchar dat=0; for (i=8;i>0;i--) { DQ=0; // 给脉冲信号 dat>>=1; DQ=1; // 给脉冲信号 if(DQ) dat|=0x80; delay_18B20(4); } return(dat); } /*ds18b20写一个字节***/ void WriteOneChar(uchar dat) { uchar i=0; for (i=8;i>0;i--) { DQ=0; DQ=dat&0x01; delay_18B20(5); DQ=1; dat>>=1; } } /**读取ds18b20当前温度**/ void ReadTemperature() { uchar a=0; uchar b=0; uchar t=0; Init_DS18B20(); WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换 delay_18B20(100); // this message is wery important Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 delay_18B20(100); a=ReadOneChar(); //读取温度值低位 b=ReadOneChar(); //读取温度值高位 wen_du=((b*256+a)>>4); //当前采集温度值除16得实际温度值 } void display()//显示温度 { w1=0;P0=table[d1];delay(85); //第1位 P0=0x00;w1=1;delay(1); w2=0;P0=table[x];delay(85);//第2位 P0=0x00;w2=1;delay(1); w3=0;P0=table[d2]; delay(85);//第3位 P0=0x00;w3=1;delay(1); w4=0;P0=table[d3];delay(85);//第4位 P0=0x00;w4=1;delay(1); w5=0;P0=table[d4];delay(85);//第5位 P0=0x00;w5=1;delay(1); } void zi_keyscan()//自动模式按键扫描函数 { /* if(key1==0) //设置键按下 { delay(10); //延时去抖 if(key1==0)flag=1; //再次判断按键,按下的话进入设置状态 while(key1==0);//松手检测 //按键释放 } */ if(key4==0) //设置键按下 { delay(10); //延时去抖 if(key4==0) { id++;x=16; dang=id; } //再次判断按键,按下的话进入设置状态 while(key4==0);//松手检测 //按键释放 } if(key5==0) //设置键按下 设置数模控制。 { delay(10); //延时去抖 if(key5==0) { m++;x=16; dang=x; } //再次判断按键,按下的话进入设置状态 while(key5==0);//松手检测 //按键释放 } if(id==0) { dj=0; z=22; } if(m==1) { JD=1;z=25;x=16; dang=16; } if(m==2) { m=0; JD=0; } if(id==6) { x=16; dang=15; } if (id==7) { id=0;x=15; JD=0; z=22; dj=0; dang=id; } // /* while(flag==1) //进入设置上限状态 { d1=18;d2=shang/10;d3=shang%10;d4=z; //显示字母H 和上限温度值 display(); //调用显示函数 if(key1==0) //判断设置键是否按下 { delay(10); //延时去抖 if(key1==0)flag=2; //按键按下,进入设置下限模式 while(key1==0);//松手检测 } if(key2==0) //加键按下 { delay(10); //延时去抖 if(key2==0) //加键按下 { shang+=5; //上限加5 if(shang>=100)shang=100; //上限最大加到100 }while(key2==0);//松手检测 } if(key3==0) //减键按下 { delay(10); //延时去抖 if(key3==0) //减键按下 { shang-=1; //上限减1 if(shang<=10)shang=10; //上限最小减到10 }while(key3==0);//松手检测 } } */ /* while(flag==2) //设置下限 { d1=17;d2=xia/10;d3=xia%10; //显示字母L 显示下限温度值 display(); //以下注释同上 if(key1==0) { delay(20); if(key1==0)flag=0; while(key1==0);//松手检测 } if(key2==0) { delay(10); if(key2==0) { xia+=5; if(xia>=95)xia=95; }while(key2==0);//松手检测 } if(key3==0) { delay(10); if(key3==0) { xia-=1; if(xia<=0)xia=0; }while(key3==0);//松手检测 } } */ } void zi_dong()//自动温控 模式选择 { uchar i; d1=dang;d2=wen_du/10;d3=wen_du%10;d4=z; //显示档位,显示当前温度值 display(); zi_keyscan(); //按键扫描函数 if((id!=6)&&(wen_du>xia)&&(id!=7))//温度大于下限,小于上限 { dang=id;z=23; //档位置3 for(i=0;i<3;i++) {dj=0;display(); zi_keyscan(); } //PWM通过延时得到 for(i=0;i xia)&&(wen_du>xia))//温度大于下限,小于上限 1挡 { dang=6; z=24; //档位置1 for(i=0;i<3;i++) {dj=0;display(); zi_keyscan(); } //PWM通过延时得到 for(i=0;i<1;i++) {dj=1;display();zi_keyscan(); } } if(wen_du>=shang) //当温度高于下线20度 不启动风扇 当大于20度 小于28度 起中档 当大于28度 开全挡 { dj=1;led2=1; } } //温度自动控制; } void main() //主函数 { uchar j; dj=0;JD=0; //风扇开 shang=30; //初始上线等于30度,大于三十 全7速转。 xia=20; //初始上下限值 for(j=0;j<80;j++) //先读取温度值,防止开机显示85 ReadTemperature(); while(1) //进入while循环 { ReadTemperature(); //读取温度值 for(j=0;j<20;j++) zi_dong(); //自动/手动模式 } }
凑合着看吧 要考试了 闲人要去应付考试-----------