qmx1998:
程序1:SPWM程序//===MCU~STC15F2K60S2//===利用兩個(gè)PCA模塊產(chǎn)生兩路互補(bǔ)單極性SPWM波//===第一路/ccp0_3/P2.5,第二路/ccp1_3/P2.6//===全橋使能信號(hào)端EN_H1/P2^1,EN_H2=P2^2//******************************************************************************************//===系統(tǒng)時(shí)鐘為11.0592Mhz@1T21/3022/30//===基波頻率為50hz的情況下,把一個(gè)正弦波分成108份,即正弦波表中有54個(gè)數(shù)值//===@50hz,PCA時(shí)鐘源為系統(tǒng)時(shí)鐘2分頻,即載波頻率為:Fc=11059200/2/256=21.6khz//===@50hz,定時(shí)器溢出頻率為:Ft=50*108=5.4Khz,此時(shí)Fc=4*Ft(Fc必須是Ft的整數(shù)倍)//===基波頻率為400hz的情況下,把一個(gè)正弦波分成54份,即正弦波表中有27個(gè)數(shù)值//===@400HZ,PCA時(shí)鐘源為系統(tǒng)時(shí)鐘不分頻,即載波頻率為:Fc=11059200/256=43.2khz//===@400HZ,定時(shí)器溢出頻率為:Ft=400*54=21.6khz,此時(shí)Fc=2*Ft//******************************************************************************************//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//=========試驗(yàn)日志=========//*****1.2016.6.2***********//程序可以跑通,驅(qū)動(dòng)芯片工作,全橋工作,有輸出//輸出低通濾波器L=3.3mh,C=1uf,截止頻率=2778hz//50hz頻率下正弦波波形正常,400hz頻率下波形畸變//修改方案:由于低通濾波器的截止頻率確定與載波頻率有關(guān),所以為了在400hz和50hz兩種頻率下方便計(jì)算,決定統(tǒng)一//兩種頻率下的載波頻率,即PCA模塊頻率,即://===@400HZ,PCA時(shí)鐘源為系統(tǒng)時(shí)鐘同樣2分頻,即載波頻率為:Fc=11059200/2/256=21.6khz//*****2.2016.6.30***********//增加外置按鍵做到400hz和50hz的一鍵切換//主程序中增加按鍵檢測(cè)程序,程序中進(jìn)行定時(shí)器初值的賦給//===@50hz,定時(shí)器初值TH0_h=0xf7TH0_l=0xff//===@400HZ,定時(shí)器初值TH0_h=0xfeTH0_l=0x1d//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~/********包含頭文件*********/#include#include/**********宏定義*********/#defineuiunsignedint#defineucunsignedchar#defineMAIN_FOSC11059200UL//定義主時(shí)鐘頻率11.0592Mhz/*********全局變量**********/ucpwm_value;ucpionter;//查表索引指針bitflag_zf;//正弦波前后半周標(biāo)志位ucTH0_h,TH0_l;//定時(shí)器初值uchalf_value;//半周轉(zhuǎn)換值/**********硬件接口定義定義************/sbitSPWM_out1=P2^5;sbitSPWM_out2=P2^6;sbitEN_H1=P2^1;sbitEN_H2=P2^2;23/30sbitkey_400hz=P2^3;sbitkey_50hz=P2^4;/**********正弦波表,包括400hz和50hz***********/uccodeSPWM_50hz[54]={255,240,226,211,196,182,168,154,141,128,115,103,91,80,69,59,50,42,34,27,20,15,10,6,3,1,0,0,1,3,6,10,15,20,27,34,42,50,59,69,80,91,103,115,128,141,154,168,182,196,211,226,240,255};//50hz正弦波表uccodeSPWM_400hz[27]={255,226,196,168,141,115,91,69,50,34,20,10,3,0,3,10,20,34,50,69,91,115,141,168,196,226,255};//400hz正弦波表/********ms延時(shí)********/voiddelay_ms(uiz){ucx,y;do{for(x=12;x>0;x--)for(y=169;y>0;y--);}while(--z);}/*******PCA模塊初始化*******/voidPCA_init(){P_SW1=0X20;//端口切換CCON=0X00;//清零中斷標(biāo)志位CL=0;CH=0;//清零PCA計(jì)數(shù)器CMOD=0X02;//@50Hz,PCA時(shí)鐘源:sysclk二分頻,修改后400hz、50hz通用/*CMOD=0x08;//@400Hz,PCA時(shí)鐘源:sysclk不分頻,禁止PCA計(jì)數(shù)器溢出中斷*/CCAPM0=0X42;//PCA模塊0工作于pwm輸出模式,允許比較器功能,無中斷CCAPM1=0X42;//PCA模塊1工作于pwm輸出模式,允許比較器功能,無中斷PCA_PWM0=0X00;//PCA模塊0工作于8位pwm模式PCA_PWM1=0X00;//PCA模塊1工作于8位pwm模式/*CCAP0H=SPWM_50hz[0];CCAP0L=SPWM_50hz[0];CCAP0H=SPWM_50hz[0];CCAP0L=SPWM_50hz[0];*/CCAP0H=SPWM_400hz[0];//用哪個(gè)都行,初始值都一樣CCAP0L=SPWM_400hz[0];CCAP0H=SPWM_400hz[0];CCAP0L=SPWM_400hz[0];//初始化PWM的輸出占空比*/CR=1;//啟動(dòng)PCA計(jì)數(shù)器}24/30/*******定時(shí)器0初始化********/voidTIMER0_init(void){600/54=400hzET0=1;//開啟定時(shí)器0中斷TR0=1;//啟動(dòng)定時(shí)器0}/****定時(shí)器0中斷服務(wù)程序*****/voidTIMER0_ISR(void)interrupt1{/*TH0=0xf7;TL0=0xff;*/TH0=TH0_h;TL0=TH0_l;//重裝定時(shí)器初值pionter++;//正弦波表索引指針加一if(pionter==half_value)//正弦波表值使用完后進(jìn)行前后半波轉(zhuǎn)換{CR=0;//暫停PCA計(jì)數(shù)器pionter=0;//索引指針清零flag_zf=~flag_zf;//半周標(biāo)志位取反if(flag_zf)//設(shè)置后半周{SPWM_out1=0;//模塊0的pwm輸出置0CCAPM0=0X00;//關(guān)閉pca模塊0CCAPM1=0X42;//開啟pca模塊1}else//設(shè)置前半周{SPWM_out2=0;//模塊1的輸出置0CCAPM0=0X42;//打開pca模塊0CCAPM1=0X00;//關(guān)閉pca模塊1}CR=1;//再次開啟PCA計(jì)數(shù)器}if(flag_zf==0)//根據(jù)中斷標(biāo)志位,只對(duì)符合條件的模塊進(jìn)行pwm占空比的改變{if(key_400hz==0){CCAP0H=SPWM_400hz[pionter];}elseif(key_50hz==0){CCAP0H=SPWM_50hz[pionter];}25/30}EN_H1=1;EN_H2=1;//使能半橋驅(qū)動(dòng)器,使全橋工作TIMER0_init();PCA_init();EA=1;//開總中斷while(1){while(flag==0)//頻率切換{if(0==key_50hz){delay_ms(5);if(0==key_50hz)//進(jìn)行定時(shí)器初值和半周值的設(shè)定{TH0_h=0xf7;TH0_l=0xff;//50hzhalf_value=54;flag=1;CR=1;}}elseif(0==key_400hz){delay_ms(5);if(0==key_400hz){TH0_h=0xfe;TH0_l=0x1d;//400hzhalf_value=27;flag=1;CR=1;26/30}}}while(flag){if((key_400hz&&key_50hz)==1)//利用開關(guān)自身的機(jī)械延遲特性{//flag為0時(shí)表示機(jī)械開關(guān)切換時(shí)兩開關(guān)都懸空的短暫狀態(tài)flag=0;CR=0;//切換時(shí)暫時(shí)關(guān)閉PCA計(jì)數(shù)器}//***AD轉(zhuǎn)換及其它程序***////*待定*//}}程序2:采樣顯示程序//=========================================================//硬件配置:系統(tǒng)時(shí)鐘12Mhz,不分頻//定時(shí)器0速度為12T,模式為1--16位不可重裝//定時(shí)器2作為串口1的波特率發(fā)生器,速度為1T,波特率為115200//=========================================================#include#include#include#defineFOSC12000000L//宏定義時(shí)鐘頻率#defineBAUD115200//串口波特率#defineADC_POWER0x80//ADC電源控制位10000000上電#defineADC_FLAG0x10//ADC完成標(biāo)志00010000查詢是否轉(zhuǎn)換結(jié)束#defineADC_START0x08//ADC起始控制位00001000開始#defineADC_SPEEDLL0x00//540個(gè)時(shí)鐘00000000選擇速度540*8=4320#defineucunsignedchar#defineuiunsignedintfloatTemperature;//電瓶溫度floatBetteryVoltage;//電瓶電壓floatBetteryCurrent;//電瓶電流uiRemindingPower;//剩余電量ucidatabuf[130];uccounter;bitflag;bitbusy;sbitDQ=P3^7;//---DS18B20引腳聲明---//---main主程序區(qū)---voidmain(void){ADC_init();Uart1_init();27/30Timer0_init();EA=1;//---CPU開中斷---SendString("CLS(8);DS24(25,54,'UPS后備式不間斷',2,0);DS16(84,150,'中北大學(xué)朔州校區(qū)',4,0);DS24(68,84,'變頻電源',2,0);\r\n");delay_1s(3);SendString("CIRF(60,125,5,2);\r\n");//第零個(gè)點(diǎn)delay_1s(3);SendString("CIRF(80,125,5,2);\r\n");//第一個(gè)點(diǎn)delay_1s(3);SendString("CIRF(100,125,5,2);\r\n");//第二個(gè)點(diǎn)delay_1s(3);SendString("CIRF(120,125,5,2);\r\n");//第三個(gè)點(diǎn)delay_1s(3);SendString("CIRF(140,125,5,2);\r\n");//第四個(gè)點(diǎn)delay_1s(3);SendString("CIRF(160,125,5,2);\r\n");//第五個(gè)點(diǎn)delay_1s(3);SendString("CLS(8);DS24(0,0,'電瓶',5,0);DS16(1,21,'電壓:電流:',1,0);DS16(1,40,'溫度:剩余電量:%',1,0);DS24(0,55,'市電',5,0);DS16(0,76,'電壓:V電流:A',1,0);DS24(0,93,'輸出',5,0);DS16(0,117,'PF:峰峰值:',1,0);DS16(0,137,'狀態(tài):HZ效率:V',1,0);\r\n");TR0=1;//---啟動(dòng)T0定時(shí)開始工作---while(1){if(flag==1){flag=0;sprintf(buf,"溫度:%.2f℃\r\n",Temperature);sprintf(buf,"DS16(45,42,'%.2f℃',1,0);DS16(45,22,'%.2fV',1,0);DS16(144,22,'%.2fA',1,0);\r\n",Temperature,BetteryVoltage,BetteryCurrent);SendString(buf);}/*DS16(120,22,'%.2fA',1,0);DS16(45,42,'%3d',1,0);,BetteryCurrent,RemindingPower*/}}//---T0定時(shí)1mS溢出中斷服務(wù)程序---voidT0_ISR(void)interrupt1{TH0=(65536-FOSC/12/20)/256;TL0=(65536-FOSC/12/20)%256;counter++;if(counter==20){BetteryVoltage=GetADC_result(0);BetteryCurrent=GetADC_result(1);28/30/*RemindingPower=(BetteryVoltage-10.8)/3.8*100;*/Temperature=Temp_Change();counter=0;flag=1;}}//***串口1中斷服務(wù)程序***//voidUart1_ISR()interrupt4using1{if(RI){RI=0;//清除RI位}if(TI){TI=0;//清除TI位busy=0;//清忙標(biāo)志}}