OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3955|回复: 12

STM32F103RCT6捕获外部上升沿异常,求助大佬!

[复制链接]

5

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
445
金钱
445
注册时间
2019-1-29
在线时间
101 小时
发表于 2020-11-5 17:18:07 | 显示全部楼层 |阅读模式
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

821

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3369
金钱
3369
注册时间
2011-11-10
在线时间
207 小时
发表于 2020-11-5 21:49:58 | 显示全部楼层
发生了什么异常?捕获不到?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2020-11-6 01:24:50 | 显示全部楼层
加入滤波看看,另外,看看信号波形吧
回复

使用道具 举报

5

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
445
金钱
445
注册时间
2019-1-29
在线时间
101 小时
 楼主| 发表于 2020-11-6 10:51:53 | 显示全部楼层

TIM8的通道1捕获外部信号(信号发生器,20Hz,脉宽5ms),捕获到以后使TIM8复位,通道二输出20Hz,5ms的PWM,TIM8部分代码如下:


void TIM8_benzhen_Init(u16 arr,u16 psc)
{  
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
        TIM_ICInitTypeDef  TIM_ICInitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);    //使能定时器8
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);  //使能GPIO外设时钟使能
       
        //外部时钟接口
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //TIM8_CH1
        GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IN_FLOATING;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOC, &GPIO_InitStructure);
       
        //本振使能信号
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //TIM8_CH2
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOC, &GPIO_InitStructure);
       
        //多台电源信号同步输出,此信号与CH2相同
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //TIM8_CH3
        GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOC, &GPIO_InitStructure);
                                                                                    
        TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;//配置为通道1检测
        TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;//配置为上升沿检测
        TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//选择输入端 IC1映射到TI1上
        TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;//分频数
        TIM_ICInitStructure.TIM_ICFilter = 0x03;  //8个定时器时钟周期滤波
        TIM_ICInit(TIM8, &TIM_ICInitStructure);
        TIM_SelectInputTrigger(TIM8, TIM_TS_TI1FP1);//TI1的上升沿检测(外部时钟触发)
               
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值       
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;   //注意,TIM8是高级定时器,必须加这一句才能进中断函数       
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
        TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
        TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
        TIM_OC2Init(TIM8, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
       
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
        TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
        TIM_OC3Init(TIM8, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
       
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Active;
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable; //不用输出PWM
        TIM_OCInitStructure.TIM_Pulse =0;  //设置待装入捕获比较寄存器的脉冲值,占空比初始化为0              
        TIM_OC4Init(TIM8,&TIM_OCInitStructure);
        TIM_SelectOutputTrigger(TIM8,TIM_TRGOSource_OC4Ref); //设置TIM8 CH4作为触发源,去触发TIM5

  TIM_CtrlPWMOutputs(TIM8,ENABLE);        //MOE 主输出使能       

        TIM_OC2PreloadConfig(TIM8, TIM_OCPreload_Enable);  //CH2预装载使能
        TIM_OC3PreloadConfig(TIM8, TIM_OCPreload_Enable);  //CH3预装载使能         
        TIM_OC4PreloadConfig(TIM8, TIM_OCPreload_Enable);  //CH4预装载使能
       
        TIM_ARRPreloadConfig(TIM8, ENABLE); //使能TIMx在ARR上的预装载寄存器
       
        TIM_Cmd(TIM8, ENABLE);  //使能TIM8
                          
        TIM_SelectSlaveMode(TIM8, TIM_SlaveMode_Reset);             //工作于触发模式下
        TIM_SelectMasterSlaveMode(TIM8, TIM_MasterSlaveMode_Enable);//使能主从模式       
   
}
回复

使用道具 举报

5

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
445
金钱
445
注册时间
2019-1-29
在线时间
101 小时
 楼主| 发表于 2020-11-6 10:56:30 | 显示全部楼层
实际波形信号如下:绿色为外部信号,黄色为TIM8的通道二输出信号。讲道理,黄色信号应该与绿色信号同步的,即两者上升沿一致,但不知为啥,黄色信号跑到绿色信号左边了。
C:\Users\liuqiang\Desktop\a30f327cd254e42902e8e30a99274b6.jpg
a30f327cd254e42902e8e30a99274b6.jpg
回复

使用道具 举报

5

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
445
金钱
445
注册时间
2019-1-29
在线时间
101 小时
 楼主| 发表于 2020-11-6 10:58:02 | 显示全部楼层
正点原子 发表于 2020-11-6 01:24
加入滤波看看,另外,看看信号波形吧

原子哥,不知道为啥我昨天发的帖子内容没了,具体描述见楼下
回复

使用道具 举报

5

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
445
金钱
445
注册时间
2019-1-29
在线时间
101 小时
 楼主| 发表于 2020-11-6 10:58:29 | 显示全部楼层
c2007s 发表于 2020-11-5 21:49
发生了什么异常?捕获不到?

具体情况请大佬见楼下描述
回复

使用道具 举报

5

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
445
金钱
445
注册时间
2019-1-29
在线时间
101 小时
 楼主| 发表于 2020-11-6 11:03:03 | 显示全部楼层
我测试了单片机引脚上的信号,PC6(TIM8通道1)上的信号确实与外部信号一致,即给单片机的信号是对的。然后单片机PC7(TIM8通道2)输出的信号确实与外部信号没有同步,过了单片机输出的信号错误了。
波形图如下:绿色为外部信号,蓝色为PC6上的信号,黄色为PC7上的信号。
bf0b89ef2e58d4105883db51e094a9e.jpg
回复

使用道具 举报

5

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
445
金钱
445
注册时间
2019-1-29
在线时间
101 小时
 楼主| 发表于 2020-11-6 11:06:39 | 显示全部楼层
我用另一块单片机作为信号发生器,然后发现TIM8的通道2信号与外部信号又同步了。
波形如下:绿色为外部信号,蓝色为PC6上的信号,黄色为PC7上的信号。


fb7a70a81ec87d6b089740e941def1e.jpg
回复

使用道具 举报

3

主题

821

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3369
金钱
3369
注册时间
2011-11-10
在线时间
207 小时
发表于 2020-11-7 11:42:12 | 显示全部楼层
这么诡异的情况估计是示波器问题了。
回复

使用道具 举报

5

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
445
金钱
445
注册时间
2019-1-29
在线时间
101 小时
 楼主| 发表于 2020-11-8 10:51:05 | 显示全部楼层
c2007s 发表于 2020-11-7 11:42
这么诡异的情况估计是示波器问题了。

应该不是示波器的问题
回复

使用道具 举报

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
138
金钱
138
注册时间
2020-5-28
在线时间
39 小时
发表于 2020-11-8 12:18:29 | 显示全部楼层
你是信号输出是不是得滤波一下什么的,你换个单片机肯定就是硬件问题,是不是信号受到干扰什么的
回复

使用道具 举报

5

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
445
金钱
445
注册时间
2019-1-29
在线时间
101 小时
 楼主| 发表于 2020-11-11 08:50:18 | 显示全部楼层
樂活美日 发表于 2020-11-8 12:18
你是信号输出是不是得滤波一下什么的,你换个单片机肯定就是硬件问题,是不是信号受到干扰什么的

同样的板子,同样的程序,我把TIM8第二通道输出信号改为1KHz的PWM,就正常捕获了。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 18:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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