OpenEdv-开源电子网

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

【ALIENTEK 战舰STM32开发板例程系列连载+教学】第十五章 输入捕获实验

[复制链接]

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-1-18 23:47:07 | 显示全部楼层 |阅读模式

 第十五章 输入捕获实验

上一章,我们介绍了STM32的通用定时器作为PWM输出的使用方法,这一章,我们将向大家介绍通用定时器作为输入捕获的使用。在本章中,我们将用TIM5的通道1PA0)来做输入捕获,捕获PA0上高电平的脉宽(用WK_UP按键输入高电平),通过串口打印高电平脉宽时间,从本章分为如下几个部分:

15.1 输入捕获简介

15.2 硬件设计

15.3 软件设计

15.4 下载验证

15.1 输入捕获简介

输入捕获模式可以用来测量脉冲宽度或者测量频率。STM32的定时器,除了TIM6TIM7,其他定时器都有输入捕获功能。STM32的输入捕获,简单的说就是通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的通道的捕获/比较寄存器(TIMx_CCRx)里面,完成一次捕获。同时还可以配置捕获时是否触发中断/DMA等。

本章我们用到TIM5_CH1来捕获高电平脉宽,也就是要先设置输入捕获为上升沿检测,记录发生上升沿的时候TIM5_CNT的值。然后配置捕获信号为下降沿捕获,当下降沿到来时,发生捕获,并记录此时的TIM5_CNT值。这样,前后两次TIM5_CNT之差,就是高电平的脉宽,同时TIM5的计数频率我们是知道的,从而可以计算出高电平脉宽的准确时间。

接下来,我们介绍我们本章需要用到的一些寄存器配置,需要用到的寄存器有:TIMx_ARRTIMx_PSCTIMx_CCMR1TIMx_CCERTIMx_DIERTIMx_CR1TIMx_CCR1这些寄存器在前面2章全部都有提到(这里的x=5),我们这里就不再全部罗列了,我们这里针对性的介绍这几个寄存器的配置。

首先TIMx_ARRTIMx_PSC,这两个寄存器用来设自动重装载值和TIMx的时钟分频,用法同前面介绍的,我们这里不再介绍。

再来看看捕获/比较模式寄存器1TIMx_CCMR1,这个寄存器在输入捕获的时候,非常有用,有必要重新介绍,该寄存器的各位描述如图15.1.1所示:



 

15.1.1 TIMx_CCMR1寄存器各位描述

       当在输入捕获模式下使用的时候,对应图15.1.1的第二行描述,从图中可以看出,TIMx_CCMR1明显是针对2个通道的配置,低八位[70]用于捕获/比较通道1的控制,而高八位[158]则用于捕获/比较通道2的控制,因为TIMx还有CCMR2这个寄存器,所以可以知道CCMR2是用来控制通道3和通道4(详见《STM32参考手册》290页,14.4.8节)。

       这里我们用到的是TIM5的捕获/比较通道1,我们重点介绍TIMx_CMMR1[7:0]位(其实高8位配置类似),TIMx_CMMR1[7:0]位详细描述见图15.1.2所示:



15.1.2 TIMx_CMMR1 [7:0]位详细描述

其中CC1S[1:0],这两个位用于CCR1的通道配置,这里我们设置IC1S[1:0]=01,也就是配置IC1映射在TI1上(关于IC1TI1不明白的,可以看《STM32参考手册》14.2节的图98-通用定时器框图),即CC1对应TIMx_CH1

输入捕获1预分频器IC1PSC[1:0],这个比较好理解。我们是1次边沿就触发1次捕获,所以选择00就是了。

输入捕获1滤波器IC1F[3:0],这个用来设置输入采样频率和数字滤波器长度。其中,

 是定时器的输入频率(TIMxCLK),一般为72Mhz,而

