请教一下,CH573F使用定时器模拟多路PWM的问题。

关键代码:

uint16_t cont = 0;//计数

uint8_t pwm_H[6]={5,8,11,14,17,20};//上次比较值

uint8_t pwm_L[6]={5,8,11,14,17,20};//此次比较值

//主时钟

SetSysClock(CLK_SOURCE_PLL_60MHz);

//IO口配置

GPIOA_ResetBits(GPIO_Pin_10);?

GPIOA_ModeCfg(GPIO_Pin_10, GPIO_ModeOut_PP_5mA);

//定时器配置

TMR0_TimerInit(FREQ_SYS / 10000);? ? ?//100uS进入一次中断? ??

TMR0_ITCfg(ENABLE, TMR0_3_IT_CYC_END);?

PFIC_EnableIRQ(TMR0_IRQn);

//定时器中断

__attribute__((interrupt("WCH-Interrupt-fast")))

__attribute__((section(".highcode")))

void TMR0_IRQHandler(void) // TMR0 定时中断

{

? ? if(TMR0_GetITFlag(TMR0_3_IT_CYC_END))

? ? {

? ? ? ? TMR0_ClearITFlag(TMR0_3_IT_CYC_END); // 清除中断标志

? ? ? ? cont++;

? ? ? ? if(cont < 5 )

? ? ? ? {

? ? ? ? ? ? return;

? ? ? ? }

? ? ? ? else if(5 <= cont < 45)

? ? ? ? {

? ? ? ? ? ? if(cont <= pwm_H[0])

? ? ? ? ? ? ? ? GPIOA_SetBits(GPIO_Pin_12);

? ? ? ? ? ? else

? ? ? ? ? ? ? ? GPIOA_ResetBits(GPIO_Pin_12);

??????????(其余IO翻转操作省略)

? ? ? ? ?}

? ? ? ? else if(cont >= 200)//一个周期到了,更新比较值

? ? ? ? {

? ? ? ? ? ? ? cont = 0;

? ? ? ? ? ? ? for(int8_t i=0;i<6;i++)

? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? pwm_H[i] = pwm_L[i];

? ? ? ? ? ? ? }

? ? ? ? }

? ? }

}

我发现将?cont 类型设置成uint8_t才可以正常输出PWM,设置成uint16_t就不输出了。按理说设置成uint16_t没什么影响啊。

您好,按理说设置成无符号16位数确实应该没什么影响。

此处代码改一改,用两个逻辑拆分开。else if((5 <= cont) && (cont < 45))

image.png


只有登录才能回复,可以选择微信账号登录