本帖最后由 lss1985 于 2017-10-9 16:03 编辑
如何设置两路频率相同的PWM相差四分之一周期呢,现在是通过延时来处理的,但实际使用总有些莫名其妙的问题FREQ是修改频率的函数,然后根据频率计算延时的时长,也即四分之一的周期,第二个函数是启动PWM,延时函数放中间,先启动0,5,再启动6,7,延时子函数是按us计算的,实际使用出现问题是第一次调用FREQ正常,第二次再调用FREQ来修改PWM周期后,延时的时间还是之前第一次PWM周期的四分之一,
void FREQ(uint32_t freq)
{
uint32_t cnr,cmr;
uint32_t zk=50;
cnr=22118400/5/16/freq-1;
cmr=zk*(cnr+1)/100-1;
delaytime=250000/freq;
PWMA->CNR0 =cnr;//pwm0
PWMA->CMR0 =cmr;
PWMB->CNR1 =cnr;//pwm5
PWMB->CNR2 =cnr;//pwm6
PWMB->CNR3 =cnr;//pwm7
PWMB->CMR1 =cmr;//pwm5
PWMB->CMR2 =cmr;//pwm6
PWMB->CMR3 =cmr;//pwm7
}
void PWM_start(void)
{
PWMA->PCR |=(1<<0);//START pwm0
PWMB->PCR |=(1<<8);//START pwm5
Delayus(delaytime);
PWMB->PCR |=(1<<16)|(1<<24);//START pwm67
}
void Delayus(uint32_t unCnt)
{
SysTick->LOAD = unCnt * 11;
SysTick->VAL = 0;
SysTick->CTRL |= 1UL << 0;
while((SysTick->CTRL & 1UL << 16) == 0);
}
|