OpenEdv-开源电子网

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

迷你STM32定时器输入捕获实验

[复制链接]

18

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
138
金钱
138
注册时间
2013-7-6
在线时间
0 小时
发表于 2013-8-14 14:53:39 | 显示全部楼层 |阅读模式
         


用迷你stm32做一个定时器4,通道二的输入捕获实验,但是不能捕获持续的脉冲,本来是想观察PWM波的变化,随着脉冲电平的不停变化,串口应该显示不同大小的时间,但是结果却显示这个

     

 

 

 

BUHUO.C

#include "buhuo.h"
#include "sys.h"
//定时器4通道2输入捕获配置
//arr:自动重装值
//psc:时钟预分频数
void tim42_cap_init(u16 arr,u16 psc)
{
 RCC->APB1ENR|=1<<2;//使能定时器4时钟
 RCC->APB2ENR|=1<<3;//使能PORTB时钟

 GPIOB->CRL&=0X0FFFFFFF;//PB7清除之前设置
 GPIOB->CRL|=0X80000000;//设置PB7为输入
 GPIOB->ODR|=0<<7;//PB7下拉

 TIM4->ARR=arr;//设定自动重装值
 TIM4->SC=psc;//预分频器值

 TIM4->CCMR1|=1<<8;//IC2映射到TI2上
 TIM4->CCMR1|=0<<12;//无滤波,以fDTS采样
 TIM4->CCMR1|=0<<10;//无预分频

 TIM4->CCER|=0<<5;//CC2P=0,高电平触发
 TIM4->CCER|=1<<4;//CC2E=1,定时器4通道2捕获使能

 TIM4->DIER|=1<<2;//CC2DE=1允许定时器4通道2捕获中断
 TIM4->DIER|=1<<0;//允许更新中断

 TIM4->CR1|=0X01;//使能定时器4
 MY_NVIC_Init(1,1,TIM4_IRQChannel,2);//抢占1,子1,组2
}
//捕获状态
//[7]:0,没有成功的捕获;1,成功捕获到一次.
//[6]:0,还没捕获到高电平;1,已经捕获到高电平了.
//[5:0]:捕获高电平后溢出的次数
u8  TIM4CH2_CAPTURE_STA=0; //输入捕获状态          
u16 TIM4CH2_CAPTURE_VAL; //输入捕获值
//定时器5中断服务程序 
void TIM4_IRQHandler(void)
{      
 u16 tsr;
 tsr=TIM4->SR;
  if((TIM4CH2_CAPTURE_STA&0X80)==0)//还未成功捕获 
 {
  if(tsr&0X01)//溢出
  {    
   if(TIM4CH2_CAPTURE_STA&0X40)//已经捕获到高电平了
   {
    if((TIM4CH2_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
    {
     TIM4CH2_CAPTURE_STA|=0X80;//标记成功捕获了一次
     TIM4CH2_CAPTURE_VAL=0XFFFF;
    }else TIM4CH2_CAPTURE_STA++;
   } 
  }
  if(tsr&0x04)//捕获1发生捕获事件
  { 
   if(TIM4CH2_CAPTURE_STA&0X40)  //捕获到一个下降沿   
   {      
    TIM4CH2_CAPTURE_STA|=0X80;  //标记成功捕获到一次高电平脉宽
       TIM4CH2_CAPTURE_VAL=TIM4->CCR1; //获取当前的捕获值.
     TIM4->CCER&=~(1<<5);   //CC1P=0 设置为上升沿捕获
   }else          //还未开始,第一次捕获上升沿
   {
    TIM4CH2_CAPTURE_STA=0;   //清空
    TIM4CH2_CAPTURE_VAL=0;
    TIM4CH2_CAPTURE_STA|=0X40;  //标记捕获到了上升沿
     TIM4->CNT=0;     //计数器清空
     TIM4->CCER|=1<<5;     //CC1P=1 设置为下降沿捕获
   }     
  }                    
  }
 TIM4->SR=0;//清除中断标志位     
}

主函数

#include "sys.h"
#include "delay.h"
#include "buhuo.h"
#include "usart.h"
#include "pwm.h"
//输入捕获实验,捕获pwm,看pwm波的变化
extern u8  TIM4CH2_CAPTURE_STA;  //输入捕获状态          
extern u16 TIM4CH2_CAPTURE_VAL; //输入捕获值
int main(void)
{
 u32 temp=0;
 Stm32_Clock_Init(9);//系统时钟设置72MHZ
 uart_init(72,9600);//串口初始化时钟频率72MHZ,波特率9600
 delay_init(72);//延时初始化,系统时钟72MHZ
 pwm_init(719,999);//1000分频,PWM波频率72MHZ/720/1000=100hz
 tim42_cap_init(0xffff,72-1);//定时器计数频率1MHZ
 while(1)
 {
  delay_ms(10);
  led0_pwm_val=360;
//  led0_pwm_val++;
//  if(led0_pwm_val==300)
//   led0_pwm_val=0;
  if(TIM4CH2_CAPTURE_STA&0x80)
  {
   temp=TIM4CH2_CAPTURE_STA&0X3F;
   temp=temp*65536;
   temp=temp+TIM4CH2_CAPTURE_VAL;
   printf("HIGH:%d us\n",temp);
   TIM4CH2_CAPTURE_STA=0;
  }
 }
}
用把PB7(定时器4通道2)通过按键接在VCC3.3V上,通过按键输入又可以正常显示,由于示波器已经说明PA7输出的PWM波没问题,就不粘出代码。看了很久没找到原因,也对着大板子的例程看了,找不到问题所在。

第二个问题



 

这个映射不同有什么作用,看着数据手册的那图也没给出什么介绍。

 


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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-14 15:45:11 | 显示全部楼层
回复【楼主位】lingyue502:
---------------------------------
IC1可以映射到TI1或TI2上,所以要设置映射到哪一个。
你的PWM输出波形周期为10ms,高电平时间为5ms,这个很快了。
用我们的输入捕获程序,可以捕获一些波形,但是肯定有很多是漏了的。。。
你可以把PWM频率降低到10Hz试试。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2013-7-11
在线时间
0 小时
发表于 2013-8-14 16:17:47 | 显示全部楼层
             直接使用PWM输入模式应该很方便的,我之前捕获10us脉冲无压力
回复 支持 反对

使用道具 举报

18

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
138
金钱
138
注册时间
2013-7-6
在线时间
0 小时
 楼主| 发表于 2013-8-16 21:08:18 | 显示全部楼层
恩,已经找到原因了,测了50uS,可以
回复 支持 反对

使用道具 举报

20

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
187
金钱
187
注册时间
2013-8-14
在线时间
8 小时
发表于 2013-8-17 14:36:54 | 显示全部楼层
回复【4楼】lingyue502:
---------------------------------
啥原因哈 我表示很关注  我也遇到了类似问题
回复 支持 反对

使用道具 举报

18

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
138
金钱
138
注册时间
2013-7-6
在线时间
0 小时
 楼主| 发表于 2013-8-17 15:27:14 | 显示全部楼层
TIM4->CCR1改成TIM4->CCR2,TIMx->CCRy
TIM4CH2_CAPTURE_VAL=TIM4->CCR1; //获取当前的捕获值.
回复 支持 反对

使用道具 举报

5

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2013-8-18
在线时间
8 小时
发表于 2013-8-19 18:36:17 | 显示全部楼层
输入捕获周期,在频率大于70kHz,会丢数据的。

但理论上可以捕获到更高的频率周期。

我也遇到了类似问题,没有时间去细研究。

不知道有没有研究过的来分析分析。
回复 支持 反对

使用道具 举报

12

主题

63

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
408
金钱
408
注册时间
2016-1-28
在线时间
72 小时
发表于 2016-5-13 22:14:31 | 显示全部楼层
楼主问题解决了吗
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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