OpenEdv-开源电子网

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

输入捕获问题

[复制链接]

6

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2017-8-21
在线时间
15 小时
发表于 2017-9-26 09:56:30 | 显示全部楼层 |阅读模式
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]


QQ截图20170926095536.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-9-26 21:04:35 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-17 20:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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