打印
[STM32F1]

STM32F103通用定时器中断服务函数

[复制链接]
605|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
flycamelaaa|  楼主 | 2022-12-3 16:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在利用“通用定时器”捕获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.2fHz\n",DutyCycle,Frequency);
}
else
{
DutyCycle = 0;
Frequency = 0;
}      

使用特权

评论回复
沙发
elephant00| | 2022-12-13 14:42 | 只看该作者
写中断就不要用判断函数,直接在中断回调函数写

使用特权

评论回复
板凳
两只袜子| | 2022-12-13 14:43 | 只看该作者
关于PWM的测量,官方有现成的例程呀,可以参考。

使用特权

评论回复
地板
jcky001| | 2022-12-13 14:43 | 只看该作者
基于定时器捕获测量脉宽及占空比,你代码里涉及到的两种模式都可以,你根据情况来。具体就是资源及你对两种模式的理解。

使用特权

评论回复
5
tpgf| | 2023-1-3 10:34 | 只看该作者
这两个模式有什么具体的区别吗,仅看代码 模式2的好精简

使用特权

评论回复
6
nawu| | 2023-1-3 11:05 | 只看该作者
这两种方式的中断函数里边都有代码 但是第一个方式的代码太多了

使用特权

评论回复
7
aoyi| | 2023-1-3 11:13 | 只看该作者
主要是看楼主想要捕获的是pwm信号的哪个特征值了

使用特权

评论回复
8
zljiu| | 2023-1-3 11:22 | 只看该作者
楼主既想捕捉上升沿还想要捕捉下降沿是吗

使用特权

评论回复
9
gwsan| | 2023-1-3 11:52 | 只看该作者
可以仅仅设置为一个模式就是边沿触发吗

使用特权

评论回复
10
tfqi| | 2023-1-3 12:00 | 只看该作者
定时器可以自主计算pwm的占空比吗

使用特权

评论回复
11
MessageRing| | 2023-1-3 13:18 | 只看该作者
模式二比较精简

使用特权

评论回复
12
感觉模式2要比模式1简洁 ,除了这个优点,还有啥区别

使用特权

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

本版积分规则

658

主题

2751

帖子

0

粉丝