下面是我遇到的S12Z的问题叙述,请帮我提供一下解决方法 MF的更新貌似是通过PTU模块更新的; const u8 MaskVal[7] = {0x34,0x1C, 0x13,0x31, 0x0D,0x07, 0x3F};
const u8 OutCtl[7] = {0x0C,0x30, 0x30,0x03, 0x03,0x0C, 0x00}; void InitPMF(u8 align,u16 pwm_frequency,u16 dutycycle,u8 channel_enable)
{
// Edge aligned PWM
PMFCFG0_EDGEA = align;
PMFCFG0_EDGEB = align;
PMFCFG0_EDGEC = align;
// PWM generator A generates reload event
PMFCFG2_REV0 = 1;
PMFCFG2_REV1 = 0;
// Low MOSFETs ON while SW control (Unipolar PWM)
PMFOUTB = 0x2A;
// Writing to value register zero also writes to value registers one to five
PMFCFG3_VLMODE = 0x01; //01
// Reload every PWM cycle
PMFFQCA = 0;
//dutycycle 常数
PMFVAL0=pwm_frequency/dutycycle;
// PWM clock = core clock / PWM_PRSCA = 25MHz / PWM_PRSCA
PMFFQCA_PRSCA = FCORE;
// Load modulo timer A
PMFMODA = pwm_frequency;
// Load dead time timer A
PMFDTMA = PWM_DEADTIME_US;
//PMFCFG2|= 0x3f;
//PMFOUTC_OUTCTL=0x3f;
PMFCFG2 = 0x40 + MaskVal[channel_enable];
PMFOUTC_OUTCTL = OutCtl[channel_enable];
// All outputs in Software mode
// PMF external global load OK signal controls reload of double buffered registers
PMFENCA_LDOKA = 1;
// PWM restart at commutation event
PMFENCA_RSTRTA = 1;
// PWM generator A outputs enabled
PMFENCA_PWMENA = 1;
//PMFENCB_PWMENB = 1;
// Buffered PMFOUTC, PMFOUTB, SWAPx and MSKx change on commutation event
PMFCFG1_ENCE = 1;
// 0 = Local LDOKA controls buffered registers / 1 = external Load OK controls buffered registers
PMFENCA_GLDOKA = 1;
PMFCNTA = 0x0000;
上面截图是我的PWM初始化,下面截图是我的PWM频率占空比,通道更新程序 void UpdatePMF(u16 pwm_frequency,u16 dutycycle,u8 channel_enable)
{
u16 delay1;
//PMFCFG1_ENCE=1;
//canrx1|=CANRXMSG.data5;
//canrx1|=(CANRXMSG.data4)<<8;
//canrx2|=CANRXMSG.data6;
test=PMFCFG0_WP;
PMFCFG2 = 0x40 + MaskVal[channel_enable];
PMFOUTC_OUTCTL = OutCtl[channel_enable];
PMFMODA= pwm_frequency;
PMFVAL0 = pwm_frequency/dutycycle;
PTUC_PTULDOK = 1;
//PMFCFG2|= 0x00;
// DC Bus current sampling point at middle of duty cycle
// Calibration due to GDU signal delay
// Divide by 2, because number of calculated ticks is related to PWM Clock = 25MHz
// PTU is running on 12.5MHz, so it is 2 times slower
delay1 = (PWM_DEADTIME_US + ((PMFVAL0 - PWM_DEADTIME_US) >> 1) + ADC_SAMPLE_TIME_CALIBRATION) >> 1;
// Load TG0 list 0 and list 1
PTUTriggerEventList[0][0][0] = delay1;
PTUTriggerEventList[0][1][0] = delay1;
// Clear flag
PTUC_PTULDOK = 1;
问题如下:在进行PWM更新的时候,只能更改其占空比,通道无法切换,问题1:频率更改后程序运行到 PTUC_PTULDOK = 1;这条语句后会死掉,问题2:通道切换是用寄存器PMFCFG2与PMFOUTC两个寄存器控制,使用调试方式的结果是,两个寄存器已经被更新程序成功改写,可是通道输出还是没有改变,请帮我分析一下问题谢谢。
|