则是根据TIMx_CR1CKD[1:0]的设置来确定的,如果CKD[1:0]设置为00,那么=N值就是滤波长度,举个简单的例子:假设IC1F[3:0]=0011,并设置IC1映射到通道1上,且为上升沿触发,那么在捕获到上升沿的时候,再以 的频率,连续采样到8次通道1的电平,如果都是高电平,则说明却是一个有效的触发,就会触发输入捕获中断(如果开启了的话)。这样可以滤除那些高电平脉宽低于8个采样周期的脉冲信号,从而达到滤波的效果。这里,我们不做滤波处理,所以设置IC1F[3:0]=0000,只要采集到上升沿,就触发捕获。

再来看看捕获/比较使能寄存器:TIMx_CCER,该寄存器的各位描述见图14.1.2(在第14章)。本章我们要用到这个寄存器的最低2位,CC1ECC1P位。这两个位的描述如图15.1.3所示:



15.1.3 TIMx_CCER最低2位描述

       所以,要使能输入捕获,必须设置CC1E=1,而CC1P则根据自己的需要来配置。

接下来我们再看看DMA/中断使能寄存器:TIMx_DIER,该寄存器的各位描述见图13.1.2(在第13章),本章,我们需要用到中断来处理捕获数据,所以必须开启通道1的捕获比较中断,即CC1IE设置为1

控制寄存器:TIMx_CR1,我们只用到了它的最低位,也就是用来使能定时器的,这里前面两章都有介绍,请大家参考前面的章节。

最后再来看看捕获/比较寄存器1TIMx_CCR1,该寄存器用来存储捕获发生时,TIMx_CNT的值,我们从TIMx_CCR1就可以读出通道1捕获发生时刻的TIMx_CNT值,通过两次捕获(一次上升沿捕获,一次下降沿捕获)的差值,就可以计算出高电平脉冲的宽度。

至此,我们把本章要用的几个相关寄存器都介绍完了,本章要实现通过输入捕获,来获取TIM5_CH1(PA0)上面的高电平脉冲宽度,并从串口打印捕获结果。下面我们介绍输入捕获的配置步骤:

1)开启TIM5时钟,配置PA0为下拉输入。

要使用TIM5,我们必须先开启TIM5的时钟(通过APB1ENR设置)。这里我们还要配置PA0为下拉输入,因为我们要捕获TIM5_CH1上面的高电平脉宽,而TIM5_CH1是连接在PA0上面的。

2)设置TIM5ARRPSC

在开启了TIM5的时钟之后,我们要设置ARRPSC两个寄存器的值来设置输入捕获的自动重装载值和计数频率。

3)设置TIM5CCMR1

TIM5_CCMR1寄存器控制着输入捕获12的模式,包括映射关系,滤波和分频等。这里我们需要设置通道1为输入模式,且IC1映射到TI1(通道1)上面,并且不使用滤波(提高响应速度)器。

4)设置TIM5CCER,开启输入捕获,并设置为上升沿捕获。

TIM5_CCER寄存器是定时器的开关,并且可以设置输入捕获的边沿。只有TIM5_CCER寄存器使能了输入捕获,我们的外部信号,才能被TIM5捕获到,否则一切白搭。同时要设置好捕获边沿,才能得到正确的结果。

5)设置TIM5DIER,使能捕获和更新中断,并编写中断服务函数

因为我们要捕获的是高电平信号的脉宽,所以,第一次捕获是上升沿,第二次捕获时下降沿,必须在捕获上升沿之后,设置捕获边沿为下降沿,同时,如果脉宽比较长,那么定时器就会溢出,对溢出必须做处理,否则结果就不准了。这两件事,我们都在中断里面做,所以必须开启捕获中断和更新中断。

设置了中断必须编写中断函数,否则可能导致死机。我们需要在中断函数里面完成数据处理和捕获设置等关键操作,从而实现高电平脉宽统计。

6)设置TIM5CR1,使能定时器

最后,必须打开定时器的计数器开关,通过设置TIM5_CR1的最低位为1,启动TIM5的计数器,开始输入捕获。

通过以上6步设置,定时器5的通道1就可以开始输入捕获了,同时因为还用到了串口输出结果,所以还需要配置一下串口。

