OpenEdv-开源电子网

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

新手求助关于低频测试问题

[复制链接]

9

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2013-8-15
在线时间
0 小时
发表于 2013-8-23 21:08:28 | 显示全部楼层 |阅读模式
还是新手,最近在研究定时器,想通过定时器的输入捕获功能测得0.5 到2500 Hz 的频率。但是频率比较小的时候就不对了,这应该是计数器溢出的原因。
我现在就使搞不懂要怎么设置才能准确测出上面说的功率范围了,希望大家不吝赐教,女汉纸谢谢大家了
 
问题解决了,对于低频信号的测量,用输入捕获可以实现,并且测试结果非常准确。
关键是要进行脉冲中断和计数器溢出中断处理
钟声咣咣响,乌鸦嘎嘎叫
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

38

主题

2061

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
发表于 2013-8-23 23:32:46 | 显示全部楼层
计数器溢出可以设变量再分频滴。。。
站在巨人的肩膀上不断的前进。。。
回复 支持 反对

使用道具 举报

9

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2013-8-15
在线时间
0 小时
 楼主| 发表于 2013-8-26 03:22:23 | 显示全部楼层
木人知道么?
钟声咣咣响,乌鸦嘎嘎叫
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-26 10:29:47 | 显示全部楼层
用外部计数模式,妥妥的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

9

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2013-8-15
在线时间
0 小时
 楼主| 发表于 2013-8-26 15:52:37 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
原子哥,外部计数我这已经没问题了,那计数时间咋算?没时间没法算频率阿
笨死我算了。。。。
钟声咣咣响,乌鸦嘎嘎叫
回复 支持 反对

使用道具 举报

9

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2013-8-15
在线时间
0 小时
 楼主| 发表于 2013-8-26 16:51:11 | 显示全部楼层
 刚刚把计数模式下计数器溢出问题解决了,瞬间感觉重生了。感觉就是模糊理解加胡编滥造竟然出来了,唉。
网上信息又多又杂,像我这种新手,看完就一个字,晕!!!
呼唤原子哥,教教我咋用计数模式算频率,解救我这个猪脑子

钟声咣咣响,乌鸦嘎嘎叫
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-26 18:45:45 | 显示全部楼层
回复【6楼】周小猫:
---------------------------------
计数器A+另外一个定时器B,联合测试频率。
最简单的办法:
1,某个时刻,B开始定时,同时A开始计数。
2,B定时1秒钟进入中断,此时停止A计数,并获取A的计数值。
3,这个计数值就是信号的频率。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

9

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2013-8-15
在线时间
0 小时
 楼主| 发表于 2013-8-27 17:21:06 | 显示全部楼层

原子哥,因为要测设很多路信号,所以决定用输入捕获测频率,不用计数模式了。为了结果更精确,不打算用太大的分频系数,所以这样对于较小的频率来说计数器就会溢出了,所以我打算对定时器3采取两个中断处理,一个是信号捕获到上升沿时的中断,一个是计数器溢出时候的中断,溢出中断处理溢出次数再用来最后获得32位的计数器的值,下面是我的程序,麻烦原子哥看看,问题出在哪?现在中断都进不去了

void Tim3_Configuration(void)
{

/* TIM3 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 使能时钟

/* GPIOA clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

/* TIM3 channel 1 pin (PA.06) configuration */
GPIO_InitTypeDef GPIO_InitStructure; // GPIO 设置

GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

NVIC_InitTypeDef NVIC_InitStructure;

/* Enable the TIM3 global Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

TIM_ICInitTypeDef TIM_ICInitStructure;

TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0x0;

TIM_ICInit(TIM3, &TIM_ICInitStructure);

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;


TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
TIM_TimeBaseStructure.TIM_Prescaler = 0x00;
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

//TIM_PrescalerConfig(TIM3, 287, TIM_PSCReloadMode_Immediate);

/* Enable the CC1 Interrupt Request */
TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE); // 使能TIM3 通道1上升沿中断

/* Enable the Overflow Interrupt Request */
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); // 使能TIM3 定时器溢出中断

/* TIM enable counter */
TIM_Cmd(TIM3, ENABLE);
}


下面是两个中断函数


void TIM3_IRQHandler_Impuls(void)

{
 static  UINT32 _ui32tim3_ic1 = 0, _ui32tim3_ic2 = 0;
 static  UINT8 _ui8capture_mark = 0;
 static  UINT32 _ui32capture_wert = 0;

 if(TIM_GetITStatus(TIM3, TIM_IT_CC1) == SET)
   {
     /* Clear TIM3 Capture compare interrupt pending bit */
     TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);
     if(_ui8capture_mark == 0)
     {
       /* Get the Input Capture value */
      _ui32tim3_ic1 = TIM_GetCapture1(TIM3); // 第一个上升沿捕获到的计数器的值
      _ui8capture_mark = 1;
     }
     else if(_ui8capture_mark == 1)
     {
       /* Get the Input Capture value */
      _ui32tim3_ic2 = TIM_GetCapture1(TIM3); // 第二个上升沿捕获到的计数器的值

       /* Capture computation */
       if (0 == ui16TIM3_overflow) // 无计数器溢出
       {
        _ui32capture_wert = (_ui32tim3_ic2 - _ui32tim3_ic1);
       }
       else // 计数器溢出
       {
        _ui32capture_wert = ((0xFFFF*ui16TIM3_overflow - _ui32tim3_ic1) + _ui32tim3_ic2);
       }
       /* Frequency computation */
       fl32TIM3Freq = (UINT32) SystemCoreClock / _ui32capture_wert; // 计算信号频率

       _ui8capture_mark = 0;
     }
   }
}
void TIM3_IRQHandler_Overflow(void)
{

    if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)
 {

 ui16TIM3_overflow++; // 计算中断次数

 TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
 }
}

钟声咣咣响,乌鸦嘎嘎叫
回复 支持 反对

使用道具 举报

9

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2013-8-15
在线时间
0 小时
 楼主| 发表于 2013-8-27 17:29:28 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
原子哥帮忙看看上面的程序,谢谢!!!
钟声咣咣响,乌鸦嘎嘎叫
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-27 18:16:12 | 显示全部楼层
自己调试。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-14 05:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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