本帖最后由 huiyong828 于 2024-5-1 22:36 编辑
硬件实现四路PWM,应用于开关电源全桥电路
现在只是按照要求初始化PWM,能实现PWM1 PWM4 与PWM2 PWM3相位差90度。
15位增强型PWM模式全桥变换器测试程序.rar
(186.48 KB, 下载次数: 47)
代码如下:
- /******************** PWM15配置 ********************/
- void PWM15_config(void)
- {
- PWM15_InitTypeDef PWM15_InitStructure;
-
- // DT_Value = 2; //占空比
- // CY_Value = 225; //周期
- temp1 = (u16)(CY_Value * DT_Value /100); //计算出导通时间
- temp2 = (u16)(CY_Value/2 + temp1); //低电平输出位置
- temp3 = (u16)(CY_Value/2); //高电平输出位置
-
- PWM15_InitStructure.PWM_Enable = ENABLE; //PWM使能, ENABLE, DISABLE
- PWM15_InitStructure.PWM_Period = CY_Value; //PWM周期, 0~0x7fff
- PWM15_InitStructure.PWM_Clock_Sel = PWM_CLK_SYS; //时钟源选择, PWM_CLK_SYS, PWM_CLK_TM2
- PWM15_InitStructure.PWM_Clock_PS = 0; //系统时钟分频参数(PS+1分频), 0~15
- PWM15_InitStructure.PWM_CInt = ENABLE; //计数器归零中断使能, ENABLE, DISABLE
- PWM15_InitStructure.PWM_Counter = ENABLE; //计数器使能, ENABLE, DISABLE
- PWM15_Init(&PWM15_InitStructure);
-
- PWM15Duty(PWM15_1,temp1, 0); //PWM_ID, 输出低电平位置, 输出高电平位置
- PWM15Duty(PWM15_2,temp2,temp3); //PWM_ID, 输出低电平位置, 输出高电平位置
- PWM15Duty(PWM15_3,temp2,temp3); //PWM_ID, 输出低电平位置, 输出高电平位置
- PWM15Duty(PWM15_4,temp1, 0); //PWM_ID, 输出低电平位置, 输出高电平位置
- PWMChannelCtrl(PWM15_1,ENABLE,PWM15_SW_P2,0,ENABLE,ENABLE,DISABLE); //PWM_ID, 输出使能, 输出通道, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
- PWMChannelCtrl(PWM15_2,ENABLE,PWM15_SW_P2,0,DISABLE,DISABLE,DISABLE); //PWM_ID, 输出使能, 输出通道, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
- PWMChannelCtrl(PWM15_3,ENABLE,PWM15_SW_P2,0,DISABLE,DISABLE,DISABLE); //PWM_ID, 输出使能, 输出通道, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
- PWMChannelCtrl(PWM15_4,ENABLE,PWM15_SW_P2,0,DISABLE,DISABLE,DISABLE); //PWM_ID, 输出使能, 输出通道, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
- }
-
- /******************** task A **************************/
- void main(void)
- {
- EAXSFR(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展SFR(XSFR) */
- GPIO_config();
- PWM15_config();
- pwm0 = 0;
- pwm1 = 0;
- B_PWM0_Dir = 0;
-
- EA = 1;
-
- while (1)
- {
- delay_ms(1);
-
- if(B_PWM0_Dir)
- {
- if(-- DT_Value <=1) B_PWM0_Dir = 0;
- }
- else if(++ DT_Value >=45) B_PWM0_Dir = 1;
-
- temp1 = (u16)((u32)CY_Value * DT_Value /100); //计算出导通时间 低电平输出位置
- temp2 = (u16)(CY_Value/2 + temp1); //低电平输出位置
- temp3 = (u16)(CY_Value/2); //高电平输出位置
- PWM15Duty(PWM15_1,temp1, 0);
- PWM15Duty(PWM15_2,temp2,temp3);
- PWM15Duty(PWM15_3,temp2,temp3);
- PWM15Duty(PWM15_4,temp1, 0);
-
- }
- }
-
- void PWM_ISR (void) interrupt PWM_VECTOR
- {
- char store;
- store = P_SW2;
- P_SW2 |= 0x80;
-
- if(PWMCFG & PWMCBIF) //PWM计数器归零中断标志
- {
- PWMCFG &= ~PWMCBIF; //清除中断标志
- // TODO: 在此处添加用户代码
- }
-
- if(PWMIF & PWM_C0IF) //PWM0匹配中断
- {
- PWMCFG &= ~PWM_C0IF; //清除中断标志
- // TODO: 在此处添加用户代码
- }
-
- if(PWMIF & PWM_C1IF) //PWM1匹配中断
- {
- PWMCFG &= ~PWM_C1IF; //清除中断标志
- // TODO: 在此处添加用户代码
- }
-
- if(PWMIF & PWM_C2IF) //PWM2匹配中断
- {
- PWMCFG &= ~PWM_C2IF; //清除中断标志
- // TODO: 在此处添加用户代码
- }
-
- if(PWMIF & PWM_C3IF) //PWM3匹配中断
- {
- PWMCFG &= ~PWM_C3IF; //清除中断标志
- // TODO: 在此处添加用户代码
- }
-
- if(PWMIF & PWM_C4IF) //PWM4匹配中断
- {
- PWMCFG &= ~PWM_C4IF; //清除中断标志
- // TODO: 在此处添加用户代码
- }
-
- if(PWMIF & PWM_C5IF) //PWM5匹配中断
- {
- PWMCFG &= ~PWM_C5IF; //清除中断标志
- // TODO: 在此处添加用户代码
- }
-
- if(PWMIF & PWM_C6IF) //PWM6匹配中断
- {
- PWMCFG &= ~PWM_C6IF; //清除中断标志
- // TODO: 在此处添加用户代码
- }
-
- if(PWMIF & PWM_C7IF) //PWM7匹配中断
- {
- PWMCFG &= ~PWM_C7IF; //清除中断标志
- // TODO: 在此处添加用户代码
- }
-
- if(PWMFDCR & PWMFD_FDIF) //PWM异常检测中断
- {
- PWMFDCR &= ~PWMFD_FDIF; //清除中断标志
- // TODO: 在此处添加用户代码
- }
- P_SW2 = store;
- }
复制代码
问题1:硬件仿真时,进不了PWM中断,上面设置了PWM1的T1中断?
|