15.2 硬件设计

本实验用到的硬件资源有:

1)  指示灯DS0

2)  WK_UP按键

3)  串口

4)  定时器TIM3

5)  定时器TIM5

前面4个,在之前的章节均有介绍。本节,我们将捕获TIM5_CH1PA0)上的高电平脉宽,通过WK_UP按键输入高电平,并从串口打印高电平脉宽。同时我们保留上节的PWM输出,大家也可以通过用杜邦线连接PB5PA0,来测量PWM输出的高电平脉宽。

15.3 软件设计

本章,我们依旧是在前一章的基础上修改代码,先打开之前的工程,然后我们在上一章的基础上,在timer.c里面加入如下代码:

//定时器5通道1输入捕获配置

//arr:自动重装值

//psc:时钟预分频数

void TIM5_Cap_Init(u16 arr,u16 psc)

{           

       RCC->APB1ENR|=1<<3;          //TIM5 时钟使能

       RCC->APB2ENR|=1<<2;         //使能PORTA时钟      

       GPIOA->CRL&=0XFFFFFFF0;   //PA0 清除之前设置 

       GPIOA->CRL|=0X00000008;       //PA0 输入  

       GPIOA->ODR|=0<<0;                 //PA0 下拉     

      TIM5->ARR=arr;                      //设定计数器自动重装值  

       TIM5->SC=psc;                       //预分频器

       TIM5->CCMR1|=1<<0;               //CC1S=01     选择输入端 IC1映射到TI1

      TIM5->CCMR1|=0<<4;              //IC1F=0000 配置输入滤波器 不滤波

      TIM5->CCMR1|=0<<10;             //IC2PS=00    配置输入分频,不分频

       TIM5->CCER|=0<<1;                 //CC1P=0       上升沿捕获

       TIM5->CCER|=1<<0;                 //CC1E=1      允许捕获计数器的值到捕获寄存器中

       TIM5->DIER|=1<<1;                //允许捕获中断                         

       TIM5->DIER|=1<<0;                //允许更新中断    

       TIM5->CR1|=0x01;                  //使能定时器2

       MY_NVIC_Init(2,0,TIM5_IRQChannel,2);//抢占2,子优先级0,组2     

}

//捕获状态

//[7]:0,没有成功的捕获;1,成功捕获到一次.

//[6]:0,还没捕获到高电平;1,已经捕获到高电平了.

//[5:0]:捕获高电平后溢出的次数

u8  TIM5CH1_CAPTURE_STA=0;    //输入捕获状态                                           

u16  TIM5CH1_CAPTURE_VAL  ;      //输入捕获值

//定时器5中断服务程序    

void TIM5_IRQHandler(void)

{                

       u16 tsr;

       tsr=TIM5->SR;

      if((TIM5CH1_CAPTURE_STA&0X80)==0)//还未成功捕获    

       {

              if(tsr&0X01)//溢出

              {        

                     if(TIM5CH1_CAPTURE_STA&0X40)//已经捕获到高电平了

                     {

                            if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了

                            {

                                   TIM5CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次

                                   TIM5CH1_CAPTURE_VAL=0XFFFF;

                            }else TIM5CH1_CAPTURE_STA++;

                     }    

              }

              if(tsr&0x02)//捕获1发生捕获事件

              {    

                     if(TIM5CH1_CAPTURE_STA&0X40)        //捕获到一个下降沿          

                     {                        

                            TIM5CH1_CAPTURE_STA|=0X80;     //标记成功捕获到一次高电平脉宽

                         TIM5CH1_CAPTURE_VAL=TIM5->CCR1;//获取当前的捕获值.

                           TIM5->CCER&=~(1<<1);                  //CC1P=0 设置为上升沿捕获

                     }else                                                       //还未开始,第一次捕获上升沿

                     {

                            TIM5CH1_CAPTURE_STA=0;           //清空

                            TIM5CH1_CAPTURE_VAL=0;

                            TIM5CH1_CAPTURE_STA|=0X40;     //标记捕获到了上升沿

                           TIM5->CNT=0;                                 //计数器清空

                           TIM5->CCER|=1<<1;                        //CC1P=1 设置为下降沿捕获

                     }               

              }                                                                       

      }

       TIM5->SR=0;//清除中断标志位     

}

