野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 15317|回复: 13

求助,stm32f103,定时器输入捕获

[复制链接]
发表于 2016-3-4 16:17:45 | 显示全部楼层 |阅读模式
求助,stm32定时器输入捕获通道3和通道4该如何配置,这是我参考的例程写的。将里面的通道和中断改为通道1便可以测量,但是通道4和3,测量结果总是乱跳???
void TIM_Configure()
{
        TIM_ICInitTypeDef TIM_ICInitngnj;
        TIM_TimeBaseInitTypeDef TIM_TimeBasevfv;
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
       
        TIM_TimeBasevfv.TIM_ClockDivision=0;
        TIM_TimeBasevfv.TIM_CounterMode=TIM_CounterMode_Up;
        TIM_TimeBasevfv.TIM_Period=0xffff;
        TIM_TimeBasevfv.TIM_Prescaler=71;
        TIM_TimeBaseInit(TIM3,&TIM_TimeBasevfv);
       
       
        TIM_ICInitngnj.TIM_Channel=TIM_Channel_4;
        TIM_ICInitngnj.TIM_ICFilter=0x0;
        TIM_ICInitngnj.TIM_ICPolarity=TIM_ICPolarity_Rising;
        TIM_ICInitngnj.TIM_ICPrescaler=TIM_ICPSC_DIV1;
        TIM_ICInitngnj.TIM_ICSelection=TIM_ICSelection_DirectTI;
        TIM_ICInit(TIM3,&TIM_ICInitngnj);
       
       
       
        TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);
        TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);
        TIM_SelectMasterSlaveMode(TIM3,TIM_MasterSlaveMode_Enable);
        TIM_Cmd(TIM3,ENABLE);
        TIM_ITConfig(TIM3,TIM_IT_CC4,ENABLE);
}

求大神指导???

回复

使用道具 举报

发表于 2016-3-4 16:47:10 | 显示全部楼层
看看板子的原理图,可能引脚被用到其它芯片干扰了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-4 19:58:42 | 显示全部楼层
有些资料说TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);
这一步有问题,对于通道3,应该配置为TIM_TS_TI3FP3,但是库函数里面没有这个定义
而且引脚似乎没有被其他引用???
回复 支持 反对

使用道具 举报

发表于 2016-3-4 20:32:07 | 显示全部楼层
单纯的stm32的输入捕获不要用
TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);
TIM_SelectMasterSlaveMode(TIM3,TIM_MasterSlaveMode_Enable);
这两句,这两句用在PWM输入模式的
而且,你到底是要用哪个通道?
如果只是单纯的想捕获PWM波形的占空比和频率,大可直接使用PWM输入模式,这样更简单,但是有不少的局限性。
起始PWM输入模式算是输入捕获模式的一种特例。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-4 22:00:59 | 显示全部楼层
我需要通道4,
我把你说的那两句屏蔽以后,还是不行的
因为要用到特定的引脚,所以就只能用特定的通道,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-5 07:18:37 | 显示全部楼层
有大神给点建议,或者例程,拜谢,拜谢
回复 支持 反对

使用道具 举报

发表于 2016-3-5 10:20:20 | 显示全部楼层
dkdkdk 发表于 2016-3-5 07:18
有大神给点建议,或者例程,拜谢,拜谢

你这例程有bug,你具体说一下,你想怎么使用,在这里你要区分清楚捕获通道和输入通道的区别。

捕获通道共有四个:IC1,IC2 ,IC3, IC4
输入通道也有四个:TIMx_CH1,TIMx_CH2,TIMx_CH3,TIMx_CH4

捕获通道IC1的信号可以从输入通道:TIMx_CH1,TIMx_CH2 这两个输入,当要把TIMx_CH1的信号输入到捕获通道IC1捕获的话,就选择:TIM_ICSelection_DirectTI,字面意思就是直连,如果要把TIMx_CH2的信号输入到捕获通道IC1捕获的话,就选择:TIM_ICSelection_IndirectTI,字面意思就是不直连。

剩下的三个捕获通道同理,看功能框图即可。


123.jpg
如果你只是使用一个输入通道到捕获通道,那么只需要初始化ICInitStructure这个结构体即可,不用再调用TIM_SelectInputTrigger()这个库函数来选择触发信号,因为信号只有一路,默认就是那一路触发。

TIM_SelectSlaveMode();
TIM_SelectMasterSlaveMode();
这两个库函数是用在PWM输入模式下的,是从模式的复位模式,作用是当捕获到PWM第一个要捕获的边沿的时候复位计数器,单单使用一个捕获通道的时候不需要这两个库函数。

---------------------------------------分割线--------------------------------------------------------
如果你要使用输入通道4,且用捕获通道4来捕获输入通道4的信号,你只要这样配置即可
// 选择捕获通道4:IC4,即捕获的值会存在CCR4中
TIM_ICInitngnj.TIM_Channel=TIM_Channel_4;
TIM_ICInitngnj.TIM_ICFilter=0x0;
TIM_ICInitngnj.TIM_ICPolarity=TIM_ICPolarity_Rising;
TIM_ICInitngnj.TIM_ICPrescaler=TIM_ICPSC_DIV1;
// 这里选择直连,即选定了捕获通道的信号来自输入通道4
TIM_ICInitngnj.TIM_ICSelection=TIM_ICSelection_DirectTI;
TIM_ICInit(TIM3,&TIM_ICInitngnj);         
        
