- 打卡等级:初来乍到
- 打卡总天数:2
- 最近打卡:2026-03-26 17:07:59
已绑定手机
新手上路
- 积分
- 11
|
主要代码:
void HSPWM_config(void)
{
HSPWMx_InitDefine PWMx_InitStructure;
u16 PWM4_DUTY_TEMP,PWM4_ARR_TEMP,PWM4_DTR_TEMP;
PWM4_ARR_TEMP = 50;//重装载值 单位:KHZ
PWM4_DUTY_TEMP = 20;//占空比 取值0-100
PWM4_DTR_TEMP = 1000;//死区时间 单位:ns
Pwm_Control.Pwm_Arr_Set = 4*MAIN_Fosc / PWM4_ARR_TEMP / 1000;//480;//设置频率
Pwm_Control.Pwm_Duty_Set = 4*(PWM4_DUTY_TEMP / 100.00f) * Pwm_Control.Pwm_Arr_Set;//设置占空比
Pwm_Control.Pwm_Dtr_Set = 4*(PWM4_DTR_TEMP / 1000.00f)* (MAIN_Fosc / 1000000);//设置死区时间
// PWM3_USE_P24P25();
PWM4_USE_P26P27();
PWMx_InitStructure.PWM_EnoSelect= ENO4N; //输出通道选择, ENO1P,ENO1N,ENO2P,ENO2N,ENO3P,ENO3N,ENO4P,ENO4N / ENO5P,ENO6P,ENO7P,ENO8P
PWMx_InitStructure.PWM_MainOutEnable= ENABLE; //主输出使能, ENABLE,DISABLE
PWMx_InitStructure.PWM_CEN_Enable = ENABLE; //使能计数器, ENABLE,DISABLE
HSPWM_Configuration(PWMA, &PWMx_InitStructure, &PWMA_Duty); //初始化PWM通用寄存器, PWMA,PWMB
HSPllClkConfig(MCLKSEL_HIRC,PLL_96M,0); //系统时钟选择,PLL时钟选择,时钟分频系数
}
void HSPWM_Configuration(u8 PWM, HSPWMx_InitDefine *PWMx, PWMx_Duty *DUTYx)
{
//通过异步方式设置PWMA的相关寄存器
WritePWMA((u8)&PWMA_CCER1, 0x00);
WritePWMA((u8)&PWMA_CCER2, 0x00);
// WritePWMA((u8)&PWMA_CCMR3, CCMRn_ROLLOVER); //PWM3采用OC输出
WritePWMA((u8)&PWMA_CCMR4, CCMRn_ROLLOVER | 0X08); //PWM4采用PWM模式1
WritePWMA((u8)&PWMA_CCER1, 0X00); //配置通道输出使能和极性
WritePWMA((u8)&PWMA_CCER2, 0X40);
WritePWMA((u8)&PWMA_ENO, 0X80); //使能PWM信号输出端口
// WritePWMA((u8)&PWMA_CCR3H, (u8)(DUTYx->PWM3_Duty >> 8)); //设置输出PWM的占空比
// WritePWMA((u8)&PWMA_CCR3L, (u8)DUTYx->PWM3_Duty);
WritePWMA((u8)&PWMA_CCR4H, (u8)(Pwm_Control.Pwm_Duty_Set >> 8)); //设置输出PWM的占空比
WritePWMA((u8)&PWMA_CCR4L, (u8)Pwm_Control.Pwm_Duty_Set);
WritePWMA((u8)&PWMA_ARRH, (u8)(Pwm_Control.Pwm_Arr_Set >> 8)); //设置输出PWM的周期
WritePWMA((u8)&PWMA_ARRL, (u8)(Pwm_Control.Pwm_Arr_Set));
WritePWMA((u8)&PWMA_DTR, (u8)0x00);
WritePWMA((u8)&PWMA_BKR, PWMx->PWM_MainOutEnable<<7); //使能主输出
PWMA_IER |= 0x11;//开启PWM4捕获中断
PPWMAH = 1, PPWMA = 1;
WritePWMA((u8)&PWMA_EGR, (u8)0x11);
WritePWMA((u8)&HSPWMA_CFG, (u8)0x03);
WritePWMA((u8)&HSPWMA_CFG, (u8)0x07);
WritePWMA((u8)&PWMA_CR1, PWMx->PWM_CEN_Enable | 0X80); //开始PWM计数
}
u8 pwm_flag=0;
void PWMA_ISR_Handler (void) interrupt PWMA_VECTOR
{
u8 sta = 0;
sta = ReadPWMA((u8)&PWMA_SR1);
if ((sta && 0x01) || (sta && 0x08)) //UIFA 更新中断
{
WritePWMA((u8)&PWMA_SR1,0);
pwm_flag = 1;
}
}
|
|