OpenEdv-开源电子网

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

请教通用定时器做输入捕获

[复制链接]

4

主题

5

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2011-9-16
在线时间
1 小时
发表于 2011-9-25 10:08:52 | 显示全部楼层 |阅读模式
请问原子哥有没有通用定时器做输入捕获测频率的例程?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

20

主题

111

帖子

2

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2011-10-18
在线时间
9 小时
发表于 2011-12-6 16:01:20 | 显示全部楼层
如果是库做的可以到库的TIM里面有定时器所有的功能例子。
?成功只是最后一小步的坚持!
回复 支持 反对

使用道具 举报

20

主题

111

帖子

2

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2011-10-18
在线时间
9 小时
发表于 2011-12-6 16:05:37 | 显示全部楼层

#include "stm32f10x.h"
#include "Uart1.h"
#include "SysTickDelay.h"

u16  IC2Value;
u16   DutyCycle;
u16   Frequency;



/* rivate function prototypes -----------------------------------------------*/
void  TIM_Capture(void);
void WM_GPIO(void);
void WM_Config(void);

int main(void)
{
   WM_GPIO();
   WM_Config();
   SystemInit();
   SysTick_Initaize();    
   USART1_Configuration();
   TIM_Capture();
  while (1)
  {
  }
}



void  TIM_Capture(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
TIM_ICInitTypeDef  TIM_ICInitStructure;
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);      //时钟配置
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;                               //GPIO配置
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(GPIOA, &GPIO_InitStructure);

   NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;                     //NVIC配置 
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&NVIC_InitStructure);

    TIM_DeInit(TIM3);
   TIM_TimeBaseStructure.TIM_Period = 2000;         
   TIM_TimeBaseStructure.TIM_Prescaler = 24-1;      
   TIM_TimeBaseStructure.TIM_ClockDivision = 0;   
   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
   TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

   TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;                   //通道选择
   TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;       //上升沿触发
   TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;    //管脚与寄存器对应关系
   TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;           //输入预分频。意思是控制在多少个输入周期做一次捕获,如果
//输入的信号频率没有变,测得的周期也不会变。比如选择4分频,则每四个输入周期才做一次捕获,这样在输入信号变化不频繁的情况下,
//可以减少软件被不断中断的次数。
  TIM_ICInitStructure.TIM_ICFilter = 0x0;      //滤波设置,经历几个周期跳变认定波形稳定0x0~0xF
  TIM_PWMIConfig(TIM3, &TIM_ICInitStructure);              //根据参数配置TIM外设信息
  TIM_SelectInputTrigger(TIM3, TIM_TS_TI2FP2);            //选择IC2为始终触发源
  TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);//TIM从模式:触发信号的上升沿重新初始化计数器和触发寄存器的更新事件
  TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable); //启动定时器的被动触发
  TIM_Cmd(TIM3, ENABLE);                                 //启动TIM2        
  TIM_ITConfig(TIM3, TIM_IT_CC2, ENABLE);     //打开中断 

}

void WM_GPIO(void) 

  GPIO_InitTypeDef GPIO_InitStructure; 
  /*------RCC初始化中开启IO时钟-----*/ 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); 
  /*---------4路PWM输出利用--------*/ 
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;   //TIME1 WM引脚复用为PA.8.9.10 
  GPIO_InitStructure.GPIO_Mode =   GPIO_Mode_AF_PP;                                                                                                                                                          
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
  GPIO_Init(GPIOA, &GPIO_InitStructure); 
 


void WM_Config(void) 

        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
  /*------------------三路互补PWM输出配置-------------------*/  
  TIM_TimeBaseStructure.TIM_Prescaler = 24-1; 
  TIM_TimeBaseStructure.TIM_Period = 1000;  //1K
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; 
  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; 

  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); 
   
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                     //TIM1 脉冲调制模式2 
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;     //使能输出比较状态 
  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;     //使能输出比较N状态 
  TIM_OCInitStructure.TIM_Pulse = 900;                        //比较寄存器的脉冲值 
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;             //输出比较极性低 
  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;           //输出比较N极性低 
  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;             
  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset; 

  TIM_OC1Init(TIM2, &TIM_OCInitStructure); 
  TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);        
  TIM_Cmd(TIM2, ENABLE);  
}

void TIM3_IRQHandler(void)
{
 
  TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);        //清楚TIM的中断待处理位 
  IC2Value = TIM_GetCapture2(TIM3);                //读取IC2捕获寄存器的值,即为PWM周期的计数值
  if (IC2Value != 0)
  {  
    DutyCycle = (TIM_GetCapture1(TIM3) * 100) / IC2Value;  //读取IC1捕获寄存器的值,并计算占空比
    Frequency = 1000000 / IC2Value;                        //计算PWM频率。
printf("DutyCycle = %d \r\n",DutyCycle);
printf("Frequency= %d \r\n",Frequency);
  }
  else
  {
    DutyCycle = 0;
   Frequency = 0;
  }



 


 


?成功只是最后一小步的坚持!
回复 支持 反对

使用道具 举报

2

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2013-3-16
在线时间
7 小时
发表于 2013-8-8 15:16:18 | 显示全部楼层
mark
回复 支持 反对

使用道具 举报

23

主题

51

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
216
金钱
216
注册时间
2014-3-22
在线时间
26 小时
发表于 2014-5-16 15:51:58 | 显示全部楼层
为什么不降这个值TIM_GetCapture1(TIM3)加一啊??求解
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-7 22:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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