版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> XX大 學(xué)</b></p><p> 模擬電路課程設(shè)計報告</p><p> 課題名稱:基于STC12系列單片機的串聯(lián)型開關(guān)電源設(shè)計與實現(xiàn)</p><p> 學(xué) 院 計算機與電子信息學(xué)院</p><p> 專 業(yè) </p><
2、p> 班 級 </p><p> 學(xué) 號 </p><p> 姓 名 </p><p> 摘要:本模擬電路課程設(shè)計要求制作開關(guān)電源的模擬電路部分,在掌握原理的基礎(chǔ)上將其與單片機相結(jié)合,完成開關(guān)電源的設(shè)計。本報告旨在詳述開關(guān)電源的原理分析、計算、仿真波形、相關(guān)控制方法以及程
3、序展示。</p><p><b> 開關(guān)電源原理分析</b></p><p> 本課程設(shè)計采用單片機控制與模擬電路相結(jié)合的方法來實現(xiàn)開關(guān)電源。單片機所采用的芯片為STC12C5A60S2,該芯片在擁有8051內(nèi)核的基礎(chǔ)上加入了10為AD和PWM發(fā)生器。通過程序,即可控制單片機產(chǎn)生一定占空比的PWM脈沖,將此脈沖輸入到模擬電路部分,在模擬電路的輸出端即可產(chǎn)生一定的輸
4、出電壓,可比較容易的通過程序來實現(xiàn)對輸出電壓的控制。但上述的開環(huán)控制是無法達到精確的調(diào)節(jié)電壓,因此需要采用閉環(huán)控制來精確調(diào)制。即,對輸出電壓進行AD采樣,將其輸入回單片機中進行數(shù)據(jù)處理。單片機根據(jù)處理的結(jié)果來對輸出電壓做出修正,經(jīng)過這樣的逐步調(diào)節(jié)即可達到閉環(huán)的精密輸出。由此原理,可以將整個過程分成一下模塊:MCU控制模塊,PWM波形輸出模塊,模擬電路模塊,AD轉(zhuǎn)換模塊,數(shù)碼管顯示模塊,鍵盤輸入模塊。原理圖如下:</p>&
5、lt;p><b> 二、本設(shè)計的特色</b></p><p> 經(jīng)過幾次完善,本課程設(shè)計的程序改掉了之前的獨立按鍵而換用了矩陣鍵盤,同時,矩陣鍵盤與數(shù)據(jù)的對應(yīng)形式與手機鍵盤相同,操作方便。對于顯示函數(shù)進行了一定的修改,廢棄了應(yīng)用Delay函數(shù)的原始辦法,改用中斷進行顯示,這樣的效果更佳。同時,對于閉環(huán)控制也進行了一定的更改,由原來的簡單的對占空比進行操作變成了在一定時刻后對占空比進
6、行10000次疊加取均值,這樣使顯示更加的穩(wěn)定準(zhǔn)確。將每次輸入數(shù)據(jù)都要復(fù)位的缺點進行看修改,只需先按獨立按鍵就可進入重復(fù)鍵入數(shù)據(jù)的模式,使得程序更加實用。同時程序中也加入了對輸入數(shù)據(jù)進行修改和按鍵音的功能,使得整個設(shè)計更加人性化。</p><p> 三、模擬電路原理說明</p><p><b> 模擬電路圖如下:</b></p><p>
7、 該模擬電路的控制部分原理為,通過MCU輸出的PWM脈沖來不斷的使三極管導(dǎo)通和截止,這樣就達到了一個類似開關(guān)的功能,使得三極管的射極與VCC導(dǎo)通和截止。而射極的電壓經(jīng)過后續(xù)電路后,其輸出端就會輸出一定的電壓值。也就是說通過調(diào)整PWM脈沖即可該電路的輸出電壓。</p><p><b> 四、相關(guān)控制說明</b></p><p> 本系統(tǒng)通過STC12C5A60S2單
8、片機對其進行控制,具體控制流程為:首先,程序先對定時器進行初始化,通過定時器中斷來對數(shù)據(jù)進行顯示,之后通過鍵盤輸入程序?qū)?shù)據(jù)進行輸入,并將其輸入的數(shù)據(jù)保存在數(shù)組中。在這個過程中可以對輸入的數(shù)據(jù)進行更改。之后對單片機進行AD、PWM初始化。使其處于工作狀態(tài)。在初始化時,應(yīng)該將PWM的占空比設(shè)定為最小,即CCAP0H、CCAP0L=0XFE。之后,AD采樣回電壓并將其儲存在數(shù)組中同時轉(zhuǎn)化成能夠與鍵盤輸入值進行比較的形式。將該值與鍵盤輸入值進
9、行比較,通過比較結(jié)果來對CCAP0H,CCAP0L進行調(diào)整,考慮到如果閉環(huán)控制如果是在不斷的調(diào)整占空比,那么隨之接收到并且顯示的電壓必定在不斷跳動,因此,可以采用將不斷調(diào)整的占空比進行疊加取出均值然后賦給CCAP0H,CCAP0L的方法,直至調(diào)整為與鍵盤輸入的數(shù)值達到最優(yōu)為止,這樣即完成了閉環(huán)精確調(diào)制電壓的過程。</p><p> 在編程中,需要注意的問題有:1、在AD采樣時,不一定會達到很高精度,這時需要實測
10、數(shù)據(jù),根據(jù)數(shù)據(jù)對程序進行修正。2、關(guān)于閉環(huán)控制,起初,程序中將鍵盤輸入與占空比設(shè)置聯(lián)系到了一起。這是十分不明智的。應(yīng)將鍵盤輸入數(shù)據(jù)與占空比的設(shè)置分開,鍵盤輸入的數(shù)據(jù)僅僅作為一個標(biāo)準(zhǔn)用于比較。</p><p> 五、設(shè)計中存在的不足</p><p> 在設(shè)計過程中,雖說程序可以正確運行,但是程序中語句的運用確實存在不合理之處。例如本應(yīng)是if……else的語句卻用了兩個if,這樣看似可以正
11、常運行,但是效率卻不如if……else。這些細微之處都應(yīng)該加以注意。</p><p> 六、本次課程設(shè)計的體會</p><p> 本次課程設(shè)計的最大體會就是:對待程序,要多注意關(guān)注它的細節(jié),不要以程序可以正確運行為目的,而應(yīng)當(dāng)盡可能的提高程序的效率,盡可能的增強程序的可讀性,盡可能的達到人性化的設(shè)計。增加一些諸如可刪除,按鍵音,可重復(fù)輸入數(shù)據(jù),狀態(tài)指示燈等小功能。這些看似容易的小功能實
12、際是設(shè)計者的設(shè)計思想理念的體現(xiàn),這也正是我們應(yīng)該培養(yǎng)的。</p><p> #include <reg52.h></p><p> #include <intrins.h></p><p> #include <PWM.h></p><p> #include <AD.h></p&
13、gt;<p> #define uint unsigned int </p><p> #define uchar unsigned char</p><p> #define ADC_POWER 0x80 </p><p> #define ADC_FLAG 0x10</p><p> #define ADC_ST
14、ART0x08</p><p> #define ADC_SPEEDLL 0x00</p><p> uchar number[6];</p><p> uchar code Bit_Table[6]={0xbf,0xdf,0xef,0xfb,0xfd,0xfe};</p><p> uchar code Table[]={0x3
15、f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};</p><p> uchar key_flag,keyValue,num_key,temp_circle=0xfe,flag4,flag6,flag7,temp,keyValueTemp,z,ratio1=0xfd,KeyDelay,test1,sure=
16、1,b,flag9,try=1,h,k,m,n;</p><p> uint i,flag8,j;</p><p> long int keyinto,reci,avg;</p><p> float a=19.53125;</p><p> sbit keyrein=P3^2;</p><p> sbit
17、finish=P3^7;</p><p> sbit trylight=P3^1;</p><p> sbit speak=P3^3;</p><p> sbit change=P3^0;</p><p> void Inittimer();</p><p> void Keyin();</p>
18、<p> void InitADC();</p><p> void InitPWM();</p><p> void ADCrecieve();</p><p> void delay(uint z);</p><p> void main()</p><p><b> { <
19、;/b></p><p> Inittimer();</p><p> while(sure)</p><p><b> {</b></p><p><b> Keyin();</b></p><p><b> }</b></p&g
20、t;<p> InitPWM();</p><p> InitADC();</p><p><b> while(1)</b></p><p><b> {</b></p><p> ADCrecieve(); </p><p> if((keyin
21、to>reci)&&(k==0))</p><p><b> {</b></p><p><b> m=0;</b></p><p><b> ratio1--;</b></p><p> if(ratio1==0x01)k=1;</p>
22、;<p><b> flag8++;</b></p><p> CCAP0H=CCAP0L=ratio1;</p><p><b> } </b></p><p> if((keyinto<reci)&&(m==0))</p><p><b>
23、 {</b></p><p><b> k=0;</b></p><p> ratio1++; </p><p> if(ratio1==0xfe)m=1;</p><p><b> flag8++;</b></p><p> CCAP0H=CCAP
24、0L=ratio1;</p><p><b> }</b></p><p> if(flag8>10000)</p><p><b> {</b></p><p> avg+=ratio1;</p><p><b> j++;</b>&
25、lt;/p><p> if(j==10001)</p><p><b> {</b></p><p> ratio1=avg/10000;</p><p> CCAP0H=CCAP0L=ratio1;</p><p> while(keyrein)</p><p>&
26、lt;b> {</b></p><p> ADCrecieve(); </p><p><b> finish=0;</b></p><p><b> } </b></p><p><b> } </b></p><p&g
27、t;<b> }</b></p><p> if(keyrein==0)</p><p><b> {</b></p><p><b> delay(5);</b></p><p> if(keyrein==0)</p><p><b&g
28、t; {</b></p><p><b> sure=1;</b></p><p> for(n=0;n<6;n++)</p><p> number[n]=0;</p><p> ratio1=0xfd;</p><p> CCAP0H=CCAP0L=ratio1;
29、</p><p><b> reci=0;</b></p><p><b> flag8=0;</b></p><p><b> k=m=0;</b></p><p><b> finish=1;</b></p><p>&
30、lt;b> avg=0;</b></p><p><b> j=0;</b></p><p> while(sure)</p><p><b> {</b></p><p><b> Keyin();</b></p><p>
31、<b> }</b></p><p><b> }</b></p><p> while(!keyrein);</p><p><b> delay(5);</b></p><p> while(!keyrein);</p><p><b
32、> } </b></p><p><b> } </b></p><p><b> }</b></p><p> void T0_interrupt(void) interrupt 1</p><p><b> {</b></p>
33、<p> TH0 = 0xfc;</p><p> TL0 = 0x66;</p><p><b> if(sure)</b></p><p><b> {</b></p><p> P2=temp_circle; </p><p><
34、b> temp=P2;</b></p><p> if(temp!=temp_circle)</p><p><b> { </b></p><p> if(KeyDelay) </p><p><b> {</b></p><p> KeyDe
35、lay++;</p><p> if( KeyDelay>50)</p><p> { </p><p> if(temp==keyValueTemp)
36、 </p><p><b> { </b></p><p> key_flag=1; </p><p> keyValue=temp;</p><p> KeyDelay=0; </p><p><b> }</b></p&
37、gt;<p><b> else</b></p><p><b> {</b></p><p> KeyDelay=1;</p><p> keyValueTemp=temp;</p><p><b> }</b></p><p>
38、;<b> }</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> keyValueTemp=temp;</p><p> K
39、eyDelay=1;</p><p><b> } </b></p><p><b> }</b></p><p><b> else</b></p><p><b> { </b></p><p> key_flag
40、=0;</p><p><b> } </b></p><p><b> }</b></p><p> if((z==0)||(z==3))</p><p> P0=Table[number[z]]+0x80;</p><p><b> else</
41、b></p><p> P0=Table[number[z]];</p><p> P1=Bit_Table[z];</p><p><b> z++;</b></p><p> if(z==6) z=0;</p><p><b> }</b></p&g
42、t;<p> void Inittimer()</p><p><b> {</b></p><p><b> EA=1;</b></p><p><b> ET0=1;</b></p><p> TH0 = 0xfc;</p><p
43、> TL0 = 0x66;</p><p> TMOD = 0x01;</p><p><b> TR0 =1;</b></p><p><b> }</b></p><p> void Keyin()</p><p><b> {</b&
44、gt;</p><p> if(key_flag==1)</p><p><b> { </b></p><p><b> speak=0;</b></p><p> for(i=0;i<15000;i++);</p><p> key_flag=0; &l
45、t;/p><p> switch(keyValue)</p><p><b> { </b></p><p> case 0x7B: num_key=1; change=1;break; </p><p> case 0x7D: num_key=2; change=1;break; </p&g
46、t;<p> case 0x7E: num_key=3; change=1;break; </p><p> case 0xBB: num_key=4; change=1;break; </p><p> case 0xBD: num_key=5; change=1;break; </p>&l
47、t;p> case 0xBE: num_key=6; change=1;break; </p><p> case 0xDB: num_key=7; change=1;break; </p><p> case 0xDD: num_key=8; change=1;break; </p><p&g
48、t; case 0xDE: num_key=9; change=1;break; </p><p> case 0xED: num_key=0; change=1;break; </p><p> case 0xEB: flag9=1;flag6--;change=0;break; </p><p><b> }
49、 </b></p><p> number[flag6]=num_key;</p><p><b> flag6++;</b></p><p> if(flag6==3)</p><p><b> {</b></p><p> keyinto=numb
50、er[0]*1000+number[1]*100+number[2]*10;</p><p><b> flag6=0;</b></p><p><b> sure=0;</b></p><p><b> }</b></p><p><b> if(flag9
51、)</b></p><p><b> {</b></p><p><b> flag6--;</b></p><p><b> flag9=0;</b></p><p><b> }</b></p><p>&l
52、t;b> } </b></p><p><b> else</b></p><p><b> { </b></p><p> temp_circle=_crol_(temp_circle,1);</p><p> if(temp_circle==0xEF)<
53、/p><p><b> { </b></p><p> temp_circle=0xFE; </p><p><b> }</b></p><p><b> }</b></p><p><b> speak=1;</b><
54、;/p><p><b> i=0;</b></p><p><b> }</b></p><p> void InitADC()</p><p><b> {</b></p><p> P1ASF=0x80; </p>
55、<p> ADC_RES=0;</p><p><b> }</b></p><p> void InitPWM()</p><p><b> {</b></p><p> CCON=0; </p><p><b> CL=0;&
56、lt;/b></p><p><b> CH=0;</b></p><p> CMOD=0x02;</p><p> CCAPM0=0x42;</p><p> CCAP0H=CCAP0L=ratio1;</p><p><b> CR=1;</b></
57、p><p><b> }</b></p><p> void ADCrecieve()</p><p><b> {</b></p><p> ADC_CONTR=0x8f;</p><p><b> _nop_();</b></p>
58、<p><b> _nop_();</b></p><p><b> _nop_();</b></p><p><b> _nop_();</b></p><p> while(!(ADC_CONTR&ADC_FLAG));</p><p> AD
59、C_CONTR&= ~ADC_FLAG;</p><p> b=ADC_RES;</p><p><b> reci=b*a;</b></p><p> number[3]=reci/1000;</p><p> number[4]=reci%1000/100;</p><p>
60、 number[5]=reci%1000%100/10;</p><p><b> } </b></p><p> void delay(uint z)</p><p><b> {</b></p><p><b> uint x,y;</b></p>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于89c51單片機的開關(guān)電源設(shè)計
- 89c51單片機課程設(shè)計
- 基于89c51單片機的秒表課程設(shè)計
- 基于89c51電子密碼鎖設(shè)計課程設(shè)計
- 基于89c51單片機的秒表課程設(shè)計
- 基于89c51的轉(zhuǎn)速測量系統(tǒng)設(shè)計c程序
- 基于89c51的自身斷電保護系統(tǒng)設(shè)計課程設(shè)計
- 基于89c51單片機的秒表課程設(shè)計 2
- 基于89c51單片機的秒表課程設(shè)計 (2)
- 開關(guān)電源課程設(shè)計--開關(guān)電源電路設(shè)計
- 開關(guān)電源課程設(shè)計
- 基于89c51單片機交通燈課程設(shè)計
- 基于89c51單片機電子時鐘課程設(shè)計
- 開關(guān)電源課程設(shè)計
- 開關(guān)電源課程設(shè)計
- 單片機課程設(shè)計---基于89c51的電纜定長控制設(shè)計
- 基于89c51電子密碼鎖設(shè)計程序
- 基于89c51電子密碼鎖設(shè)計報告
- 89c51單片機課程設(shè)計之秒表設(shè)計實驗報告
- 基于89c51的智能時鐘設(shè)計
評論
0/150
提交評論