This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
问题:
pwm输出,偶发的少输出一次高电平。问题出现频率一般为10分钟-1小时一次。问题不固定时间出现。
配置:
MSP4305435A芯片使用TA1.1输出PWM。
采用定时器输出模式的UP模式,输出3:set/reset,即CCR0为周期、CCR1为低电平时长。指定P8.6复用为PWM输出。
开启了ccr0计数中断。
pwm周期为10ms。低电平时长每隔1s在2.64ms和4.57ms之间切换(在CCR0中断中切换)。
图片说明:
正常波形的图片,包含若干波形,周期为10ms,低电平时常从4.57ms变换到2.64ms。
异常波形的图片,“波1”和“波3”正常。“波2”周期为20ms,其实应该是有个波少输出了一次高电平,导致低电平很长。
以下是CCR0中断,用于更新ccr1值,也就是占空比。
void TIMER_A1_0_ISR (void) { //每10ms进入 cnt++; if (cnt == 99) { cnt = 0; if (pwm == 1081) // 低电平2.64ms { pwm = 1873; Timer_A_setCompareValue(TIMER_A1_BASE, TIMER_A_CAPTURECOMPARE_REGISTER_1, 1081); } else // 低电平4.57ms { pwm = 1081; Timer_A_setCompareValue(TIMER_A1_BASE, TIMER_A_CAPTURECOMPARE_REGISTER_1, 1873); } } }
项目中一直在运行约7个中断(不算TA1 CCR0中断)。其中有周期10ms的TA0定时器中断和周期7.5ms的ADC中断,这两个是周期相对较短的中断。
做过以下测试:
测试1:关闭其余所有中断,项目仅运行PWM输出程序,仅有TA1 CCR0中断用于更新占空比。测试时间36小时,表现为:PWM输出正常。
测试2:仅关闭周期10ms的TA0定时器中断和周期7.5ms的ADC中断。测试时间48小时,表现为:PWM输出有不正常,不正常出现约12次。
测试3:项目正常运行,7个中断正常运行。测试时间48小时,表现为:PWM输出有不正常,不正常出现约50次。
也就是目前来看,中断是会影响pwm输出。但根据手册,pwm输出是外设在输出,与cpu、中断等无关。即便有其他中断在运行,导致更新ccr1被延后,也只应该导致pwm占空比更新被延后一个波形,不应该导致一次高电平没被拉高。
感谢您的详细测试。 我不确定TA0和ADC中断了什么操作,这是可能的:如果CCR1在TIMER_A1_0_ISR中更新时发生TA0或ADC中断,并执行一些软件代码一段时间,使此周期中没有脉冲输出,因为CCR1没有有效值或已清除(尚未写入)
建议将TIMER_A1_0_ISR设置为优先级最高的中断,以避免被他人中断