此部分代码包含2个函数,其中TIM5_Cap_Init函数用于TIM5通道1的输入捕获设置,其设置和我们上面讲的步骤是一样的,这里就不多说,重点来看看第二个函数。

TIM5_IRQHandlerTIM5的中断服务函数,该函数用到了两个全局变量,用于辅助实现高电平捕获。其中TIM5CH1_CAPTURE_STA,是用来记录捕获状态,该变量类似我们在usart.c里面自行定义的USART_RX_STA寄存器。TIM5CH1_CAPTURE_STA各位描述如表15.3.1所示:

TIM5CH1_CAPTURE_STA

bit7

bit6

bit5~0

捕获完成标志

捕获到高电平标志

捕获高电平后定时器溢出的次数

15.3.1 TIM5CH1_CAPTURE_STA各位描述

       另外一个变量TIM5CH1_CAPTURE_VAL,则用来记录捕获到下降沿的时候,TIM5_CNT的值。

       现在我们来介绍一下,捕获高电平脉宽的思路:首先,设置TIM5_CH1捕获上升沿,这在TIM5_Cap_Init函数执行的时候就设置好了,然后等待上升沿中断到来,当捕获到上升沿中断,此时如果TIM5CH1_CAPTURE_STA的第6位为0,则表示还没有捕获到新的上升沿,就先把

TIM5CH1_CAPTURE_STATIM5CH1_CAPTURE_VALTIM5->CNT等清零,然后再设置TIM5CH1_CAPTURE_STA的第6位为1,标记捕获到高电平,最后设置为下降沿捕获,等待下降沿到来。如果等待下降沿到来期间,定时器发生了溢出,就在TIM5CH1_CAPTURE_STA里面对溢出次数进行计数,当最大溢出次数来到的时候,就强制标记捕获完成(虽然此时还没有捕获到下降沿)。当下降沿到来的时候,先设置TIM5CH1_CAPTURE_STA的第7位为1,标记成功捕获一次高电平,然后读取此时的定时器值到TIM5CH1_CAPTURE_VAL里面,最后设置为上升沿捕获,回到初始状态。

       这样,我们就完成一次高电平捕获了,只要TIM5CH1_CAPTURE_STA的第7位一直为1,那么就不会进行第二次捕获,我们在main函数处理完捕获数据后,将TIM5CH1_CAPTURE_STA置零,就可以开启第二次捕获。

接着我们修改timer.h如下:

#ifndef __TIMER_H

#define __TIMER_H

#include "sys.h"

//通过改变TIM3->CCR2的值来改变占空比,从而控制LED0的亮度

#define LED0_PWM_VAL TIM3->CCR2

void TIM3_Int_Init(u16 arr,u16 psc);

void TIM3_PWM_Init(u16 arr,u16 psc);

void TIM5_Cap_Init(u16 arr,u16 psc);

#endif

这里比较简单,就不多说了。

接下来,我们修改主程序里面的main函数如下:

extern u8  TIM5CH1_CAPTURE_STA;     //输入捕获状态                                           

extern u16      TIM5CH1_CAPTURE_VAL; //输入捕获值

int main(void)

{                  

       u32 temp=0;        

      Stm32_Clock_Init(9);                  //系统时钟设置

       uart_init(72,9600);                    //串口初始化为9600

       delay_init(72);                                //延时初始化

       LED_Init();                               //初始化与LED连接的硬件接口

      TIM3_PWM_Init(899,72-1);       //不分频。PWM频率=72000/(899+1)=80Khz

      TIM5_Cap_Init(0XFFFF,72-1);    //1Mhz的频率计数

     while(1)

       {

             delay_ms(10);

              LED0_PWM_VAL++;

              if(LED0_PWM_VAL==300)LED0_PWM_VAL=0;                  

             if(TIM5CH1_CAPTURE_STA&0X80)               //成功捕获到了一次高电平

              {

                     temp=TIM5CH1_CAPTURE_STA&0X3F;

                     temp*=65536;                                           //溢出时间总和

                     temp+=TIM5CH1_CAPTURE_VAL;           //得到总的高电平时间

                     printf("HIGH:%d us\r\n",temp);                 //打印总的高点平时间

                     TIM5CH1_CAPTURE_STA=0;                  //开启下一次捕获

              }

       }

}

