STM32
直播中

王燕

7年用户 1749经验值
私信 关注
[问答]

在利用“通用定时器”捕获PWM信号的过程中,中断服务函数是设置为如下的哪一种模式呢?

在利用“通用定时器”捕获PWM信号的过程中,我们的中断服务函数是设置为如下的哪一种模式呢?模式1和模式2:
模式1:
        if ( tiM_GetITStatus ( GENERAL_TIM, TIM_IT_Update) != RESET )               
        {        
                TIM_ICUserValueStructure.Capture_Period ++;               
                TIM_ClearITPendingBit ( GENERAL_TIM, TIM_FLAG_Update );                 
        }

        // 上升沿捕获中断
        if ( TIM_GetITStatus (GENERAL_TIM, GENERAL_TIM_IT_CCx ) != RESET)
        {
                // 第一次捕获
                if ( TIM_ICUserValueStructure.Capture_StartFlag == 0 )
                {
                        // 计数器清0
                        TIM_SetCounter ( GENERAL_TIM, 0 );
                        // 自动重装载寄存器更新标志清0
                        TIM_ICUserValueStructure.Capture_Period = 0;
      // 存捕获比较寄存器的值的变量的值清0                        
                        TIM_ICUserValueStructure.Capture_CcrValue = 0;

                        // 当第一次捕获到上升沿之后,就把捕获边沿配置为下降沿
                        GENERAL_TIM_OCxPolarityConfig_FUN(GENERAL_TIM, TIM_ICPolarity_Falling);
      // 开始捕获标准置1                        
                        TIM_ICUserValueStructure.Capture_StartFlag = 1;                        
                }
                // 下降沿捕获中断
                else // 第二次捕获
                {
                        // 获取捕获比较寄存器的值,这个值就是捕获到的高电平的时间的值
                        TIM_ICUserValueStructure.Capture_CcrValue =
                        GENERAL_TIM_GetCapturex_FUN (GENERAL_TIM);

                        // 当第二次捕获到下降沿之后,就把捕获边沿配置为上升沿,好开启新的一轮捕获
                        GENERAL_TIM_OCxPolarityConfig_FUN(GENERAL_TIM, TIM_ICPolarity_Rising);
      // 开始捕获标志清0               
                        TIM_ICUserValueStructure.Capture_StartFlag = 0;
      // 捕获完成标志置1                        
                        TIM_ICUserValueStructure.Capture_FinishFlag = 1;               
                }

                TIM_ClearITPendingBit (GENERAL_TIM,GENERAL_TIM_IT_CCx);            
        }        


模式2:
/* 清除中断标志位 */
TIM_ClearITPendingBit(GENERAL_TIM, TIM_IT_CC1);
/* 获取输入捕获值 */
IC1Value = TIM_GetCapture1(GENERAL_TIM);
IC2Value = TIM_GetCapture2(GENERAL_TIM);
// 注意:捕获寄存器CCR1和CCR2的值在计算占空比和频率的时候必须加1
if (IC1Value != 0)  {    /* 占空比计算 */    DutyCycle = (float)((IC2Value+1) * 100) / (IC1Value+1);
/* 频率计算 */
Frequency = (72000000/(ADVANCE_TIM_PSC+1))/(float)(IC1Value+1);
printf("占空比:%0.2f%%   频率:%0.2fHzn",DutyCycle,Frequency);
}
else
{
DutyCycle = 0;
Frequency = 0;
}        


回帖(1)

宋玉红

2024-3-22 14:16:41
基于定时器捕获测量脉宽及占空比,你代码里涉及到的两种模式都可以,你根据情况来。具体就是资源及你对两种模式的理解。

第一种模式基于一个通道,中途要做捕获边沿的切换。特点是只需要1个捕获通道,但需做捕获边沿切换  。第二种模式是基于定时器复位从模式,要使用2个捕获通道,分别捕捉上沿和下沿,无须中途做捕获沿的切换。在捕获过程中没有发生计数器溢出的话,捕获值获得简单。

从你给出的代码来看,似乎待测信号宽度不会长于计数周期,即无须统计溢出次数,否则得考虑溢出次数。

另外,若使用模式2的话,在发生通道1捕获事件后就进行频率及占空比计算的话,应该保证通道2已经做过捕获并获得捕获值。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分