吼吼吼!!!土匪出山了,蛋痛做了個(gè)35w反激+USB+bost_buck_單片機(jī)控制的遙控風(fēng)扇系統(tǒng)。
1.市電整流及EMI
圖紙?jiān)O(shè)計(jì)
仿真圖1-1
©L1 L2 C1 C2構(gòu)成EMI電路,消除干擾雜波信號,及降低電路信號對市電的干擾.提高抗干擾能力。 設(shè)計(jì)功率為45W 較小,因此L選用100uh-10mh左右(根據(jù)最大干擾來決定),C選用0.1uf-1uf左右.
如圖1-1; 當(dāng)電路涌出一個(gè)600V的尖峰干擾信號,這時(shí) LC將信號阻止,防止勿擾市電。
©加入NTC,開機(jī)限浪涌,防止開機(jī)瞬間電流過大,對電路的沖擊。
©整流管的選取.
功率在45W,按照效率80,輸入電流在0.3A以下;選用2A的整流橋.;
© C3的選取
窄電壓輸入的一般用1U/W,這里采用47U;R1用于C3快速放電(關(guān)機(jī)時(shí))
2.振蕩-反饋-輸出
原理:使用UC3845作為pwm芯片,控制MOS, 驅(qū)動高頻變壓器工作.
設(shè)計(jì)圖1-2
此圖作為參考;實(shí)際使用3845;
RT和RW實(shí)際只用一個(gè);作為啟動電阻,給C5充電,提供給7腳啟動電壓;
這里保障啟動時(shí)間在2S以下,RT設(shè)置為100K (RW去掉);
4-8腳頻率控制;
由于使用磁芯體積較小,因此這里提高工作頻率,彌補(bǔ)功率,設(shè)定為180K;
3845頻率=1.8/(RTxCT)
因此R6 :1.2K;C:332;
3腳-電流保護(hù)端口,高于1V,3845限制輸出;電源功率限制在60W,R10設(shè)置為0.68R;
加入C9,避免頻繁保護(hù),考慮到保護(hù)時(shí)間問題,這里設(shè)置為100P,保證保護(hù)及時(shí);
VT1的選取:
市電整流電壓在300v左右,功率45-60W,選擇耐壓高于600v(反激尖峰=電源1-2倍),耐流選擇7A(國產(chǎn)標(biāo)稱7A,實(shí)際使用在1A以下較為合理);高壓MOS,內(nèi)阻大,發(fā)熱大;因此必須加散熱片;這里選取K4101;
R5 C6的計(jì)算;
1腳位補(bǔ)償端口,2腳為電壓比較端口,為了保障輸出電壓能自動連續(xù)可調(diào),將R5設(shè)定為100K;C6設(shè)定為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; //宏定義 數(shù)模控制數(shù) //////////////////// sbit dj=P1^0;//電機(jī)控制端接口 sbit DQ=P2^2;//溫度傳感器接口 //////////按鍵接口///////////////////////////////// sbit key1=P3^2;//設(shè)置溫度 sbit key2=P3^3;//溫度加 sbit key3=P3^5;//溫度減 sbit key4=P3^4;//檔位控制 sbit key5=P3^7;//切換數(shù)模控制、、, sbit w5=P2^3;////////////////////////////////////////////////////// sbit w1=P2^4; //數(shù)碼管四個(gè)位 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; //附加顯示 //數(shù)碼管的四個(gè)位 /////共陰數(shù)碼管段選////////////////////////////////////////////// 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;//顯示數(shù)據(jù)暫存變量 void delay(uint ms) //延時(shí)函數(shù),大約延時(shí)25us { uchar x; for(ms;ms>0;ms--) for(x=10;x>0;x--); } /***********ds18b20延遲子函數(shù)(晶振12MHz )*******/ void delay_18B20(uint i) { while(i--); } /**********ds18b20初始化函數(shù)**********************/ void Init_DS18B20() { uchar x=0; DQ=1; //DQ復(fù)位 delay_18B20(8); //稍做延時(shí) DQ=0; //單片機(jī)將DQ拉低 delay_18B20(80); //精確延時(shí) 大于 480us DQ=1; //拉高總線 delay_18B20(14); x=DQ; //稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗 delay_18B20(20); } /*ds18b20讀一個(gè)字節(jié)*/ 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寫一個(gè)字節(jié)***/ 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當(dāng)前溫度**/ void ReadTemperature() { uchar a=0; uchar b=0; uchar t=0; Init_DS18B20(); WriteOneChar(0xCC); // 跳過讀序號列號的操作 WriteOneChar(0x44); // 啟動溫度轉(zhuǎn)換 delay_18B20(100); // this message is wery important Init_DS18B20(); WriteOneChar(0xCC); //跳過讀序號列號的操作 WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度 delay_18B20(100); a=ReadOneChar(); //讀取溫度值低位 b=ReadOneChar(); //讀取溫度值高位 wen_du=((b*256+a)>>4); //當(dāng)前采集溫度值除16得實(shí)際溫度值 } 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()//自動模式按鍵掃描函數(shù) { /* if(key1==0) //設(shè)置鍵按下 { delay(10); //延時(shí)去抖 if(key1==0)flag=1; //再次判斷按鍵,按下的話進(jìn)入設(shè)置狀態(tài) while(key1==0);//松手檢測 //按鍵釋放 } */ if(key4==0) //設(shè)置鍵按下 { delay(10); //延時(shí)去抖 if(key4==0) { id++;x=16; dang=id; } //再次判斷按鍵,按下的話進(jìn)入設(shè)置狀態(tài) while(key4==0);//松手檢測 //按鍵釋放 } if(key5==0) //設(shè)置鍵按下 設(shè)置數(shù)模控制。 { delay(10); //延時(shí)去抖 if(key5==0) { m++;x=16; dang=x; } //再次判斷按鍵,按下的話進(jìn)入設(shè)置狀態(tài) 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) //進(jìn)入設(shè)置上限狀態(tài) { d1=18;d2=shang/10;d3=shang%10;d4=z; //顯示字母H 和上限溫度值 display(); //調(diào)用顯示函數(shù) if(key1==0) //判斷設(shè)置鍵是否按下 { delay(10); //延時(shí)去抖 if(key1==0)flag=2; //按鍵按下,進(jìn)入設(shè)置下限模式 while(key1==0);//松手檢測 } if(key2==0) //加鍵按下 { delay(10); //延時(shí)去抖 if(key2==0) //加鍵按下 { shang+=5; //上限加5 if(shang>=100)shang=100; //上限最大加到100 }while(key2==0);//松手檢測 } if(key3==0) //減鍵按下 { delay(10); //延時(shí)去抖 if(key3==0) //減鍵按下 { shang-=1; //上限減1 if(shang<=10)shang=10; //上限最小減到10 }while(key3==0);//松手檢測 } } */ /* while(flag==2) //設(shè)置下限 { 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; //顯示檔位,顯示當(dāng)前溫度值 display(); zi_keyscan(); //按鍵掃描函數(shù) 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通過延時(shí)得到 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通過延時(shí)得到 for(i=0;i<1;i++) {dj=1;display();zi_keyscan(); } } if(wen_du>=shang) //當(dāng)溫度高于下線20度 不啟動風(fēng)扇 當(dāng)大于20度 小于28度 起中檔 當(dāng)大于28度 開全擋 { dj=1;led2=1; } } //溫度自動控制; } void main() //主函數(shù) { uchar j; dj=0;JD=0; //風(fēng)扇開 shang=30; //初始上線等于30度,大于三十 全7速轉(zhuǎn)。 xia=20; //初始上下限值 for(j=0;j<80;j++) //先讀取溫度值,防止開機(jī)顯示85 ReadTemperature(); while(1) //進(jìn)入while循環(huán) { ReadTemperature(); //讀取溫度值 for(j=0;j<20;j++) zi_dong(); //自動/手動模式 } }
湊合著看吧 要考試了 閑人要去應(yīng)付考試-----------