qmx1998:
程序1:SPWM程序//===MCU~STC15F2K60S2//===利用两个PCA模块产生两路互补单极性SPWM波//===第一路/ccp0_3/P2.5,第二路/ccp1_3/P2.6//===全桥使能信号端EN_H1/P2^1,EN_H2=P2^2//******************************************************************************************//===系统时钟为11.0592Mhz@1T21/3022/30//===基波频率为50hz的情况下,把一个正弦波分成108份,即正弦波表中有54个数值//===@50hz,PCA时钟源为系统时钟2分频,即载波频率为:Fc=11059200/2/256=21.6khz//===@50hz,定时器溢出频率为:Ft=50*108=5.4Khz,此时Fc=4*Ft(Fc必须是Ft的整数倍)//===基波频率为400hz的情况下,把一个正弦波分成54份,即正弦波表中有27个数值//===@400HZ,PCA时钟源为系统时钟不分频,即载波频率为:Fc=11059200/256=43.2khz//===@400HZ,定时器溢出频率为:Ft=400*54=21.6khz,此时Fc=2*Ft//******************************************************************************************//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//=========试验日志=========//*****1.2016.6.2***********//程序可以跑通,驱动芯片工作,全桥工作,有输出//输出低通滤波器L=3.3mh,C=1uf,截止频率=2778hz//50hz频率下正弦波波形正常,400hz频率下波形畸变//修改方案:由于低通滤波器的截止频率确定与载波频率有关,所以为了在400hz和50hz两种频率下方便计算,决定统一//两种频率下的载波频率,即PCA模块频率,即://===@400HZ,PCA时钟源为系统时钟同样2分频,即载波频率为:Fc=11059200/2/256=21.6khz//*****2.2016.6.30***********//增加外置按键做到400hz和50hz的一键切换//主程序中增加按键检测程序,程序中进行定时器初值的赋给//===@50hz,定时器初值TH0_h=0xf7TH0_l=0xff//===@400HZ,定时器初值TH0_h=0xfeTH0_l=0x1d//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~/********包含头文件*********/#include#include/**********宏定义*********/#defineuiunsignedint#defineucunsignedchar#defineMAIN_FOSC11059200UL//定义主时钟频率11.0592Mhz/*********全局变量**********/ucpwm_value;ucpionter;//查表索引指针bitflag_zf;//正弦波前后半周标志位ucTH0_h,TH0_l;//定时器初值uchalf_value;//半周转换值/**********硬件接口定义定义************/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延时********/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;//清零中断标志位CL=0;CH=0;//清零PCA计数器CMOD=0X02;//@50Hz,PCA时钟源:sysclk二分频,修改后400hz、50hz通用/*CMOD=0x08;//@400Hz,PCA时钟源:sysclk不分频,禁止PCA计数器溢出中断*/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];//用哪个都行,初始值都一样CCAP0L=SPWM_400hz[0];CCAP0H=SPWM_400hz[0];CCAP0L=SPWM_400hz[0];//初始化PWM的输出占空比*/CR=1;//启动PCA计数器}24/30/*******定时器0初始化********/voidTIMER0_init(void){600/54=400hzET0=1;//开启定时器0中断TR0=1;//启动定时器0}/****定时器0中断服务程序*****/voidTIMER0_ISR(void)interrupt1{/*TH0=0xf7;TL0=0xff;*/TH0=TH0_h;TL0=TH0_l;//重装定时器初值pionter++;//正弦波表索引指针加一if(pionter==half_value)//正弦波表值使用完后进行前后半波转换{CR=0;//暂停PCA计数器pionter=0;//索引指针清零flag_zf=~flag_zf;//半周标志位取反if(flag_zf)//设置后半周{SPWM_out1=0;//模块0的pwm输出置0CCAPM0=0X00;//关闭pca模块0CCAPM1=0X42;//开启pca模块1}else//设置前半周{SPWM_out2=0;//模块1的输出置0CCAPM0=0X42;//打开pca模块0CCAPM1=0X00;//关闭pca模块1}CR=1;//再次开启PCA计数器}if(flag_zf==0)//根据中断标志位,只对符合条件的模块进行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;//使能半桥驱动器,使全桥工作TIMER0_init();PCA_init();EA=1;//开总中断while(1){while(flag==0)//频率切换{if(0==key_50hz){delay_ms(5);if(0==key_50hz)//进行定时器初值和半周值的设定{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)//利用开关自身的机械延迟特性{//flag为0时表示机械开关切换时两开关都悬空的短暂状态flag=0;CR=0;//切换时暂时关闭PCA计数器}//***AD转换及其它程序***////*待定*//}}程序2:采样显示程序//=========================================================//硬件配置:系统时钟12Mhz,不分频//定时器0速度为12T,模式为1--16位不可重装//定时器2作为串口1的波特率发生器,速度为1T,波特率为115200//=========================================================#include#include#include#defineFOSC12000000L//宏定义时钟频率#defineBAUD115200//串口波特率#defineADC_POWER0x80//ADC电源控制位10000000上电#defineADC_FLAG0x10//ADC完成标志00010000查询是否转换结束#defineADC_START0x08//ADC起始控制位00001000开始#defineADC_SPEEDLL0x00//540个时钟00000000选择速度540*8=4320#defineucunsignedchar#defineuiunsignedintfloatTemperature;//电瓶温度floatBetteryVoltage;//电瓶电压floatBetteryCurrent;//电瓶电流uiRemindingPower;//剩余电量ucidatabuf[130];uccounter;bitflag;bitbusy;sbitDQ=P3^7;//---DS18B20引脚声明---//---main主程序区---voidmain(void){ADC_init();Uart1_init();27/30Timer0_init();EA=1;//---CPU开中断---SendString("CLS(8);DS24(25,54,'UPS后备式不间断',2,0);DS16(84,150,'中北大学朔州校区',4,0);DS24(68,84,'变频电源',2,0);\r\n");delay_1s(3);SendString("CIRF(60,125,5,2);\r\n");//第零个点delay_1s(3);SendString("CIRF(80,125,5,2);\r\n");//第一个点delay_1s(3);SendString("CIRF(100,125,5,2);\r\n");//第二个点delay_1s(3);SendString("CIRF(120,125,5,2);\r\n");//第三个点delay_1s(3);SendString("CIRF(140,125,5,2);\r\n");//第四个点delay_1s(3);SendString("CIRF(160,125,5,2);\r\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,'状态:HZ效率:V',1,0);\r\n");TR0=1;//---启动T0定时开始工作---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定时1mS溢出中断服务程序---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中断服务程序***//voidUart1_ISR()interrupt4using1{if(RI){RI=0;//清除RI位}if(TI){TI=0;//清除TI位busy=0;//清忙标志}}