打印
[STM32F1]

STM32 TIM1_CH4 比较中断出现连续中断

[复制链接]
5456|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
f403726660|  楼主 | 2015-2-10 11:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题,  在我将定时器1的ch4通道设置成比较中断之后, 我设置        TIM_OCInitStructure.TIM_Pulse = 0; 但是发现还是不停的进入比较中断,计数值 i 不停的在累加,进入中断,请问下是我哪配置错了吗,求解
配置代码:
TIM_OCInitTypeDef  TIM_OCInitStructure;
        /* PWM配置*/
        TIM_OCInitStructure.TIM_OCMode =TIM_OCMode_PWM1;        //PWM模式1   2区别
        TIM_OCInitStructure.TIM_OutputState =TIM_OutputState_Enable;
        TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_High;       

        /*互补配置*/
        TIM_OCInitStructure.TIM_OutputNState =TIM_OutputNState_Enable;
        TIM_OCInitStructure.TIM_OCNPolarity =TIM_OCNPolarity_High;
//        TIM_OCInitStructure.TIM_OCIdleState =TIM_OCIdleState_Reset;                //刹车之后的输出状态
        //TIM_OCInitStructure.TIM_OCNIdleState =TIM_OCNIdleState_Reset;        //刹车之后的互补输出状态
       
        TIM_OCInitStructure.TIM_Pulse =0;                        //         此处直接赋值设置占空比, 或者在其他地方调用TIM_SetCompare1(TIM1,3000);
                                                                                                //        也可以更改占空比,本程序是main函数中调用修改的占空比
        TIM_OC1Init(TIM1,&TIM_OCInitStructure);
        TIM_OC1Init(TIM8,&TIM_OCInitStructure);       
       
        TIM_OCInitStructure.TIM_Pulse =0;       
        TIM_OC2Init(TIM1,&TIM_OCInitStructure);
        TIM_OC2Init(TIM8,&TIM_OCInitStructure);       
       
        TIM_OCInitStructure.TIM_Pulse =0;       
        TIM_OC3Init(TIM1,&TIM_OCInitStructure);
        TIM_OC3Init(TIM8,&TIM_OCInitStructure);
       
        //set adc sample time
        TIM_OCInitStructure.TIM_Pulse = 0;

        TIM_OC4Init(TIM1, &TIM_OCInitStructure);
        TIM_OC4Init(TIM8, &TIM_OCInitStructure);

     //enable interrupt

         TIM_ClearFlag(TIM1,TIM_FLAG_CC4);
         TIM_ClearFlag(TIM8,TIM_FLAG_CC4);
     TIM_ITConfig(TIM1, TIM_IT_CC4, ENABLE);                        //CCR4的中断,这个通过设置CCR4的pulse来控制产生中断相当于PWM-ON的位置
         TIM_ITConfig(TIM8, TIM_IT_CC4, ENABLE);

中断代码:
u32 i;
void TIM1_CC_IRQHandler(void)
{
        if(TIM_GetITStatus(TIM1,TIM_IT_CC4) ==SET)
        {
                TIM_ClearITPendingBit(TIM1,TIM_IT_CC4);
                Motor1_IValue =(float )ADC_Value[1]/ADC_PerCent*3.3;
                i ++;
        }
       
}
沙发
f403726660|  楼主 | 2015-2-10 11:18 | 只看该作者
比较值为0的时候,不是应该不进行比较,不会产生比较中断吗??我看网上有人说的,  在设置比较值为0的时候是不会产生中断的啊... 但是我的一直在中断,  不知道是不是由于这个原因造成的,

使用特权

评论回复
板凳
mmuuss586| | 2015-2-10 12:21 | 只看该作者
TIM_OCInitStructure.TIM_Pulse = 0
0改成大点的数值;

使用特权

评论回复
地板
f403726660|  楼主 | 2015-2-10 13:10 | 只看该作者
改了,没效果.. 但是TIM_OCInitStructure.TIM_Pulse =0 改成大点的数的话, 这样不就让他产生比较中断了吗?  我现在设置成0  都还是产生比较中断, 一直进的我中断函数

使用特权

评论回复
5
f403726660|  楼主 | 2015-2-10 14:38 | 只看该作者
mmuuss586 发表于 2015-2-10 12:21
TIM_OCInitStructure.TIM_Pulse = 0
0改成大点的数值;

改成1000(有效值)试了下   还是在一直进中断,看不出什么, 然后我再改成6000(无效值,我定时器范围0-3000), 还是在不断的进入中断,而且还是进的我判断之后的 代码段,i 还是在累加 ,不知道是何原因

使用特权

评论回复
6
f403726660|  楼主 | 2015-2-13 09:33 | 只看该作者
... 测试发现,设定为0 照常也会进入比较中断,  中标标志被置位, 所以只能在需要时打开通道中断,不需要时关闭通道中断, 但是设定为无效值时还是会进入中断, 这就有点不理解了,  还是说STM32的 比较中断 本身机制就是这样判定的...  没人回答,还是结贴好了,  还是多看手册

使用特权

评论回复
7
戈卫东| | 2015-2-13 09:37 | 只看该作者
占空比=0不等于没有输出吧。。。。。

使用特权

评论回复
8
戈卫东| | 2015-2-13 09:46 | 只看该作者
ST的手册对这个有说明。
EDGE模式,CCR=0或CCR>ARR,在计数溢出的时候给出中断信号,不是不给出信号。

使用特权

评论回复
9
戈卫东| | 2015-2-13 09:50 | 只看该作者
CENTER模式,
CCR=0,计数到0给出中断信号。
CCR>ARR,计数到最大值时给出中断信号。

使用特权

评论回复
10
f403726660|  楼主 | 2015-2-14 09:39 | 只看该作者
戈卫东 发表于 2015-2-13 09:50
CENTER模式,
CCR=0,计数到0给出中断信号。
CCR>ARR,计数到最大值时给出中断信号。 ...

是会给中断信号, CCR=0  CCR>ARR 这个信号给出的是更新中断信号 还是比较中断信号,  就是这个没区分开来, 但是经过我测试 发现给出的都是比较中断,    像CCR>ARR   最大值时  是不是按道理应该是给出更新中断信号,  不应该是比较中断信号吧,  计数值永远达不到  如果 CCR 设定值比ARR  MAX值还大的话

使用特权

评论回复
11
戈卫东| | 2015-2-14 19:28 | 只看该作者
f403726660 发表于 2015-2-14 09:39
是会给中断信号, CCR=0  CCR>ARR 这个信号给出的是更新中断信号 还是比较中断信号,  就是这个没区分开 ...

我说的都是CCIF中断,也就是比较中断。

使用特权

评论回复
12
向上的少年| | 2015-6-16 16:22 | 只看该作者
我也发现这个问题,比较中断好像只要计数器溢出,就会进中断,折腾了一下午,没进展,,,

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

24

帖子

0

粉丝