OpenEdv-开源电子网

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

外部脉冲计数问题

[复制链接]

8

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2016-3-11
在线时间
47 小时
发表于 2016-4-11 08:43:54 | 显示全部楼层 |阅读模式
10金钱
原子哥,是不是mini板外部脉冲计数最高才60khz,听说可以达到二十兆啊!!!!!老师要求做个1hz到1Mhz的频率计
void TIM3_Int_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
       
        //定时器TIM3初始化
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值       
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位

        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断

        //中断优先级NVIC设置
        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
        NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器


        TIM_Cmd(TIM3, ENABLE);  //使能TIMx                                         
}

u16        TIM2CH1_CAPTURE_VAL;
TIM_ICInitTypeDef  TIM2_ICInitStructure;

void TIM2_Cap_Init(void)
{         
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);        //使能TIM2时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIOA时钟
       
        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;  //PA0 清除之前设置  
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0 输入  
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        GPIO_ResetBits(GPIOA,GPIO_Pin_0);                                                 //PA0 下拉
       
        //初始化定时器2 TIM2         
        TIM_TimeBaseStructure.TIM_Period = 0xFFFF; //设定计数器自动重装值
        TIM_TimeBaseStructure.TIM_Prescaler =0;         //预分频器   
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
          TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0);
        TIM_SetCounter(TIM2, 0);                
           TIM_Cmd(TIM2,ENABLE );         //使能定时器5

}


void TIM3_IRQHandler(void)   //TIM3中断
{
        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
                {
                TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源
                TIM2CH1_CAPTURE_VAL=TIM2->CNT;
                TIM_SetCounter(TIM2, 0);
                }
}


int main(void)
{               
        uart_init(9600);
        delay_init();       
        LCD_Init();
        EXTIX_Init();
        POINT_COLOR=RED;
                  
        TIM3_Int_Init(9999,7199);//10Khz的计数频率,计数到5000为500ms  
        TIM2_Cap_Init();
        NVIC_Configuration();          //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
           while(1)
        {
        delay_ms(1000);
//        printf("计数值:%d HZ\r\n",TIM2CH1_CAPTURE_VAL);          
           LCD_ShowxNum(10,110,TIM2CH1_CAPTURE_VAL,10,24,0);//显示电压值               
        }         


}       



最佳答案

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

问题已经解决了,是因为计数结果一直在0——65535之间,汗,现在写了定时器2的中断服务函数,就可以记到1M以上,我用的函数发生器只有5Mhz所以也不知道上限是多大。 现在的问题是测正弦波低频测不准确(完全没法测嘛)由于对于幅值测量还有要求,所以要接外接电路。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2016-3-11
在线时间
47 小时
 楼主| 发表于 2016-4-11 08:43:55 | 显示全部楼层
    问题已经解决了,是因为计数结果一直在0——65535之间,汗,现在写了定时器2的中断服务函数,就可以记到1M以上,我用的函数发生器只有5Mhz所以也不知道上限是多大。
   现在的问题是测正弦波低频测不准确(完全没法测嘛)由于对于幅值测量还有要求,所以要接外接电路。
   
回复

使用道具 举报

8

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2016-3-11
在线时间
47 小时
 楼主| 发表于 2016-4-11 12:50:49 | 显示全部楼层
没有人回答我的问题么
。。。。。。。。。。。
回复

使用道具 举报

58

主题

6293

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11473
金钱
11473
注册时间
2014-4-1
在线时间
1297 小时
发表于 2016-4-11 14:15:40 | 显示全部楼层

对内部时钟计数,怎么也得十几兆吧,
1M,应当没问题吧?!

回复

使用道具 举报

8

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2016-3-11
在线时间
47 小时
 楼主| 发表于 2016-4-11 14:16:56 | 显示全部楼层
xuande 发表于 2016-4-11 14:15
对内部时钟计数,怎么也得十几兆吧,
1M,应当没问题吧?!

嗯嗯,是没有问题的
回复

使用道具 举报

154

主题

289

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1067
金钱
1067
注册时间
2015-4-13
在线时间
189 小时
发表于 2016-4-11 22:17:03 | 显示全部楼层
误差怎么样
回复

使用道具 举报

5

主题