main函数是在PWM实验的基础上修改来的,我们保留了PWM输出,同时通过设置TIM5_Cap_Init(0XFFFF,72-1),将TIM5_CH1的捕获计数器设计为1us计数一次,并设置重装载值为最大,所以我们的捕获时间精度为1us

主函数通过TIM5CH1_CAPTURE_STA的第7位,来判断有没有成功捕获到一次高电平,如果成功捕获,则将高电平时间通过串口输出到电脑。

至此,我们的软件设计就完成了。

15.4 下载验证

在完成软件设计之后,将我们将编译好的文件下载到战舰STM32开发板上,可以看到DS0的状态和上一章差不多,由暗à亮的循环。说明程序已经正常在跑了,我们再打开串口调试助手,选择对应的串口,然后按WK_UP按键,可以看到串口打印的高电平持续时间,如图15.4.1所示:


15.4.1 PWM控制DS0亮度

       从上图可以看出,其中有2次高电平在50us以内的,这种就是按键按下时发生的抖动。这就是为什么我们按键输入的时候,一般都需要做防抖处理,防止类似的情况干扰正常输入。大家还可以用杜邦线连接PA0PB5,看看上一节中我们设置的PWM输出的高电平是如何变化的。

 


 

实验10 输入捕获实验.rar

36.3 KB, 下载次数: 1768

《STM32开发指南》第十五章 输入捕获实验.rar

757.83 KB, 下载次数: 2002

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

60

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2814
金钱
2814
注册时间
2012-10-17
在线时间
653 小时
发表于 2013-1-19 01:28:36 | 显示全部楼层
回复【楼主位】正点原子:
---------------------------------
原子大大有沒有辦法不用中斷就可以捕獲到上升沿跟下降沿
不然DMA功能好像沒有啥幫助...因為反正都要中斷去切換捕獲上升沿或下降沿
哪有差那一個讀取的動作@@...
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2013-1-19 18:41:33 | 显示全部楼层
回复【2楼】civic7366:
---------------------------------
没哦.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2013-3-17 10:50:58 | 显示全部楼层
回复【楼主位】正点原子:
---------------------------------
直接在TIM5中断里面捕获完毕或者超时就直接输出吧,不用在main函数里面查询了。
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2013-3-17 10:52:38 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
那样是不是就得一直查询更新标志啊。太费事了吧
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2013-3-17 17:55:48 | 显示全部楼层
回复【5楼】wwjdwy:
---------------------------------
中断函数应尽量短,而且要尽量精简。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2013-3-17 21:42:52 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
好的,明白了,这应该是一个以后编程的思路!
多谢
回复 支持 反对

使用道具 举报

9

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2013-8-15
在线时间
0 小时
发表于 2013-8-20 17:51:07 | 显示全部楼层
原子哥,我还是初学者,有个问题想问问。就是我想利用某个定时器的一个通道,对输入信号(频率发生器)同时进行输入捕获(计算其频率)和脉冲计数两个功能,可不可以实现呢?我自己的理解是实现输入捕获要对定时器进行GPIO,RCC,NVIC这些功能的设置,然后脉冲计数要对其时基单元进行设置,然后频率计算通过对输入捕获寄存器读取相应的值,脉冲数要对CNT读数,是这样么?
刚开始学习STM,好多不懂得阿,谢谢
钟声咣咣响,乌鸦嘎嘎叫
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2013-8-20 23:03:45 | 显示全部楼层
回复【8楼】周小猫:
---------------------------------
输入捕获能不出错,那么计算脉冲个数,就可以很简单的实现。

