OpenEdv-开源电子网

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

STM32的timer_ch3的输入捕获,我参照原子哥的程序改的,为什么我的捕获值是错误的

[复制链接]

5

主题

25

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2016-6-29
在线时间
17 小时
发表于 2016-8-4 09:50:57 | 显示全部楼层 |阅读模式
#include "timer3.h"
//设置NVIC分组
//NVIC_Group:NVIC分组 0~4 总共5组                   
void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group)         
{
        u32 temp,temp1;          
        temp1=(~NVIC_Group)&0x07;//取后三位
        temp1<<=8;
        temp=SCB->AIRCR;  //读取先前的设置
        temp&=0X0000F8FF; //清空先前分组
        temp|=0X05FA0000; //写入钥匙
        temp|=temp1;          
        SCB->AIRCR=temp;  //设置分组                                                        
}
//NVIC_SubPriority和NVIC_PreemptionPriority的原则是,数值越小,越优先          
void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group)         
{
        u32 temp;       
        MY_NVIC_PriorityGroupConfig(NVIC_Group);//设置分组
        temp=NVIC_PreemptionPriority<<(4-NVIC_Group);          
        temp|=NVIC_SubPriority&(0x0f>>NVIC_Group);
        temp&=0xf;                                                                //取低四位  
        NVIC->ISER[NVIC_Channel/32]|=(1<<NVIC_Channel%32);//使能中断位(要清除的话,相反操作就OK)
        NVIC->IP[NVIC_Channel]|=temp<<4;                //设置响应优先级和抢断优先级                                                           
}
//定时器5通道1输入捕获配置
//arr:自动重装值
//psc:时钟预分频数
void TIM3_Cap_Init(u16 arr,u16 psc)
{                 

          RCC->APB1ENR|=1<<1;           //TIM3 时钟使能
                RCC->APB2ENR|=1<<3;            //使能PORTB时钟  

        GPIOB->CRL&=0XFF0FFFFF;        //PB0 清除之前设置  
        GPIOB->CRL|=0X00B00000;        //PB0 输入   
        GPIOB->ODR|=0<<0;                    //PB0 下拉

          
        TIM3->ARR=arr;                  //设定计数器自动重装值   
        TIM3->PSC=psc;                  //预分频器

        TIM3->CCMR2|=1<<0;                //CC3S=01         选择输入端映射到TI3上
       
        TIM3->CCMR2|=0<<4;                 //IC1F=0000 配置输入滤波器 不滤波
        TIM3->CCMR2|=0<<10;         //IC2PS=00         配置输入分频,不分频

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

        TIM3->DIER|=1<<1;           //允许捕获中断                               
        TIM3->DIER|=1<<0;           //允许更新中断       
        TIM3->CR1|=0x01;            //使能定时器2
        MY_NVIC_Init(2,0,TIM3_IRQn,2);//抢占2,子优先级0,组2          
}

//捕获状态
//[7]:0,没有成功的捕获;1,成功捕获到一次.
//[6]:0,还没捕获到高电平;1,已经捕获到高电平了.
//[5:0]:捕获高电平后溢出的次数
u8  TIM3CH1_CAPTURE_STA=0;        //输入捕获状态                                                   
u16        TIM3CH1_CAPTURE_VAL;        //输入捕获值
////定时器5中断服务程序         
void TIM3_IRQHandler(void)
{                     
        u16 tsr;
        tsr=TIM3->SR;
        if((TIM3CH1_CAPTURE_STA&0X80)==0)//还未成功捕获一次高电平脉冲
        {
                if(tsr&0X01)//溢出
                {            
                        if(TIM3CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
                        {
                                if((TIM3CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
                                {
                                        TIM3CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次
                                        TIM3CH1_CAPTURE_VAL=0XFFFF;
                                }
        //else TIM3CH1_CAPTURE_STA++;
                        }         
                }
                if(tsr&0x02)//捕获1发生捕获事件
                {       
                        if(TIM3CH1_CAPTURE_STA&0X40)                //捕获到第二次上升沿       
                        {                                 
                                TIM3CH1_CAPTURE_STA|=0X80;                //标记成功捕获到一次高电平脉宽
                          TIM3CH1_CAPTURE_VAL=TIM3->CCR3;        //获取当前的捕获值,在定时器timer3的通道3上
                                 TIM3->CCER&=~(1<<1);                        //CC1P=0 设置为上升沿捕获
                        }
                        else                                                                  //还未开始,第一次捕获上升沿
                        {
                                TIM3CH1_CAPTURE_STA=0;                        //清空
                                TIM3CH1_CAPTURE_VAL=0;
                                TIM3CH1_CAPTURE_STA|=0X40;                //标记捕获到了上升沿
                                 TIM3->CNT=0;                                        //计数器清空
                                 TIM3->CCER|=~(1<<1); //CC1P=1 设置为上升沿捕获
                        }                    
                }                                                                                   
        }
        TIM3->SR=0;//清除中断标志位             
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

25

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2016-6-29
在线时间
17 小时
 楼主| 发表于 2016-8-4 09:55:56 | 显示全部楼层
我这个是用来测量交流电频率的,用开发版的例子做的PA0,timer5_ch1就可以采集正确的20ms,,但是我改成PB0, timer3_Ch3就不对了,数字是错误的。希望大家帮我看下,谢谢了。刚接触STM32,不熟悉!
回复 支持 反对

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-8-4 10:04:09 | 显示全部楼层
红尘笑客288 发表于 2016-8-4 09:55
我这个是用来测量交流电频率的,用开发版的例子做的PA0,timer5_ch1就可以采集正确的20ms,,但是我改成PB0, ...

接进来的信号作过0处理了没
回复 支持 反对

使用道具 举报

20

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
407
金钱
407
注册时间
2016-3-27
在线时间
104 小时
发表于 2016-8-4 10:31:55 | 显示全部楼层
憨厚诚实大叔 发表于 2016-8-4 10:04
接进来的信号作过0处理了没

求教一下 什么是过0处理?
回复 支持 反对

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-8-4 10:36:47 | 显示全部楼层
百度过0处理,你交流电是正弦波还是方波。
回复 支持 反对

使用道具 举报

5

主题

25

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2016-6-29
在线时间
17 小时
 楼主| 发表于 2016-8-4 13:42:39 | 显示全部楼层
憨厚诚实大叔 发表于 2016-8-4 10:36
百度过0处理,你交流电是正弦波还是方波。

是方波,已经过零处理了,大神帮我看下哪里的问题。用原子的程序就可以,他用的PA0,定时器5的通道0就可以,我换成PB0,timer3的通道3就不行了
回复 支持 反对

使用道具 举报

5

主题

25

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2016-6-29
在线时间
17 小时
 楼主| 发表于 2016-8-4 13:43:34 | 显示全部楼层
希望阿 发表于 2016-8-4 10:31
求教一下 什么是过0处理?

过零处理,就是过零比较。比0V高的为高电平,比0V低的为低电平
回复 支持 反对

使用道具 举报

5

主题

25

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2016-6-29
在线时间
17 小时
 楼主| 发表于 2016-8-4 13:44:15 | 显示全部楼层
各位大神帮我看下!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 19:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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