43

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2016-1-23
在线时间
31 小时
发表于 2016-4-11 22:41:12 | 显示全部楼层
用的TIM2_ETR?还是输入俘获?
回复

使用道具 举报

8

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2016-3-11
在线时间
47 小时
 楼主| 发表于 2016-4-11 23:15:13 来自手机 | 显示全部楼层
jeraw 发表于 2016-4-11 22:17
误差怎么样

当我计数5M的时候误差45hz
回复

使用道具 举报

8

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2016-3-11
在线时间
47 小时
 楼主| 发表于 2016-4-11 23:16:32 来自手机 | 显示全部楼层
nngogogo 发表于 2016-4-11 22:41
用的TIM2_ETR?还是输入俘获?

大哥,程序都在上面
回复

使用道具 举报

8

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2016-3-11
在线时间
47 小时
 楼主| 发表于 2016-4-12 11:41:17 | 显示全部楼层
这个帖子还会继续更新,直到我做出频率计来
回复

使用道具 举报

154

主题

289

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1067
金钱
1067
注册时间
2015-4-13
在线时间
189 小时
发表于 2016-4-12 21:46:15 | 显示全部楼层
031441229 发表于 2016-4-11 23:15
当我计数5M的时候误差45hz

用的晶振精度怎么样?
回复

使用道具 举报

8

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2016-3-11
在线时间
47 小时
 楼主| 发表于 2016-4-12 23:11:24 来自手机 | 显示全部楼层
基本思路我说一说,各位看客给点建议
回复

使用道具 举报

8

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2016-3-11
在线时间
47 小时
 楼主| 发表于 2016-4-12 23:15:13 来自手机 | 显示全部楼层
用定时器二外部计数模式计算频率。   用定时器五捕获模式计算脉冲宽度。       用外部中断触发ADC,ADC设为上升沿触发.        这一切都在PA1上可行否
回复

使用道具 举报

8

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2016-3-11
在线时间
47 小时
 楼主| 发表于 2016-4-13 12:34:55 | 显示全部楼层
jeraw 发表于 2016-4-12 21:46
用的晶振精度怎么样?

不晓得,就是原子mini板上的那个晶振
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2016-4-13 21:31:39 | 显示全部楼层
用定时器的外部脉冲计数模式。 不要用中断计数!!
回复

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2015-3-5
在线时间
18 小时
发表于 2016-5-5 01:40:37 | 显示全部楼层
学习了。。。
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2016-5-31
在线时间
1 小时
发表于 2016-6-3 16:54:30 | 显示全部楼层
你好,我参考了你上边的程序,下载到板子上,外部脉冲接到PA0脚,误差很大。脉冲频率1Hz,定时1s,正确情况是能计1000个数,但是我测的时候,峰峰值在3.1到3.3的时候,能计到1300到1400个数。峰峰值是3.0V时,能计到600度个数。不知道你测的时候,计数准确与否。希望能得到你的帮助,QQ1041320071
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2016-5-31
在线时间
1 小时
发表于 2016-6-3 18:13:58 | 显示全部楼层
楼主你好,我用你上面的程序,计的很不准确,你测试的时候误差是多少?
回复

使用道具 举报

8

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2016-3-11
在线时间
47 小时
 楼主| 发表于 2016-6-6 10:41:19 | 显示全部楼层
英特纳雄耐尔 发表于 2016-6-3 18:13
楼主你好,我用你上面的程序,计的很不准确,你测试的时候误差是多少?

我计数的时候范围内误差很小,大频率误差可以用频率补偿一下
回复

使用道具 举报

3

主题

26

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2018-3-27
在线时间
17 小时
发表于 2018-6-5 12:09:20 | 显示全部楼层
我的板子是精英f103zet6,我想做脉冲计数,需要改动那些内容,请大神指点
回复

使用道具 举报

2

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2020-7-19
在线时间
20 小时
发表于 2021-4-6 18:59:42 | 显示全部楼层
我用的F429 外部脉冲计数方式 最大可以到30M  再继续往上就不行了
回复

使用道具 举报

0

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2019-11-13
在线时间
16 小时
发表于 2023-9-15 11:00:42 | 显示全部楼层
CYCYILY 发表于 2021-4-6 18:59
我用的F429 外部脉冲计数方式 最大可以到30M  再继续往上就不行了

大神 可以分享下代码吗
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 15:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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