OpenEdv-开源电子网

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

求支招,怎么根据方波来解析他的频率

[复制链接]

6

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2018-8-14
在线时间
8 小时
发表于 2018-8-21 19:47:42 | 显示全部楼层 |阅读模式
各位大大,我想根据方波把他的频率解析出来,怎样才能用程序实现啊
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

781

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3594
金钱
3594
注册时间
2017-3-7
在线时间
1564 小时
发表于 2018-8-21 20:03:25 | 显示全部楼层
回复 支持 反对

使用道具 举报

41

主题

243

帖子

0

精华

高级会员

Rank: 4

积分
523
金钱
523
注册时间
2016-1-11
在线时间
132 小时
发表于 2018-8-22 11:00:25 | 显示全部楼层
如果只是测频率有三种方法 ,中断加定时器,输入输入捕获,外部定时器模式。
回复 支持 反对

使用道具 举报

1

主题

882

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3070
金钱
3070
注册时间
2018-2-7
在线时间
285 小时
发表于 2018-8-23 09:17:14 | 显示全部楼层
检测高低电平时常,根据高低电平时间就可以计算周期,频率,占空比。
回复 支持 反对

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6778
金钱
6778
注册时间
2016-11-30
在线时间
595 小时
发表于 2018-8-23 09:21:15 | 显示全部楼层
http://www.openedv.com/forum.php ... d=275545&extra= 我的实现方法,可以参考一下
回复 支持 反对

使用道具 举报

6

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2018-8-14
在线时间
8 小时
 楼主| 发表于 2018-8-23 17:22:31 | 显示全部楼层
沧海 发表于 2018-8-22 11:00
如果只是测频率有三种方法 ,中断加定时器,输入输入捕获,外部定时器模式。

请问外部中断定时器来测时,我外部中断设置的是下降沿触发,我定时器该怎么设置呢,还是说我外部中断就可以直接计数,求具体的配置方法
回复 支持 反对

使用道具 举报

6

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2018-8-14
在线时间
8 小时
 楼主| 发表于 2018-8-23 18:20:55 | 显示全部楼层
lvkanger 发表于 2018-8-23 09:21
http://www.openedv.com/forum.php?mod=viewthread&tid=275545&extra= 我的实现方法,可以参考一下

我自己写了一个程序,你能帮我看看嘛

回复 支持 反对

使用道具 举报

6

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2018-8-14
在线时间
8 小时
 楼主| 发表于 2018-8-23 18:24:06 | 显示全部楼层
椰子皮djc 发表于 2018-8-23 18:20
我自己写了一个程序,你能帮我看看嘛

#include "exti.h"
#include "led.h"
#include "key.h"
#include "delay.h"
#include "usart.h"


u8 cnt=0;
u16  frequent;

void EXTIX_Init(void)
{

          EXTI_InitTypeDef EXTI_InitStructure;
          NVIC_InitTypeDef NVIC_InitStructure;
                GPIO_InitTypeDef GPIO_InitStructure;
          
       
           //¿aÆôGPIOoí1ü½Åê±Öó¸′óÃ
          RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);     //ía2¿ÖD¶Ï£¬Dèòaê1ÄüAFIOê±Öó
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);  

    //GPIOC.5 ÖD¶ÏÏßòÔ¼°ÖD¶Ï3õê¼»ˉÅäÖÃ
          GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource7);

          EXTI_InitStructure.EXTI_Line=EXTI_Line7;
          EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;       
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//ϽμÑØ′¥·¢
          EXTI_InitStructure.EXTI_LineCmd = ENABLE;
          EXTI_Init(&EXTI_InitStructure);                

   
               
                NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;                       
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;       
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;                                       
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                               
          NVIC_Init(&NVIC_InitStructure);

                GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;     
                GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;
                GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
                GPIO_Init(GPIOC,&GPIO_InitStructure);

}

void TIM_Init(u16 arr,u16 psc)                    {

  TIM_TimeBaseInitTypeDef  TIM_TimeBaseInitStructure;
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);

  TIM_TimeBaseInitStructure.TIM_ClockDivision=0;  
        TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
        TIM_TimeBaseInitStructure.TIM_Period=0xffff;
        TIM_TimeBaseInitStructure.TIM_Prescaler=0;   
       
  TIM_TimeBaseInit(TIM4 ,&TIM_TimeBaseInitStructure);

}


void TIM_IRQnHandler()
{
        if(TIM_GetITStatus(TIM4,TIM_IT_Update)!=RESET)
        {
                cnt=TIM_GetCounter(TIM4);       
                frequent=cnt;
                cnt=0;      
        }
}