我们的输入捕获用的是中断,一个脉冲会引发2次中断,所以你只要记录中断的次数,除以2就是信号的频率。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

9

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2013-8-15
在线时间
0 小时
发表于 2013-8-21 15:00:51 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
谢谢原子哥这么快回复,今天问了一下导师利用中断次数记录脉冲数,导师说理论上可以,但是如果频率较大,脉冲次数有可能出错
如果这样的话,是不是就得读COUNTER里面的值了?但是这个寄存器是16位的,碰到大频率很容易就溢出了,头大阿
钟声咣咣响,乌鸦嘎嘎叫
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2013-8-21 15:21:02 | 显示全部楼层
频率高,你输入捕获都不正常了...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

9

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2013-8-15
在线时间
0 小时
发表于 2013-8-23 15:49:03 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
原子哥,这两天试了试,用ETR可以正确测得脉冲数,还想问问,如果只用ETR进行脉冲计数,是不是一个定时器不能同时实现频率测试和脉冲计数呢?
我的理解是对于测频CNT里存储的是内部时钟分频后得到的脉冲个数,脉冲计数时CNT里存储的是被测频率的脉冲个数,是这个样子么?
谢谢
钟声咣咣响,乌鸦嘎嘎叫
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2013-8-25 23:22:36 | 显示全部楼层
回复【12楼】周小猫:
---------------------------------
频率和脉冲计数,不是一回事么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2014-1-9
在线时间
2 小时
发表于 2014-1-9 18:53:36 | 显示全部楼层
原子哥有点问题想请教您,如果我想用定时器二做这个输入捕获是不是就把程序里面的5都换成2就好了?~
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2014-1-9
在线时间
2 小时
发表于 2014-1-9 19:02:47 | 显示全部楼层
我用的是mini
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
23
金钱
23
注册时间
2014-3-17
在线时间
0 小时
发表于 2014-3-18 20:38:03 | 显示全部楼层
原子哥,捕捉到上升沿之后,计数器会自动清零吗
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2014-3-18 23:13:31 | 显示全部楼层
回复【17楼】正点原子:
---------------------------------
但是i我们例程会用程序去清零。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2014-2-8
在线时间
2 小时
发表于 2014-3-29 12:09:11 | 显示全部楼层
寄存器版的看不懂哟
专心专注,必有所成
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2014-5-14
在线时间
0 小时
发表于 2014-5-16 15:31:41 | 显示全部楼层
回复【3楼】正点原子:
---------------------------
原子哥,我想问下我把生成pwm波的占空比设为固定值后,一次捕获高电平的时间不是应该等于
pwm波的占空比(即(TIM3->CCR2)/arr)乘以其周期?但串口打印出来的时间和算出来的对不上,
还有TIM5->CNT里面装的是当前捕获的pwm脉冲个数吗?
回复 支持 反对

使用道具 举报

8

主题

222

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
275
金钱
275
注册时间
2013-11-21
在线时间
0 小时
发表于 2014-5-16 16:03:18 | 显示全部楼层
回复【20楼】碧海青天:
---------------------------------
是的,是不是你算错了。
CNT里存的不是脉冲个数,是定时器的值
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2014-5-14
在线时间
0 小时
发表于 2014-5-19 08:36:51 | 显示全部楼层
回复【21楼】苦竹2009:
---------------------------------
那我想获得当前的计数值(脉冲数),应该从那个寄存器获得呀?
回复 支持 反对

使用道具 举报

8

主题

222

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
275
金钱
275
注册时间
2013-11-21
在线时间
0 小时
发表于 2014-5-19 21:25:56 | 显示全部楼层
回复【22楼】碧海青天:
---------------------------------
捕获是捕获下降沿和上升沿。算脉冲数,那你就对捕获到的上升沿计数
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2014-5-14
在线时间
0 小时
发表于 2014-5-20 08:35:37 | 显示全部楼层
回复【23楼】苦竹2009:
---------------------------------原来是这么回事,我还以为有个专门的寄存器里面存的计数值呢,太感谢,回头再改下程序。
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2014-8-6
在线时间
1 小时
发表于 2014-8-6 13:27:35 | 显示全部楼层
原子兄弟,我想问一下: TIM5->CNT=0; 这一句在 j-link 仿真时可以正确显示吗?为什么我每次debug运行到这句后,CNT无法清零呢?
回复 支持 反对

