OpenEdv-开源电子网

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

F030 输入捕捉,为什么捕捉值总是感觉不对。产生的PWM是1KHZ的。

[复制链接]

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2016-7-20
在线时间
42 小时
发表于 2016-8-3 15:53:39 | 显示全部楼层 |阅读模式
1金钱

GQ_030_UART_IN_8.rar

4.2 MB, 下载次数: 147

最佳答案

查看完整内容[请看2#楼]

CNT一直是1,不会吧。你的定时器没有正常计数么。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-8-3 15:53:40 | 显示全部楼层
CNT一直是1,不会吧。你的定时器没有正常计数么。
回复

使用道具 举报

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2016-7-20
在线时间
42 小时
 楼主| 发表于 2016-8-3 16:00:39 | 显示全部楼层
#include"stm32f0xx.h"
#include"inputc.h"
uint32_t INPUTC_flag;
uint32_t Frequency;
/***************************TIME143õê¼»ˉoˉêy***************************/
void TIM16_INPUTC_Init(uint16_t czz ,uint16_t psc)
{       
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure ;                                                                                        //¶¨òå¶¨ê±Æ÷ÖD¶Ï½á11ìå
        TIM_ICInitTypeDef TIM_ICInitStructure;                                                                                                                        //¶¨òå¶¨ê±Æ÷ģ꽽á11ìå
        GPIO_InitTypeDef GPIO_InitStructure;                                                                                                                                //¶¨òåGPIO½á11ìå
        NVIC_InitTypeDef NVIC_InitStructure ;               
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM16,ENABLE);                                                                //ê1ÄüAPB2×üÏßTIM16ê±Öó                               
        RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOA, ENABLE);                                                                 //ê1ÄüGPIOê±Öó  
  /************************** ÅäÖÃGPIO1ü½Å¸′óÃ**************************/
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_5);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  //GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
  GPIO_Init(GPIOA, &GPIO_InitStructure);                                                               
  //GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_5);                                                                //PA6¸′óÃíÆíìêä3ö£¬¸′óÃAF5       
        /****************************3õê¼»ˉTIM16******************************/               
        TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;                                                                //TIM16·ÖÆμêyÎa1·ÖÆμ£¨2»·ÖÆμ£©
        TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;                                                //TIM16ÏòéϼÆêy
        TIM_TimeBaseStructure.TIM_Period=czz;                                                                                                                                //TIM16CZZ¸öÖüÆú¡¢¶¨ê±Æ÷ÆμÂ꣨ê±ÖóÆμÂê/CZZ£©
        TIM_TimeBaseStructure.TIM_Prescaler=psc;                                                                                                                        //TIM16Ô¤·ÖÆμ£¨2»·ÖÆμ£©
        TIM_TimeBaseStructure.TIM_RepetitionCounter=0;                                                                                        //TIM16ÖØ¸′¼ÆêyÖüÆúÎa0£¨2»Öظ′¼Æêy£©
        TIM_TimeBaseInit(TIM16,&TIM_TimeBaseStructure);                                                                                        //3õê¼»ˉTIM16
/*************************TIM16 INPUTCÄ£ê½3õê¼»ˉ****************************/
        TIM_ICInitStructure.TIM_Channel=TIM_Channel_1;
        TIM_ICInitStructure.TIM_ICFilter=0;
        TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;
        TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;
        TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;
        TIM_ICInit(TIM16,&TIM_ICInitStructure);
        TIM_ITConfig(TIM16,TIM_IT_CC1,ENABLE);
        TIM_Cmd(TIM16,ENABLE);
/**********************************************************************/       
/************************3õê¼»ˉNVIC¼Ä′æÆ÷2Îêy**************************/
/**********************************************************************/       
        NVIC_InitStructure.NVIC_IRQChannel=TIM16_IRQn;                                                                                                //ê1Äü′®¿úÖD¶ÏËùÔúμÄí¨μࣨ′æÔúóú"stm32f0xx.h"£©                                                               
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;                                                                                                        //ê1Äü′®¿úÖD¶Ïí¨μà                                       
        NVIC_InitStructure.NVIC_IRQChannelPriority=3;                                                                                                        //ÖD¶ÏóÅÏè¼¶3
        NVIC_Init(&NVIC_InitStructure);                                                                                                                                                                //ê1ÄüTIM16ÖD¶Ï
}

void TIM16_IRQHandler(void)
{

   if(TIM_GetITStatus(TIM16,TIM_IT_CC1)!=RESET)
         {
                        TIM_ClearITPendingBit(TIM16,TIM_IT_CC1);
                        INPUTC_flag=TIM_GetCapture1(TIM16);
                        Frequency=1000000/INPUTC_flag;
                 
                }
          
}
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11544
金钱
11544
注册时间
2014-4-1
在线时间
1315 小时
发表于 2016-8-3 16:03:12 | 显示全部楼层

