初级会员

- 积分
- 73
- 金钱
- 73
- 注册时间
- 2017-8-21
- 在线时间
- 15 小时
|
5金钱
输入捕获会出现出现BUG,一些正确的捕获值后会有一个错误值。
输入500ms周期的PWM波,捕获计数。
程序代码如下
[mw_shl_code=applescript,true]#include "includes.h"
u16 Psc ;
/***************************************
函数名:TIM5_CH1_Pro_init
函数参数:
u16 psc : 分频值
函数返回值:无
函数功能:实现定时器TIM5_CH1的输入捕获初始化
函数描述:
TIM5_CH1: PA0
****************************************/
void TIM5_CH1_Pro_init(u16 psc)
{
Psc=psc;
//PA口管脚设置
//打开PA口外设时钟
RCC->APB2ENR|=(1<<2);
//PA0管脚模式配置
GPIOA->CRL &=~(0X3<<0); //输入模式
GPIOA->CRL &=~(0x3<<2); //清零
GPIOA->CRL |=(0X2<<2); //浮空模式
//TIM5模式配置
//打开TIM5外设时钟
RCC->APB1ENR |=(1<<3);
//选择内部时钟作为计数器时钟源
TIM5->SMCR &=~(0X7<<0);
//写入分频值
TIM5->PSC =psc-1;
//写入重装载值
TIM5->ARR =0XFFFF;
//选择计数方式 向上计数
TIM5->CR1 &=~(1<<4);
/******输入通道功能配置*****/
TIM5->CCMR1|=(1<<0); //IC1映射到TI1上
TIM5->CCMR1|=(0<<4); //配置输入滤波器 不滤波
TIM5->CCMR1|=(0<<10); //配置输入分频,不分频
TIM5->CCER|=(0<<1); //上升沿捕获
TIM5->CCER|=(1<<0); //允许捕获计数器的值到捕获寄存器中
TIM5->DIER|=(1<<1); //允许捕获中断
TIM5->CR1|=(1<<0); //使能定时器2
MY_NVIC_init(7-2,1,1,TIM5_IRQn);
}
void TIM5_IRQHandler(void)
{
float time;
static u8 flag=0;
static u16 current_val=0;//表示这一次的捕获值
static u16 last_val=0; //表示上一次的捕获值
static u16 sub_val =0; //表示相邻两次的数值差
//读捕获/比较寄存器并清除中断标志
current_val =TIM5->CCR1 ;
if(flag==0)//第一次触发中断
{
flag++;
}
else //不是第一次
{
if(current_val<last_val)
{
sub_val =0xffff-last_val +current_val;
}
else
{
sub_val =current_val -last_val;
}
time = sub_val * (float)Psc/72000;
printf("该脉冲周期:T=%.1fms\r\n",time);
// TIM5->CNT = 0;
// flag = 0;
}
last_val =current_val;
}[/mw_shl_code]
|
-
|