OpenEdv-开源电子网

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

STM32 TIMER 频率计问题请教

[复制链接]

2

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2012-2-20
在线时间
0 小时
发表于 2012-5-16 10:55:30 | 显示全部楼层 |阅读模式

原子大哥最近用STM32作频率计 但是读出来的计数值不对啊 您看看问题出在那
void PINLV_Init(void)//(u16 arr,u16 psc)
{
 //此部分需手动修改IO 口设置
 RCC->APB1ENR|=1<<2; //TIM4 时钟使能
 RCC->APB2ENR|=1<<3; //PB 口时钟使能PB6
 
 GPIOB->CRL&=0XF0FFFFFF;//PB6 输出
 GPIOB->CRL|=0X04000000;//复用功能输入
 GPIOB->ODR|=1<<6;   //PB6 上拉
 
 TIM4->SMCR|=0x00D6;//MSM=1 主/从模式TS=101触发选择SMS=110触发模式

 TIM4->CCMR1|=1<<0;     //CC1通道被配置为输入,IC1映射在TI1上 CH1 输入捕获模式
 TIM4->CCMR1|=3<<4;    //IC1F=0011配置输入滤波器
 TIM4->CCER&=0XFFFFFFFD;     //CC1P置0,上升沿触发
 TIM4->CCMR1&=0XFFFFFFF3;     //IC1PS=00,预分频禁止
 TIM4->CCER|=1<<0;     //CC1E置1,允许捕获计数器的值到捕获寄存器中
 
 TIM4->DIER|=1<<1;   //允许更新捕获中断

 TIM4->CR1|=0x01; //使能定时器4
 MY_NVIC_Init(1,3,TIM4_IRQChannel,2);//抢占1,子优先级3,组2
}


中断服务函数
void TIM4_IRQHandler(void)
{
  CAPi=TIM4->CCR1;//读取CCR1也可以清CC1IF标志位
 TIM4->SR&=0XFFFFFFFD;//清除中断标志位
 TIM4->DIER&=0XFFFFFFFD;   //禁止更新捕获中断

 TIM4->CR1&=0XFFFE; //禁止定时器4
}

我在采集同频率时每次的CAPi的值采出来都不同

生活就是 漂泊不定 一直寻找那甜美的港湾
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-5-16 13:37:56 | 显示全部楼层
http://www.openedv.com/posts/list/3001.htm
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2012-2-20
在线时间
0 小时
 楼主| 发表于 2012-5-16 14:30:05 | 显示全部楼层
原子大哥 我用“分享定时器输入捕获程序,直接操作寄存器(看手册配置成功)”的办法进行输入捕获 但是采样的 TIM4->CCR1变化太大了 
生活就是 漂泊不定 一直寻找那甜美的港湾
回复 支持 反对

使用道具 举报

2

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2012-2-20
在线时间
0 小时
 楼主| 发表于 2012-5-16 14:32:09 | 显示全部楼层
这是输入捕获函数
void INLV_Init(u16 arr,u16 psc)
{
//此部分需手动修改IO 口设置
RCC->APB2ENR|=1<<0;    //辅助功能IO时钟开始 AFIOEN 使能
RCC->APB1ENR|=1<<2; //TIM4 时钟使能
RCC->APB2ENR|=1<<3; //PB 口时钟使能PB6

TIM4->ARR=arr;//设定计数器自动重装值刚好1ms
TIM4->SC=psc;//预分频器

GPIOB->CRL&=0XF0FFFFFF;//PB6 输出
GPIOB->CRL|=0X04000000;//复用功能输入
GPIOB->ODR|=1<<6;   //PB6 上拉


TIM4->SMCR|=0x00D4;//MSM=1 主/从模式TS=101触发选择SMS=100触发模式

TIM4->CCMR1|=1<<0;     //CC1通道被配置为输入,IC1映射在TI1上 CH1 输入捕获模式
TIM4->CCMR1|=3<<4;    //IC1F=0011配置输入滤波器
TIM4->CCER&=0XFFFFFFFD;     //CC1P置0,上升沿触发
TIM4->CCMR1&=0XFFFFFFF3;     //IC1PS=00,预分频禁止
TIM4->CCER|=1<<0;     //CC1E置1,允许捕获计数器的值到捕获寄存器中

TIM4->DIER|=1<<1;   //允许更新捕获中断

TIM4->CR1|=0x01; //使能定时器4
MY_NVIC_Init(1,3,TIM4_IRQChannel,2);//抢占1,子优先级3,组2
}
主程序中
PINLV_Init(2000,72-1);
中断处理函数中
void TIM4_IRQHandler(void)
{
CAPi = TIM4->CCR1;//读取CCR1也可以清CC1IF标志位
TIM4->SR&=0XFFFFFFFD;//清除中断标志位
}

生活就是 漂泊不定 一直寻找那甜美的港湾
回复 支持 反对

使用道具 举报

2

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2012-2-20
在线时间
0 小时
 楼主| 发表于 2012-5-16 14:34:29 | 显示全部楼层
我给PB6端口用信号发生器给固定的信号70KHz的信号

