这是单相逆变波形,占空比按百分比增加也是这样,附上源码
- #include <STC32G.H>
- #include <config.h>
- #include <intrins.H>
-
- #define FOSC 24000000UL //24MHz,时钟周期0.5us
- #define uchar unsigned char
- #define uint unsigned int
-
- #define PWM_PSC (12-1) //12分频
- #define PWM_PERIOD 40000 //周期2ms 50Hz
-
- #define PWM_DUTY duty //占空2%
- #define PWM_DTime 48 //死区10us 1~10us 12~120
-
- u16 t1=2;
- u16 duty;
- u16 duty1=19990;
- //bit updateduty;
-
- void Timer2_Init(void);
- //void delayms(u16 ms);
- void SYS_Init();
- void PWM_Init();
- //void Update_duty(); //更新占空比函数
- //void Timer0_Init();
-
- void main()
- {
- SYS_Init();
- PWM_Init();
- Timer2_Init();
- AUXR |= 0x10; //定时器2开始计时
- EA=1;
- //Update_duty();
- while(1);
- {
-
-
- }
- }
-
-
-
- void SYS_Init()
- {
- WTST=0;
-
- EAXFR=1;
- CKCON=0;
- duty=200;
-
- P0M1 = 0x00;P0M0 = 0x00; //设置P0口为准双向口模式 //00:准双向口 01:推挽输出 10:高阻输入 11:开漏输出
- P1M1 = 0x00;P1M0 = 0x00; //设置P1口为准双向口模式 //00:准双向口 01:推挽输出 10:高阻输入 11:开漏输出
- P2M1 = 0x00;P2M0 = 0x0F; //设置P2口为推挽输出模式 //00:准双向口 01:推挽输出 10:高阻输入 11:开漏输出
- P3M1 = 0x00;P3M0 = 0x00; //设置P3口为准双向口模式 //00:准双向口 01:推挽输出 10:高阻输入 11:开漏输出
- }
-
- void PWM_Init()
- {
- PWMA_PSCRH=(char)(PWM_PSC>>8);
- PWMA_PSCRL=(char)(PWM_PSC);
-
- PWMA_CCER1=0x00;
-
- PWMA_CCMR1=0x60;
- PWMA_CCMR2=0x30;
-
- PWMA_CCER1=0x55;
-
- PWMA_ARRH=(char)(PWM_PERIOD>>8),
- PWMA_ARRL=(char)(PWM_PERIOD);
-
- PWMA_ENO =0x0f;
- PWMA_PS =0x05;
- PWMA_DTR = PWM_DTime; // 插入死区时间
-
- PWMA_CCR1H=(char)(PWM_DUTY>>8);
- PWMA_CCR1L=(char)(PWM_DUTY);
- PWMA_CCR2H=(char)(PWM_PERIOD/2>>8);
- PWMA_CCR2L=(char)(PWM_PERIOD/2);
-
- PWMA_IER =0x05;
- PWMA_BKR=0x80;
- PWMA_CR1=0x01;
- }
-
- void PWMA_ISR() interrupt 26
- {
- if(PWMA_SR1&0x01)
- {
- PWMA_CCR2H=(char)(PWM_PERIOD/2>>8); //设置占空比时间
- PWMA_CCR2L=(char)(PWM_PERIOD/2);
-
- PWMA_SR1&=~0x01;
- }
- else if(PWMA_SR1&0x04)
- {
- PWMA_CCR2H=(char)((PWM_PERIOD/2+PWM_DUTY)>>8);
- PWMA_CCR2L=(char)(PWM_PERIOD/2+PWM_DUTY);
- PWMA_SR1&=~0x04;
- }
- else
- {
- PWMA_SR1=0;
- }
- }
-
- void Timer2_Init(void) //1秒@24.000MHz
- {
- TM2PS = 0x00; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
- AUXR &= 0xFB; //定时器时钟12T模式
- T2L = 0xB1; //设置定时初始值
- T2H = 0x00; //设置定时初始值
-
- IE2 |= 0x04; //使能定时器2中断
-
- }
-
- /*短路保护程序*/
- /*void INT0_Isr(void) interrupt 0
- {
- in0:TR1=TR0=0;
- IE&=0x85;
- P14=0;
- P03=0;
- P35=0;
- goto in0;
- }
-
- void INT1_Isr(void) interrupt 2
- {
- in1:TR1=TR0=0;
- IE&=0x85;
- P14=0;
- P04=0;
- P35=0;
- goto in1;
- }
- */
- void Timer2_Isr(void) interrupt 12
- {
-
- /*if(duty1>99)duty1=99;if(duty1<2)duty1=2;
- if(t1<duty1)(t1++,duty=20*t1,PWMA_CCR1H = (u8)(duty >> 8),
- PWMA_CCR1L = duty); //else //设置CC1通道占空比
- if(t1>duty1)(t1--,duty=20*t1,PWMA_CCR1H = (u8)(duty >> 8),
- PWMA_CCR1L = duty); */
-
-
- if(PWM_DUTY<=duty1)(PWM_DUTY+=4,PWMA_CCR1H = (u8)(PWM_DUTY >> 8),
- PWMA_CCR1L =PWM_DUTY); //else //设置CC1通道占空比
- if(PWM_DUTY>=duty1)(PWM_DUTY-=4,PWMA_CCR1H = (u8)(PWM_DUTY >> 8),
- PWMA_CCR1L = PWM_DUTY);
-
- }
-
- /*void delayms(u16 ms) //简单延时函数,自适应主频,1毫秒*ms
- {
- u16 i;
- do{
- i = MAIN_Fosc/6000;
- while(--i);
- }while(--ms);
- }
- */
复制代码
|