OpenEdv-开源电子网

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

STM32 输入捕获测量高低电平问题

[复制链接]

2

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2012-8-30
在线时间
4 小时
发表于 2013-8-30 19:41:56 | 显示全部楼层 |阅读模式

////////////////////////////// tim.c 文件//////////////////////////////////////////
#include"stm32f10x_lib.h"
#include"sys.h"
#include"timer.h"
#include"usart.h"

void Capture_Init(u16 arr,u16 psc)
{
 RCC->APB2ENR|=1<<0;    // AFIO
 RCC->APB1ENR|=1<<2;       //TIM4
 RCC->APB2ENR|=1<<3;    //PORTB
   
  TIM4->ARR=arr;  //自动装载
 TIM4->SC=psc;  //预分频

 GPIOA->CRL&=0XF0FFFFFF;//PB6
 GPIOA->CRL|=0X04000000;//      
 GPIOA->ODR|=1<<6;//PB6

    TIM4->CCMR1|=(1<<0);//IC1映射在TI1
    TIM4->CCMR1|=(3<<4);
    TIM4->CCER&=~(1<<1);//上升沿
    TIM4->CCER|=(1<<0);

    TIM4->DIER|=(1<<1);

    TIM4->CR1|=0x01;    //开启定时器
    NVIC_init(2,3,2,TIM4_IRQChannel);// 

  /* */
void TIM4_IRQHandler(void)
{
   u32 temp,temp1;
  data = TIM4->CCR1;//记录数据
  printf("当前值:%d\r\n",data);
   if((TIM4->CCER&(1<<1))==0) //如果上次开启的是上升沿检测
   {
    temp1=data-last_data;
  if(data>last_data)
  {
   printf("低电平时间:%d\r\n",temp1);
     }
   TIM4->CCER|=(1<<1);  //开启下降沿 
   }
   else       //如果上次开启的是下降沿检测
   {
  temp=data-last_data;
  if(data>last_data)
  {
  printf("高电平时间:%d\r\n",temp);
     }    
  TIM4->CCER&=~(1<<1);//开启上升沿
   } 
    TIM4->SR&=~(1<<1);//清除标志
     last_data=data;      
}
 
////////////////////////////////////pwm.c文件////////////////////////////////////////////

void PWM_init(u16 arr,u16 ccr,u16 psc)
{  //TIM5 CH1 PA0
  RCC->APB1ENR|=(1<<3);      //TIM5 CH1
  RCC->APB2ENR|=(1<<0);         //AFIO
  RCC->APB2ENR|=(1<<2);         //GPIOA
 
  GPIOA->CRL&=0XFFFFFF0;
  GPIOA->CRL|=0X000000B;//GPIOA0
  GPIOA->ODR|=(1<<0);

   TIM5->SC=psc;
   TIM5->ARR=arr;

  TIM5->CCR1=ccr+1;
 
  TIM5->CCMR1|=(1<<3);//输出比较1预装载使能
  TIM5->CCMR1|=(6<<4);//PWM1
  TIM5->CCER|=(1<<0);//使能输出
 
  TIM5->CR1|=(1<<0);



/////////////////////////////////////////main.c文件 ///////////////////////////////////////////////

int main()
{
  RCC_init(9);
  LED_init();
  TIM3_init(1000,35);    //定时器3初始化  用来控制灯的亮灭
  USART_init(19200);  //Usart的初始化
  PWM_init(6000,1000,7199); //产生指定频率,占空比的PWM 
  Capture_Init(40000,7199);   //输入捕获初始化   
   
  while(1)
  {
 
  }


}
上面程序里为什么把 PWM_init(u16 arr,u16 ccr,u16 psc) l里的  arr, ccr  ,psc数值取到某个值以后,输入捕获测得的高低电平就准,但是如果比这个值小的话,测得值就特别不准,这位是为啥呢?程序哪部分有问题?还望大家帮忙看一下

站在孤高的峰顶,任由风左右着已破损的衣衫,拍一拍满是土灰的铠甲,抬起沾满血渍的脸,微笑,凝望远方。名誉、礼仪、谦卑、坚毅、忠诚、骄傲、虔诚……
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-30 22:56:17 | 显示全部楼层
因为得你的CPU忙得过来啊。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2012-8-30
在线时间
4 小时
 楼主| 发表于 2013-9-4 18:23:55 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------原子大哥的意思是定时器里面的串口发送字符串的原因?
站在孤高的峰顶,任由风左右着已破损的衣衫,拍一拍满是土灰的铠甲,抬起沾满血渍的脸,微笑,凝望远方。名誉、礼仪、谦卑、坚毅、忠诚、骄傲、虔诚……
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-4 19:30:23 | 显示全部楼层
回复【3楼】longgyue:
---------------------------------
不是。
我的意思是,你的频率高到一定程度以后,CPU将忙不过来了,就是处理一次中断还没结束,就来第二次中断了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2012-8-30
在线时间
4 小时
 楼主| 发表于 2013-9-4 22:00:32 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
哦哦  这样啊 我再看看
站在孤高的峰顶,任由风左右着已破损的衣衫,拍一拍满是土灰的铠甲,抬起沾满血渍的脸,微笑,凝望远方。名誉、礼仪、谦卑、坚毅、忠诚、骄傲、虔诚……
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-13 16:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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