但是中断处理函数中的CAPi = TIM4->CCR1;变化太大了能从27变化到881。是不是有地方出错了。
生活就是 漂泊不定 一直寻找那甜美的港湾
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-5-16 15:25:21 | 显示全部楼层
确保你的波形无问题先吧。示波器看看。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2012-2-20
在线时间
0 小时
 楼主| 发表于 2012-5-16 15:47:33 | 显示全部楼层
在加载频率之前 我都是通过示波器看过了的啊 
生活就是 漂泊不定 一直寻找那甜美的港湾
回复 支持 反对

使用道具 举报

2

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2012-2-20
在线时间
0 小时
 楼主| 发表于 2012-5-16 15:57:34 | 显示全部楼层
现在我的示波器就加在信号发生器上面的 频率是稳定的 但是采样出来的值变化太大了CAPi = TIM4->CCR1   这样算出来的频率根本不准
生活就是 漂泊不定 一直寻找那甜美的港湾
回复 支持 反对

使用道具 举报

2

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2012-2-20
在线时间
0 小时
 楼主| 发表于 2012-5-16 16:12:26 | 显示全部楼层
当我把输出频率调到32KHz时CAPi = TIM4->CCR1值竟然能从28变化到1559   
生活就是 漂泊不定 一直寻找那甜美的港湾
回复 支持 反对

使用道具 举报

2

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2012-2-20
在线时间
0 小时
 楼主| 发表于 2012-5-16 16:13:11 | 显示全部楼层
每一次采样的值都不同 
生活就是 漂泊不定 一直寻找那甜美的港湾
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-5-16 17:27:10 | 显示全部楼层
那你检查你的代码吧,如果基准频率没错,计算出来的值也是变动很少才对的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2012-2-20
在线时间
0 小时
 楼主| 发表于 2012-5-17 08:43:21 | 显示全部楼层
原子大哥 我的代码已经在3楼都贴出来了 我昨天弄了一夜也没有弄明白 
生活就是 漂泊不定 一直寻找那甜美的港湾
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-5-17 08:51:08 | 显示全部楼层
直接用suqingxiao  的代码测试一下。看看可以不。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2012-2-20
在线时间
0 小时
 楼主| 发表于 2012-5-17 10:27:12 | 显示全部楼层
已经搞定了 就是那个ARR跟PSC惹的祸 WM_Init(1500,72-1);  //不分频。PWM频率=72000/1440=5Khz中的ARR跟PSC是调整输出的频率的ARR是计数溢出用的 PSC是预分频的 
而Capture_Init(2000,72-1);中的PSC直接影响到最终的TIM4->CCR1的采样个数 以及算频率时的基准频率是多少的问题 而ARR也是计数溢出用的
如果采样频率高的时候 基准频率要高 但这时如果又要兼顾采样低频的话就要增大ARR的值 不然就溢出了 
生活就是 漂泊不定 一直寻找那甜美的港湾
回复 支持 反对

使用道具 举报

2

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2012-2-20
在线时间
0 小时
 楼主| 发表于 2012-5-18 09:53:19 | 显示全部楼层
原子大哥现在新问题又来了 发现这样测量频率比较低的时候精度比较高 频率到了70KHZ以上时 精度就没有了 有没有办法能把精度提高上去 最好能在200KHz以内实现高精度测量
生活就是 漂泊不定 一直寻找那甜美的港湾
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-5-18 11:30:47 | 显示全部楼层
回复【15楼】langzisuke:
---------------------------------
测高频,计数器的频率就要高,但是计数器的频率一高,低频的就没法测了(会溢出),这是个矛盾。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2012-2-20
在线时间
0 小时
 楼主| 发表于 2012-5-18 15:04:23 | 显示全部楼层
原子大哥说的对
生活就是 漂泊不定 一直寻找那甜美的港湾
回复 支持 反对

使用道具 举报

2

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2012-2-20
在线时间
0 小时
 楼主| 发表于 2012-5-21 09:12:09 | 显示全部楼层
原子大哥现在 有一问题没有得到解决 请教您一下 TIM4->CCR1 这个寄存器怎么清空啊 我采集频率第一次是91.3KHz 第二次换成22KHz是还是显示的91.3KHz我查看寄存器 发现是寄存器没有清空 导致的
生活就是 漂泊不定 一直寻找那甜美的港湾
回复 支持 反对

使用道具 举报

2

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2012-2-20
在线时间
0 小时
 楼主| 发表于 2012-5-21 10:14:50 | 显示全部楼层
原子大哥 源程序 如下
delay_ms(2000); //-----------------------------------------------------------------------
CAPj=0;
CAPi=0;
PWM_Init(2,3); //不分频。PWM 频率=36000/2/3=6Mhz 设定PWM频率
LED0_PWM_VAL=led0pwmval;
Capture_Init(20000,72-1);

while(CAPi==0)  //等待频率采样完成
{
delay_ms(100);
}

PINLV6V=(float)CAPi/100;



