吼吼吼!!!土匪出山了,蛋痛做了個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(); //自動/手動模式 } }
湊合著看吧 要考試了 閑人要去應付考試-----------