说说怎么“不对”。


回复

使用道具 举报

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2016-7-20
在线时间
42 小时
 楼主| 发表于 2016-8-3 16:04:52 | 显示全部楼层
串口出来的结果
030.jpg
回复

使用道具 举报

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2016-7-20
在线时间
42 小时
 楼主| 发表于 2016-8-3 16:07:50 | 显示全部楼层
INPUTC_flag=TIM_GetCapture1(TIM16);好像这个值根本就没有。。而且每次我重新点一次按键一其实PWM频率是没变的。为什么串口出来的值还会变?
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11544
金钱
11544
注册时间
2014-4-1
在线时间
1315 小时
发表于 2016-8-3 16:14:53 | 显示全部楼层
分清物理过程,先捕获,然后串口输出,
捕获中断是两个过程的结合部。

在中断里设断点,或者把捕获数据临时保存下来,
如果数据确实有变化,问题在前面,捕获部分;
如果数据没变化,说明问题在后面。

回复

使用道具 举报

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2016-7-20
在线时间
42 小时
 楼主| 发表于 2016-8-3 16:15:20 | 显示全部楼层
xuande 发表于 2016-8-3 16:03
说说怎么“不对”。

输入捕捉我用的PA6.复用AF5  PWM是PA2
回复

使用道具 举报

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2016-7-20
在线时间
42 小时
 楼主| 发表于 2016-8-3 16:16:30 | 显示全部楼层
xuande 发表于 2016-8-3 16:14
分清物理过程,先捕获,然后串口输出,
捕获中断是两个过程的结合部。

好的。我再检查检查
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-8-3 16:44:53 | 显示全部楼层
我用030的Tim3弄过,是可以的,你硬件调试,看看能不能进去捕获中断,连着捕获2次,看看值对不对
回复

使用道具 举报

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2016-7-20
在线时间
42 小时
 楼主| 发表于 2016-8-3 17:12:29 | 显示全部楼层
憨厚诚实大叔 发表于 2016-8-3 16:44
我用030的Tim3弄过,是可以的,你硬件调试,看看能不能进去捕获中断,连着捕获2次,看看值对不对

我用的硬件调试的。。也中断了。PWM控制LED1 。我在捕获中断的时间让一个LED2变换了状态。LED2的周期刚好是PWM周期的一半。每次上升沿也都捕捉到了。。为什么这个值就是不正确。
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-8-3 17:29:12 | 显示全部楼层
预分频多少,2次CNT的差值多少。用示波器看过波形了么
回复

使用道具 举报

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2016-7-20
在线时间
42 小时
 楼主| 发表于 2016-8-3 17:40:00 | 显示全部楼层
憨厚诚实大叔 发表于 2016-8-3 17:29
预分频多少,2次CNT的差值多少。用示波器看过波形了么

预分频是0,波形是正常的。PWM输出的是1K赫兹占空比80%,输入捕捉中断的频率是500赫兹。刚看到TIM_GetCapture1(TIM16)的值一直都是0.。。
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-8-3 17:43:08 | 显示全部楼层
Blyss89 发表于 2016-8-3 17:40
预分频是0,波形是正常的。PWM输出的是1K赫兹占空比80%,输入捕捉中断的频率是500赫兹。刚看到TIM_GetCap ...

你可以换成在中断直接读CNT的值试试。
回复

使用道具 举报

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2016-7-20
在线时间
42 小时
 楼主| 发表于 2016-8-3 17:48:10 | 显示全部楼层
憨厚诚实大叔 发表于 2016-8-3 17:43
你可以换成在中断直接读CNT的值试试。

嗯。我原来是用的CCR1的值。。我刚读CNT。一直都是1。
回复

使用道具 举报

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2016-7-20
在线时间
42 小时
 楼主| 发表于 2016-8-4 09:27:17 | 显示全部楼层
憨厚诚实大叔 发表于 2016-8-3 17:54
CNT一直是1,不会吧。你的定时器没有正常计数么。

感觉就是计数不正常。上升沿捕捉都是正常的。。
回复

使用道具 举报

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2016-7-20
在线时间
42 小时
 楼主| 发表于 2016-8-9 14:02:20 | 显示全部楼层
憨厚诚实大叔 发表于 2016-8-3 17:43
你可以换成在中断直接读CNT的值试试。

目前10K以上不正常。以下都是正常的。多谢指导。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 08:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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