发 帖  
原厂入驻New
[问答] 为什么有时OC1中断不触发作为PWM脉冲?
306 应用程序 示波器 PWM
分享
早上好,我正在使用PIC33EP512MC806,我正在开发一个应用程序,我需要计算OC1模块产生的脉冲数。该模块采用timer4作为时基,初始化代码如下:WriteTimer4(0);IFS1bits.T4IF=0;//Reset标记int定时器4ConfigIntTimer4(T4_INT_OFF&T4_INT_PRIOR_7);OpenTimer4(T4_ON&T4_IDLE_CON&T4_GA)。TE_OFF&T4_PS_1_1&T4_SOURCE_INT,60);T4CONbits.T32=0;OC1CON1=0;/*初始清除控制位*/OC1CON2=0;OC1CON1 bits.OCTSEL=0b010;/*选择TIMER4作为OC模块*/OC1R=0;/*的时钟输入,这只是一个典型的数字,用户名。必须基于波形要求和系统时钟*/OC1RS=2000;/*确定周期*/OC1CON1bits.OCM=6;/*这选择边缘对齐PWM模式*/OC1CON2bits.SYNCSEL=0x1F;/*没有选择触发器或同步源*/我看到的问题是生成的PWM模式*/OC1CON1bits脉冲数不同于我在程序中计数的脉冲数。我发现的原因,但我不确定,显示在附件的示波器图中。紫色通道显示OC1中断功能中的周期被调用,而黄色通道是PWM脉冲。如您所见,有时OC1中断不触发作为PWM脉冲(更确切地说,当我改变责任和周期),因此我松了一些在计数。你有什么想法?谢谢您。
0
2019-11-6 13:33:18   评论 分享淘帖 邀请回答
7个回答
这张照片有PPS。选择OC1引脚asPin任何计时器/计数器和计数…-)
2019-11-6 13:38:52 评论

举报

你好,Batgoy,是的,这是一个可行的解决方案,我会记住它是最终的解决方案,Smile:。我的目标,至少目前,包括两个OCx输出,可以独立改变十分之二Hz和200kHz之间的频率。所以我用一个定时器作为PWM的基本计数器,我应该用另一个计时器来计算脉冲。另外,我正在使用另一个定时器来每隔10m s更新一次频率。总的来说,我应该使用5个定时器,考虑到将来我还会添加其他功能,这些定时器很多。你有没有使用过PWM,当你在运行时改变它的频率时,OCxInter.就不会发生如示波器所示的UR?正常吗?谢谢你的回答。
2019-11-6 13:47:00 评论

举报

什么是紫色通道切换到ISR?”OC1中断函数中的“周期”不能很好地解释它。在您的作用域的屏幕截图中,我看不到任何丢失的脉冲。我只看到它变形,可能是因为其中一个中断被延迟了。如果你放大,就容易多了。
2019-11-6 13:54:41 评论

举报

你好,NorthGuy,谢谢你的回答。紫色的功能基本上是改变每个OC1中断的管脚LATD1;void_.((inter.,auto_psv))_OC1Inter.(void){LATDbits.LATD1=!LATDbits.LATD1;IFS0bits.OC1IF=0;PWMInterrupt(&m1);}关于示波器图片,附图中的图片显示了更好的问题。正如您所说,可能的原因是我在中断内使用PWMInterrupt函数进行了太多的操作。HSPWM模块工作得很好,但是当我修改它以使用OC1模块(为了达到更低的频率)时,我开始有这个问题。它们之间的唯一区别是如何确定PWM频率,因为对于OC1,我必须同时改变周期和预分频器值。我用来每隔1ms改变频率的函数如下:if(freq>0){.(1){if(Fcy/(pre caler*freq)-1<0xFFFFFFFF)/*Fcy=60000,freq是kHz*/{/*中的浮点数,如果它到达这里,我们发现一个可能的预调频器值*/周期=Fcy/(pre caler*freq)-1;T4CONbits.TCKPS=pre calerR例如,OC1Rs=周期;OC1R=100;中断;否则,如果(预分频器和LT;256){(预分频器=1)预分频器=8;否则,(预分频器=8)预分频器=64;否则预分频器=256;PrasCaleReg + +;/*这是在预分频器寄存器*/}中写入的实际值{OC1R= 0;;C1Rs=2000;断裂;} }您认为OC1中断功能在其他几件事情中是否太多?你能建议我怎么做吗?谢谢您。
2019-11-6 14:07:00 评论

举报

P.S.我明确地认为问题在于代码部分,因为计算公式“Fcy/(pre caler*freq)-1”只有一次(上面计算两次),所以误差减小。不过,我需要简化它,谢谢。请再帮帮我。
2019-11-6 14:17:12 评论

举报

看起来你的中断时间比定时器周期要长。一旦发生这种情况,中断就会被推迟,你也可能会失去一些。试着在中断开始时打开LATD1,在结束时关闭LATD1。然后用范围观察它。这样,你就会看到中断所花费的时间。你会看到这个时间有时比PWM周期长。
2019-11-6 14:25:15 评论

举报

你好,北佬,我把PWM周期计算移到定时器里面更新频率,看起来问题解决了。非常感谢你。
2019-11-6 14:38:54 评论

举报

只有小组成员才能发言,加入小组>>

109个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /7 下一条

快速回复 返回顶部 返回列表