// 因为不是PWM输入模式,这三个都不需要        
//TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);
//TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);
//TIM_SelectMasterSlaveMode(TIM3,TIM_MasterSlaveMode_Enable);

// 使能定时器,计数器开始计数
TIM_Cmd(TIM3,ENABLE);
// 捕获到上升沿进入中断
TIM_ITConfig(TIM3,TIM_IT_CC4,ENABLE);

回复 支持 反对

使用道具 举报

发表于 2016-3-5 10:24:18 | 显示全部楼层
dkdkdk 发表于 2016-3-4 19:58
有些资料说TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);
这一步有问题,对于通道3,应该配置为TIM_TS_TI3 ...

如果不是PWM输入模式,不需要调用TIM_SelectInputTrigger这个函数
回复 支持 反对

使用道具 举报

发表于 2016-3-5 10:25:30 | 显示全部楼层
qiuzhiqian 发表于 2016-3-4 20:32
单纯的stm32的输入捕获不要用
TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);
TIM_SelectMasterSlaveMo ...

如果不是PWM输入的话,TIM_SelectInputTrigger这个也是不需要的
回复 支持 反对

使用道具 举报

发表于 2016-3-5 10:30:31 | 显示全部楼层
还有你这两个变量的定义:        
TIM_ICInitTypeDef TIM_ICInitngnj;
TIM_TimeBaseInitTypeDef TIM_TimeBasevfv;

让人看了很不舒服,虽然从语法上来说没有错,但你应该用最大众的方法,让别人一看你的程序就看的明白
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_ICInitTypeDef             TIM_ICInitStructure;
这样定义才是最适合的
回复 支持 反对

使用道具 举报

发表于 2016-3-5 10:31:40 | 显示全部楼层
dkdkdk 发表于 2016-3-5 07:18
有大神给点建议,或者例程,拜谢,拜谢

把你的中断服务程序也贴上来,把IO配置的那一部分也贴上来,也说明你用的输入通道是哪一个IO。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-5 14:54:34 | 显示全部楼层
void GPIO_Configure()
{
        GPIO_InitTypeDef GPIO_InitTyfff;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
        GPIO_InitTyfff.GPIO_Mode=GPIO_Mode_IN_FLOATING;
        GPIO_InitTyfff.GPIO_Pin=GPIO_Pin_1;
        GPIO_Init(GPIOB,&GPIO_InitTyfff);  //通道4的io口设置
}

void TIM_Configure()
{
        TIM_ICInitTypeDef TIM_ICInitSructure;
        TIM_TimeBaseInitTypeDef TIM_TimeBaseSructure;
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
       
        TIM_TimeBaseSructure.TIM_ClockDivision=0;
        TIM_TimeBaseSructure.TIM_CounterMode=TIM_CounterMode_Up;
        TIM_TimeBaseSructure.TIM_Period=0xffff;
        TIM_TimeBaseSructure.TIM_Prescaler=71;
        TIM_TimeBaseInit(TIM3,&TIM_TimeBaseSructure);
       
       
        TIM_ICInitSructure.TIM_Channel=TIM_Channel_4;
        TIM_ICInitSructure.TIM_ICFilter=0x0;
        TIM_ICInitSructure.TIM_ICPolarity=TIM_ICPolarity_Rising;
        TIM_ICInitSructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;
        TIM_ICInitSructure.TIM_ICSelection=TIM_ICSelection_DirectTI;
        TIM_ICInit(TIM3,&TIM_ICInitSructure);
       
       
       
//TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);
//TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);
//TIM_SelectMasterSlaveMode(TIM3,TIM_MasterSlaveMode_Enable);
        TIM_Cmd(TIM3,ENABLE);
        TIM_ITConfig(TIM3,TIM_IT_CC4,ENABLE);
}

void NVIC_Configure()
{
        NVIC_InitTypeDef NVIC_Inijj;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
        NVIC_Inijj.NVIC_IRQChannel=TIM3_IRQn;
        NVIC_Inijj.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Inijj.NVIC_IRQChannelPreemptionPriority=0;
        NVIC_Inijj.NVIC_IRQChannelSubPriority=0;
        NVIC_Init(&NVIC_Inijj);
}
void TIM3_IRQHandler(void)
{
        if(TIM_GetITStatus(TIM3,TIM_IT_CC4)!=0)
        {
                TIM_ClearITPendingBit(TIM3,TIM_IT_CC4);
                Read=TIM_GetCapture4(TIM3)*2;
                Frequence=1000000/Read;
        }
}


我屏蔽了那三句,可是数据还是不对!!!
上面是引脚配置,中断配置,麻烦了!!!
回复 支持 反对

使用道具 举报

发表于 2016-3-5 16:04:07 | 显示全部楼层
dkdkdk 发表于 2016-3-5 14:54
void GPIO_Configure()
{
        GPIO_InitTypeDef GPIO_InitTyfff;

配置没看出什么问题,就是中断函数我看不懂,为什么要*2
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-5 16:57:49 | 显示全部楼层
*2只是为了得到一个倍数,
如果配置没问题,那会是哪的问题呢???,
我尝试用定时器2,及其相应的通道3也不行
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-9-21 02:47 , Processed in 0.037764 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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