void EXTI9_5_IRQHandler(void)
{               
               
        if(EXTI_GetITStatus(EXTI_Line7)==SET)
        {
                EXTI_ClearITPendingBit(EXTI_Line7);                       
                        if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)==Bit_RESET)      
                        {
                                cnt=TIM_GetCounter(TIM4);
                                cnt++;
                        }
        }
          
}

int main()
{
   if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)==Bit_RESET)
         {
                 printf("Frequent is %d",frequent);
         }
}










回复 支持 反对

使用道具 举报

6

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2018-8-14
在线时间
8 小时
 楼主| 发表于 2018-8-23 18:24:50 | 显示全部楼层
椰子皮djc 发表于 2018-8-23 18:24
#include "exti.h"
#include "led.h"
#include "key.h"

乱码的是注释部分
回复 支持 反对

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6778
金钱
6778
注册时间
2016-11-30
在线时间
595 小时
发表于 2018-8-24 08:57:23 | 显示全部楼层
椰子皮djc 发表于 2018-8-23 18:24
#include "exti.h"
#include "led.h"
#include "key.h"

你的设计思路是啥?下降沿产生中断,然后TIM计数中断次数?如果是这样,那么你的程序设计有问题。TIM计时的作用是为了计算标准的1s钟,TIM中断产生后,在TIM中断里边获取你的计数次数,这就是频率了。
回复 支持 反对

使用道具 举报

6

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2018-8-14
在线时间
8 小时
 楼主| 发表于 2018-8-24 09:21:48 | 显示全部楼层
lvkanger 发表于 2018-8-24 08:57
你的设计思路是啥?下降沿产生中断,然后TIM计数中断次数?如果是这样,那么你的程序设计有问题。TIM计时 ...

我想在1S内读取下降沿的个数,然后计算个数就是他的频率,,那么请问我的CNT应该怎么获取,才学32,有很多还不是蛮明白,谢谢指教
回复 支持 反对

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6778
金钱
6778
注册时间
2016-11-30
在线时间
595 小时
发表于 2018-8-24 15:29:02 | 显示全部楼层
椰子皮djc 发表于 2018-8-24 09:21
我想在1S内读取下降沿的个数,然后计算个数就是他的频率,,那么请问我的CNT应该怎么获取,才学32,有很多 ...

http://www.openedv.com/forum.php ... d=275545&extra= 这里用了两个定时器就实现了,TIM7用来计时1S去读TIM1的计数,TIM1的时钟设置为外部引脚输入(就是你的方波),这样TIM1的计数器就记下了下降沿的次数,TIM7只需要定时去读TIM1的cnt就可以了。
回复 支持 反对

使用道具 举报

6

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2018-8-14
在线时间
8 小时
 楼主| 发表于 2018-8-24 16:52:32 | 显示全部楼层
lvkanger 发表于 2018-8-24 15:29
http://www.openedv.com/forum.php?mod=viewthread&tid=275545&extra= 这里用了两个定时器就实现了,TIM7 ...

谢谢大哥,感觉豁然开朗,可以加个QQ 吗,方便技术交流
回复 支持 反对

使用道具 举报

41

主题

243

帖子

0

精华

高级会员

Rank: 4

积分
523
金钱
523
注册时间
2016-1-11
在线时间
132 小时
发表于 2018-8-24 20:42:18 | 显示全部楼层
椰子皮djc 发表于 2018-8-23 18:24
#include "exti.h"
#include "led.h"
#include "key.h"

你代码不对,怎么能获取定时器的计数值呢??这样你每次获取的最大值65535.
代码思路就是开1s定时然后在获取外部中断中的计数值就好了啊。很简单啊。
回复 支持 反对

使用道具 举报

41

主题

243

帖子

0

精华

高级会员

Rank: 4

积分
523
金钱
523
注册时间
2016-1-11
在线时间
132 小时
发表于 2018-8-24 20:44:37 | 显示全部楼层
椰子皮djc 发表于 2018-8-24 16:52
谢谢大哥,感觉豁然开朗,可以加个QQ 吗,方便技术交流

外部定时器计数模式适合测高频的
回复 支持 反对

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6778
金钱
6778
注册时间
2016-11-30
在线时间
595 小时
发表于 2018-8-25 12:22:30 | 显示全部楼层
椰子皮djc 发表于 2018-8-24 16:52
谢谢大哥,感觉豁然开朗,可以加个QQ 吗,方便技术交流

可以,不过我也是菜鸟一枚啊,哈哈!
回复 支持 反对

使用道具 举报

3

主题

312

帖子

0

精华

高级会员

Rank: 4

积分
904
金钱
904
注册时间
2011-10-19
在线时间
196 小时
发表于 2018-8-25 22:47:18 | 显示全部楼层
ST官方标准库的定时器例程有程序实现
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-4-19 16:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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