使用道具 举报

11

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2014-8-4
在线时间
14 小时
发表于 2014-8-6 21:40:31 | 显示全部楼层
回复【17楼】正点原子:
---------------------------------
会不会自动重装呢
生命不息,学习不止
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2014-8-6 23:00:54 | 显示全部楼层
回复【26楼】liuzhenwei2014:
---------------------------------
是一瞬间的事情
等你到下一个步骤,CNT可能就加了好几个值了.
你把PSC设置尽量大,再试试.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2014-4-14
在线时间
0 小时
发表于 2014-8-19 16:22:50 | 显示全部楼层
原子哥,如果我想在中断函数里面直接输出应该怎么做呀
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2014-8-19 23:12:07 | 显示全部楼层
回复【28楼】原柏少将:
---------------------------------
在中断里面写计算公式和printf输出.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2014-4-14
在线时间
0 小时
发表于 2014-8-20 12:52:34 | 显示全部楼层
回复【29楼】正点原子:
---------------------------------
恩恩,谢谢原子哥,我想测方波输出的高电平脉宽,可是总是检测不到触发沿
回复 支持 反对

使用道具 举报

4

主题

12

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2014-7-14
在线时间
0 小时
发表于 2014-8-27 16:32:36 | 显示全部楼层
回复【29楼】正点原子:
---------------------------------
看了通用定时器的框图,还是不明白IC1和TI1怎么办?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2014-8-27 22:37:44 | 显示全部楼层
回复【31楼】行者122:
---------------------------------
继续看手册.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2014-8-6
在线时间
1 小时
发表于 2014-9-22 15:04:40 | 显示全部楼层
原子 你好
在对比了 输入捕获实验和电容屏触摸按键实验后,我有一个疑问,网上翻了半天也找不到想要的答案
求教:
在输入捕获实验中是采用TIM5的ch1来做捕获的
因此你写的代码是
TIM5->CCMR1|=1<<0;               //CC1S=01     选择输入端 IC1映射到TI1上
在TIMx的CHx在做输入捕获模式下时 就是TIx 也就是TI1
那么我是不说只要映射到TI1上 我同样可以  IC2映射到TI1上
也就是
 TIM5->CCMR1 |= 0x20 << 8;   //CC2S = 10

这两者 除了一个是用输入捕获通道1,一个是输入捕获通道2 两套资源配置外(比方说 一个是 CCR1 一个就得采用CCR2)
还有什么差别吗?
谢谢
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2014-9-22 21:12:23 | 显示全部楼层
回复【33楼】smartmen:
---------------------------------
没什么差别。
两个都是用CCR1
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2014-6-14
在线时间
1 小时
发表于 2014-11-7 18:44:20 | 显示全部楼层
TIM5->CCMR1|=1<<0;               //CC1S=01     选择输入端 IC1映射到TI1上
      TIM5->CCMR1|=0<<4;              //IC1F=0000 配置输入滤波器 不滤波
      TIM5->CCMR1|=0<<10;             //IC2PS=00    配置输入分频,不分频
原子哥你好,前面是IC1  为何最后一句是IC2  而不是TIM5->CCRM1|=0<<2;回复【34楼】正点原子:
---------------------------------
回复【34楼】正点原子:
---------------------------------
  TIM5->CCMR1|=1<<0;               //CC1S=01     选择输入端 IC1映射到TI1上
      TIM5->CCMR1|=0<<4;              //IC1F=0000 配置输入滤波器 不滤波
      TIM5->CCMR1|=0<<10;             //IC2PS=00    配置输入分频,不分频
