你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103VC 定时器和外部触发同步的问题

[复制链接]
cpev 提问时间:2018-1-16 17:32 /
阅读主题, 点击返回1楼
收藏 评论17 发布时间:2018-1-16 17:32
17个回答
cpev 回答时间:2018-1-16 19:40:04
Inc_brza 发表于 2018-1-16 19:14
输入捕获,不需要外部中断吧!

用Tim4 输入捕获,当捕捉到上升沿就清零计数器, 当计数器值大于30.当计数器大于30.5us时(16.384KHz的半个周期时间)就认为有故障 ?  
wenyangzeng 回答时间:2018-1-16 20:15:09
如果是定时器输入捕获,有ST官方的例程可参考:
InputCapture.rar (12.78 KB, 下载次数: 6)

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

Inc_brza 回答时间:2018-1-16 21:30:54
wenyangzeng 发表于 2018-1-16 19:33
我还是没弄明白你是要同步定时器还是要对外部脉冲进行计数?

都可以啊,上面不是说了吗
Inc_brza 回答时间:2018-1-16 21:36:30
cpev 发表于 2018-1-16 19:40
用Tim4 输入捕获,当捕捉到上升沿就清零计数器, 当计数器值大于30.当计数器大于30.5us时(16.384KHz的半 ...

怎么想的呀,高电平故障不是吗,那就是上升沿开始计数,下降沿复位计数,你可以设置超时中断,只要不超时(16.384Khz的半周期很容易算出来),所以只要超时了不就是有故障了吗,不过频繁中断会对cpu的消耗很大,所以要根据应用场景来看是否需要这么严格,从而设计一个比较宽裕的条件!
最靠谱和比较渐变的方法就是统计脉冲数呀,例如按照你16.384Khz,1s有多少个脉冲数是固定的呀,加入允许点误差,就前后加一点点,如果出现了故障,最后的脉冲数肯定不会是你定义的正常的脉冲数呀.

评分

参与人数 1蝴蝶豆 +5 收起 理由
zero99 + 5

查看全部评分

cpev 回答时间:2018-1-17 11:02:59
Inc_brza 发表于 2018-1-16 21:36
怎么想的呀,高电平故障不是吗,那就是上升沿开始计数,下降沿复位计数,你可以设置超时中断,只要不超时 ...

这样做:
Tim4_Init(void)
{                 GPIO_InitTypeDef GPIO_InitStructure;                TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;               
        TIM_ICInitTypeDef  TIM_ICInitStructure;       
        NVIC_InitTypeDef   NVIC_InitStructure;       

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);               
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
        GPIO_Init(GPIOB,&GPIO_InitStructure);  //Max17830 Alarm
               RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);                       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
        TIM_TimeBaseStructure.TIM_Prescaler = 71;       
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;       
        TIM_TimeBaseStructure.TIM_Period = 49999;       
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;        
        TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);
        TIM_ICInitStructure.TIM_Channel = TIM_Channel_4;         //选择输入端 IC4映射到TI4上
        TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_BothEdge;  //上升沿下降沿都捕获
        TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI4上
        TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;//配置输入分频,不分频
        TIM_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
          TIM_ICInit(TIM4, &TIM_ICInitStructure);       
        NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;       
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);       
        TIM_ITConfig(TIM4,TIM_IT_CC4,ENABLE);//允许CC4IE捕获中断               
        TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);//允许更新中断
        TIM_ClearITPendingBit(TIM4,TIM_IT_CC4);       
        TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
        TIM_Cmd(TIM4,ENABLE);
}
中断函数
void TIM4_IRQHandler(void)   
{  
   if(TIM_GetITStatus(TIM4,TIM_IT_CC4) != RESET)
   {
       TIM_SetCounter(TIM4,0);
       TIM_ClearITPendingBit(TIM4,TIM_IT_CC4);
   }

   if (TIM_GetITStatus(TIM4,TIM_IT_Update) != RESET)
   {      
      TIM_ClearITPendingBit(TIM4,TIM_IT_Update); //清除TIMx的中断待处理位:TIM 中断源
   }
}


main函数里判断
if(TIM_GetCounter(TIM4) >= 32)  //   (1/16.384KHz)/2= 30.517578125us
{
           AlarmFlag = 1;  //  故障标志
}



上升沿和下降沿都清零计数器,只要计数器大于32即认为有故障。但开启了溢出中断的话(TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE)),会频繁导致看门狗复位。
Inc_brza 回答时间:2018-1-17 11:13:13
cpev 发表于 2018-1-17 11:02
这样做:
Tim4_Init(void)
{                 GPIO_InitTypeDef GPIO_InitStructure;                TIM_TimeBaseInitT ...

中断太频繁了,对你的系统压力太大~
你用脉冲数统计法吧,这样得话你只需要格一段时间去轮询脉冲数就行了,记住溢出的时候也要处理一下(复位一下继续统计)
cpev 回答时间:2018-1-17 11:23:01
Inc_brza 发表于 2018-1-17 11:13
中断太频繁了,对你的系统压力太大~
你用脉冲数统计法吧,这样得话你只需要格一段时间去轮询脉冲数就行了 ...

1.为什么开启了定时器溢出中断,会导致看门狗频繁复位?
2 .脉冲统计法,没办法及时判断出吧,理论上说只要高电平持续的时间超过31us就认为是故障。
Inc_brza 回答时间:2018-1-17 15:01:49
cpev 发表于 2018-1-17 11:23
1.为什么开启了定时器溢出中断,会导致看门狗频繁复位?
2 .脉冲统计法,没办法及时判断出吧,理论上说只 ...

1、因为中断太频繁了,导致你没有机会运行主循环的代码就又进中断了,31us的中断太急了
2、按理论说是这样的,这个要根据你需求了
12

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版