delay_ms(2000); //-----------------------------------------------------------------------
gain_port(0x4000);
P5=1;
delay_ms(1);
P5=0;
delay_ms(1);
gain_port(0);
P5=1;
delay_ms(1);
P5=0;
delay_ms(1);
gain_port(0x3E00);   //0x3C00控制电源打开+0x0200控制继电器吸合
P3=1;
delay_ms(1);
P3=0;
delay_ms(1);
gain_port(0x3c00);
P3=1;
delay_ms(1);
P3=0;
delay_ms(1);
//继电器3K4工作在34状态  其它工作在23状态  2 
//ad采样判断是否环路 
delay_ms(2000); //-----------------------------------------------------------------------


delay_ms(2000); //-----------------------------------------------------------------------
gain_port(0x1400);
P5=1;
delay_ms(1);
P5=0;
delay_ms(1);
gain_port(0);
P5=1;
delay_ms(1);
P5=0;
delay_ms(1);
//继电器3K4,3K3,3K2工作在34状态  其它工作在23状态   3
delay_ms(2000); //-----------------------------------------------------------------------


CAPj=0;

CAPi=0;
PWM_Init(2,3); //不分频。PWM 频率=36000/2/3=6Mhz 设定PWM频率
LED0_PWM_VAL=led0pwmval;
Capture_Init(20000,72-1);


while(CAPi==0)  //等待频率采样完成
{
delay_ms(100);
}

PINLV=(float)CAPi/100;

这是我的源程序 
第一次采样一点问题没有 但是通过外设控制之后 第二次采样用的跟第一次一样的程序 数据没有变化
生活就是 漂泊不定 一直寻找那甜美的港湾
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-5-21 10:38:00 | 显示全部楼层
直接CCR1=0;就清空了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2012-2-20
在线时间
0 小时
 楼主| 发表于 2012-5-21 10:44:58 | 显示全部楼层
现在主要的问题是清不清空CCR1这个寄存器 而是 采样的数据不变的问题 delay_ms(2000); //----------------------------------------------------------------------- 
CAPj=0; 
CAPi=0; 
PWM_Init(2,3); //不分频。PWM 频率=36000/2/3=6Mhz 设定PWM频率 
LED0_PWM_VAL=led0pwmval; 
Capture_Init(20000,72-1); 

while(CAPi==0)  //等待频率采样完成 

delay_ms(100); 


PINLV6V=(float)CAPi/100; 



delay_ms(2000); //----------------------------------------------------------------------- 
gain_port(0x4000); 
P5=1; 
delay_ms(1); 
P5=0; 
delay_ms(1); 
gain_port(0); 
P5=1; 
delay_ms(1); 
P5=0; 
delay_ms(1); 
gain_port(0x3E00);   //0x3C00控制电源打开+0x0200控制继电器吸合 
P3=1; 
delay_ms(1); 
P3=0; 
delay_ms(1); 
gain_port(0x3c00); 
P3=1; 
delay_ms(1); 
P3=0; 
delay_ms(1); 
//继电器3K4工作在34状态  其它工作在23状态  2  
//ad采样判断是否环路  
delay_ms(2000); //----------------------------------------------------------------------- 


delay_ms(2000); //----------------------------------------------------------------------- 
gain_port(0x1400); 
P5=1; 
delay_ms(1); 
P5=0; 
delay_ms(1); 
gain_port(0); 
P5=1; 
delay_ms(1); 
P5=0; 
delay_ms(1); 
//继电器3K4,3K3,3K2工作在34状态  其它工作在23状态   3 
delay_ms(2000); //----------------------------------------------------------------------- 


CAPj=0; 

CAPi=0; 
PWM_Init(2,3); //不分频。PWM 频率=36000/2/3=6Mhz 设定PWM频率 
LED0_PWM_VAL=led0pwmval; 
Capture_Init(20000,72-1); 


while(CAPi==0)  //等待频率采样完成 

delay_ms(100); 


PINLV=(float)CAPi/100; 

这是我的源程序  
第一次采样一点问题没有 但是通过外设控制之后 第二次采样用的跟第一次一样的程序 数据没有变化
生活就是 漂泊不定 一直寻找那甜美的港湾
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-5-21 11:21:59 | 显示全部楼层
回复【21楼】langzisuke:
---------------------------------
那你从代码找找原因吧,
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2012-8-28
在线时间
4 小时
发表于 2012-10-26 08:29:07 | 显示全部楼层
mark,新手还没研究到频率计,不知道和51的差不多么
回复 支持 反对

使用道具 举报

11

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
447
金钱
447
注册时间
2013-8-4
在线时间
69 小时
发表于 2013-8-4 15:47:13 | 显示全部楼层
求楼主发一份资料825979838@qq.com
回复 支持 反对

使用道具 举报

10

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
145
金钱
145
注册时间
2013-8-17
在线时间
3 小时
发表于 2013-8-26 16:46:42 | 显示全部楼层
求楼主发一份资料497559098@qq.com,感激不尽。。
回复 支持 反对

使用道具 举报

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2014-11-13
在线时间
0 小时
发表于 2014-11-30 19:32:45 | 显示全部楼层
x45V@qq.com求楼主发一份资料  ,,感激不尽   感激不尽
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-28 10:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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