原子哥你好,前面是IC1  为何最后一句是IC2  而不是TIM5->CCRM1|=0<<2;
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2014-11-7 20:05:58 | 显示全部楼层
回复【35楼】tiget327:
---------------------------------
 注释有误
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2014-6-14
在线时间
1 小时
发表于 2014-11-8 10:46:20 | 显示全部楼层
原子大哥,还是有点错误吧,我看了第十位应该是CCMR1的IC2控制位


正确的写法应该还是TIM5->CCMR1|=0<<2位 对吗,而不是TIM5->CCMR1|=0<<10;  新手望指点
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2014-11-8 14:28:44 | 显示全部楼层
回复【37楼】tiget327:
---------------------------------
恩,以寄存器介绍为准。不过这里设置的是0,所以,不影响结果。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2014-6-14
在线时间
1 小时
发表于 2014-11-8 15:33:35 | 显示全部楼层
回复【38楼】正点原子:
---------------------------------
好的谢谢
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2013-1-8
在线时间
2 小时
发表于 2014-11-18 23:38:18 | 显示全部楼层
回复【38楼】正点原子:
---------------------------------
原子哥 为什么相同的配置 相同的程序 怎么一直进不了中断呢 闹心啊  谢谢啦
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2013-1-8
在线时间
2 小时
发表于 2014-11-19 22:29:31 | 显示全部楼层
回复【41楼】正点原子:
---------------------------------
是这样的原子哥:我用的红牛V3.0的板子 主芯片一样 硬件连接也一样(限于本实验),然后我是按照您的开发指南-寄存器版V1.3的程序进行试验  结果进入主程序后只能进行PWM输出到LED,而捕获Wake-up键的高电平却不能进入中断。不知道原子哥能提供指导方向吗。谢谢。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2014-11-20 01:03:42 | 显示全部楼层
回复【42楼】lcjgyg:
---------------------------------
你下载的哪个例程?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2013-1-8
在线时间
2 小时
发表于 2014-11-20 08:44:54 | 显示全部楼层
回复【43楼】正点原子:
---------------------------------
首先感谢原子哥凌晨了还能回复我这菜鸟的简单问题,向您致敬!
我下载的是《STM32开发指南_寄存器版本_V1.3》的第十五章 输入捕获实验   上一章的PWM输出实验 应该不会对这章的实验产生影响吧。谢谢!
回复 支持 反对

使用道具 举报

20

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2012-8-24
在线时间
3 小时
发表于 2014-12-2 16:37:17 | 显示全部楼层
原子哥我按照这个程序下进去得到结果全是0
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2013-11-17
在线时间
2 小时
发表于 2014-12-10 20:20:42 | 显示全部楼层
想问一下站长,用STM32F1、F2、F3、F4系列做脉宽检测,最高可以检测多大频率的输入信号
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2014-12-10 21:18:10 | 显示全部楼层
回复【46楼】guanghua1028:
---------------------------------
没有测试过。估计不超过1M。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2013-11-17
在线时间
2 小时
发表于 2014-12-10 21:47:35 | 显示全部楼层
回复【47楼】正点原子:
---------------------------------
四种系列都一样吗?F4系列是不是要好些?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2014-12-10 22:20:17 | 显示全部楼层
回复【48楼】guanghua1028:
---------------------------------
差不多。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2014-12-17
在线时间
5 小时
发表于 2014-12-19 15:17:20 | 显示全部楼层
回复【43楼】正点原子:
---------------------------------
原子哥,我下的就是您的例程 STM32开发指南-库函数版本v1.3第15章;只是用TIM2产生PWM波,TIM3捕获;一模一样的代码,烧完后按照您的方法先按键然后连接TIM2与TIM3,有两个问题:
1)按键高电平的时间值,都是65536的倍数;
2)连接后,代码设置时间不是65536us的整数倍,但输出来的还是65536us的整数倍,如202.5ms与225ms输出的结果都是196608us。
这是怎么回事呢??

本人是菜苗,希望原子哥能帮忙解答,非常感谢。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 22:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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