OpenEdv-开源电子网

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

使用STM32的TIM3_CH2进行输入捕获一段负电平,负电平结束后会跳变到高定平,捕获这个上升沿不成功

[复制链接]

7

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2013-3-4
在线时间
0 小时
发表于 2013-8-4 21:20:39 | 显示全部楼层 |阅读模式
使用STM32F103RBT6处理器,使用PA7管脚对应的TIM3_CH2进行输入捕获,捕获一段负电平长度(负电平结束时会直接跳变到+3V左右)。
由于硬件电路设计,我的程序“任务2”用来产生一段负电平,但是这段负电平维持一段时间后(毫秒级)会自动跳变到高电平,所以我想用TIM3_CH2的上升沿捕获这段电平的长度,即从任务2开始之后打开定时器3,然后阻塞程序直到上升沿到来,然后在定时器中断中捕获这段负电平长度。因为没有做过类似的输入捕获工作,是照原子哥的例程仿写的,但是一直没有成功,而且出现了一些比较奇怪的现象:为了调试,我在定时器3的中断中加入了一些打印信息,我是在while循环里打开定时器3的,但无论是否注释掉这一句,第一次循环的时候都会在固定位置(任务1后边)打印定时器3中断的信息……
部分代码如下:

//定时器3通道2输入捕获初始化
void TIM3_Cap_Init(u16 arr,u16 psc)
{  
RCC->APB1ENR|=1<<1;   //TIM3 时钟使能 
RCC->APB2ENR|=1<<2;     //使能PORTA时钟

GPIOA->CRL&=0X0FFFFFFF; //PA7 清除之前设置  
GPIOA->CRL|=0X80000000; //PA7 输入   
GPIOA->ODR|=1<<7; //PA7 上拉
 
  TIM3->ARR=arr;   //设定计数器自动重装值   
TIM3->SC=psc;   //预分频器 

TIM3->CCMR1|=1<<8; //CC2S=01 选择输入端 IC2映射到TI2上
  TIM3->CCMR1|=0<<12; //IC2F=0000 配置输入滤波器 不滤波
  TIM3->CCMR1|=0<<10; //IC2PSC=00 配置输入分频,不分频 

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

TIM3->DIER|=1<<2;   //使能捕获中断
TIM3->DIER|=1<<0;   //使能更新中断
TIM3->CR1&=0x00;             //关闭定时器3
MY_NVIC_Init(2,0,TIM3_IRQChannel,2);//抢占2,子优先级0,组2   
}

u8  TIM3CH2_CAPTURE_STA=0; //输入捕获状态    
u16 TIM3CH2_CAPTURE_VAL=0; //输入捕获值
//定时器3中断服务程序
u8 T3_Num = 0;  
void TIM3_IRQHandler(void)
{    
u16 tsr;
printf("AD Capture\n");
tsr=TIM3->SR;
  if(0 == T3_Num)
{
T3_Num++;//第一次开定时器会产生中断,避过这次中断
}
else {
if((TIM3CH2_CAPTURE_STA&0X1)==0)//main函数中将TIM3CH2_CAPTURE_VAL置零才能开启下一次捕获
{
printf("AD Capture 1\n");
// if(tsr&0x02)//捕获1发生捕获事件
if(tsr&0x04)//捕获2发生捕获事件
{
TIM3CH2_CAPTURE_STA = 1; //标记为一次捕获
printf("AD Capture 2\n");
TIM3CH2_CAPTURE_VAL = TIM3->CCR2; //获取捕获值
printf("Capture_value:%f\n",TIM3CH1_CAPTURE_VAL);    
}           
  }
TIM3->SR=0;//清除中断标志位
TIM3->CR1 &= 0x00;
}    
}

//主程序
extern u8  TIM3CH2_CAPTURE_STA;    
extern u16 TIM3CH2_CAPTURE_VAL;
int main(void)
{
        Stm32_Clock_Init(9); //系统时钟设置
delay_init(72);     //延时初始化
uart_init(72,115200);
        TIM3_Cap_Init(19999,7199);
        while(1) 
{
                任务1();
                任务2();
                TIM3->CR1 |= 0x01; //开启定时器3
                while(0 == TIM3CH2_CAPTURE_STA);
        }
}
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-4 22:48:38 | 显示全部楼层
加printf在中断,会严重影响实时性.
你输入捕获,一个printf可能就导致丢失N个波了...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2013-3-4
在线时间
0 小时
 楼主| 发表于 2013-8-5 00:50:11 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
谢谢原子哥,我会把大部分去掉再做实验的,但是为什么打印捕获的数据一直是2.15……之类的一个小数呢?而且我调整输入电平的时长,捕获寄存器也是没有丝毫变化……一定是哪里有问题,但是我还没有找到。
不知道这样设置输入捕获有没有错?
回复 支持 反对

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2013-7-30
在线时间
0 小时
发表于 2013-8-5 10:55:23 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
我也遇到了同样的问题,我用TIM3_CH1进行输入捕获高电平,但每次捕获的都是固定一个数。而且我还试了一下操作寄存器的输入捕获例程,到好像不能在WarSHIP开发版上运行,按下键之后串口调试助手也没有显示数据?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-5 22:01:25 | 显示全部楼层
建议楼上两位用JTAG跟踪,分析下代码,上升沿下降沿可以通过杜邦线接VCC,GND来触发,这样可以慢慢的测试,而不用担心多个脉冲的问题。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2013-3-4
在线时间
0 小时
 楼主| 发表于 2013-8-5 23:38:58 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
多谢版主,我一定去实验一下。
回复 支持 反对

使用道具 举报

7

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2013-3-4
在线时间
0 小时
 楼主| 发表于 2013-8-6 14:14:49 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
可不可以利用端口映射发送一段高低电平给PA7口进行测试呢?
回复 支持 反对

使用道具 举报

7

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2013-3-4
在线时间
0 小时
 楼主| 发表于 2013-8-6 14:20:26 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
原子哥,刚才在别的帖子里看到您的回复,是不是STM32捕获一段负电压有风险啊?
我现在做的是正负电平翻转的一个实验,从-5V左右跳变到+3V左右,捕获-5V电平的宽度。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-6 16:54:42 | 显示全部楼层
回复【8楼】绘梦之卷:
---------------------------------
....
没烧算不错了...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2013-3-4
在线时间
0 小时
 楼主| 发表于 2013-8-6 17:13:21 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
哎……看来要改硬件了……
回复 支持 反对

使用道具 举报

7

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2013-3-4
在线时间
0 小时
 楼主| 发表于 2013-8-7 10:33:09 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
原子哥,今天有机会又测量了一下,也仿真了一下,因为CPU的IO口有二极管,所以负电压不会超过-600mv,我有实际测量也做了电路仿真,结果是有-600mv到+3V的一个跳变,请问这个上升沿可以用STM32的输入捕获嘛?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-15 17:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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