野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9927|回复: 14

怎么测量一个高电平的时间?

[复制链接]
发表于 2015-11-21 19:45:49 | 显示全部楼层 |阅读模式
外部中断不可以么?用定时器怎么测?求指教,谢谢!
回复

使用道具 举报

发表于 2015-11-22 12:13:37 | 显示全部楼层
用定时器的脉宽捕获,虽然在野火论坛,但我想说正点原子那边有例程,试过,效果不错
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-22 14:40:30 | 显示全部楼层
#include "stm32f10x.h"
#include "cj.h"
#include "bsp_usart1.h"
#include "bsp_key.h"
#include "bsp_exti.h"

/**
  * @brief  Ö÷oˉêy
  * @param  ÎT
  * @retval ÎT
  */
int main(void)
{
        Key_GPIO_Config();
  UltrasonicWave_Init();
       
        EXTI_PC13_Config();
       
        RCC_APB1PeriphClockCmd(RCC_APB2Periph_TIM8 , ENABLE);
        //TIM8_CC_IRQHandler();
          
        //UltrasonicWave_StartMeasure();
        while(1);
          /* add your code here ^_^. */
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-22 14:40:55 | 显示全部楼层
/*
*          | PC8  - TRIG      |
*          | PC7  - ECHO      |
*           ------------------
*********************************************************************************/

#include "cj.h"
/*
3¬éù2¨Ä£¿é3õê¼»ˉ   
*/

//TIM_ICInitTypeDef  TIM8_ICInitStructure;

void UltrasonicWave_Init(void)
{
        
  GPIO_InitTypeDef GPIO_InitStructure;        
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_ICInitTypeDef  TIM8_ICInitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
        

  GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);      
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE);

  GPIO_InitStructure.GPIO_Pin = TRIG_PIN_0;                                         //PC8½óTRIG
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                     //íÆíêêä3ö
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 
  GPIO_Init(TRIG_PORT_0, &GPIO_InitStructure);                         //3õê¼»ˉíaéèμÄGPIO

  GPIO_InitStructure.GPIO_Pin = ECHO_PIN_0;                                     //PC7½óECH0
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;              
  GPIO_Init(ECHO_PORT_0,&GPIO_InitStructure);   
        

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);        //ê1ÄüTIM8
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);  //GPIOCê±Öó
        
        
        //3õê¼»ˉ TIM8         
  TIM_TimeBaseStructure.TIM_Period = 0xffff;
  TIM_TimeBaseStructure.TIM_Prescaler =72-1;         
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIMÏòéϼÆêyÄ£ê½
  TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
  TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);

        //3õê¼»ˉTIM8êäèë2¶»ñ2Îêy
  TIM8_ICInitStructure.TIM_Channel = TIM_Channel_2;
  TIM8_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;      
  TIM8_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
  TIM8_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;  
  TIM8_ICInitStructure.TIM_ICFilter = 0x00;
  TIM_ICInit(TIM8, &TIM8_ICInitStructure);
        
        //ÖD¶Ï·Ö×é3õê¼»ˉ
   NVIC_InitStructure.NVIC_IRQChannel = TIM8_CC_IRQn;  
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&NVIC_InitStructure);  
        
  TIM_ITConfig(TIM8,TIM_IT_CC2,ENABLE);      
        
  TIM_Cmd(TIM8,ENABLE );              
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-22 14:41:16 | 显示全部楼层
#ifndef __CJ_H
#define        __CJ_H

#include "stm32f10x.h"
#include <stdio.h>


#define        TRIG_PORT_0      GPIOC                //TRIG      
#define        ECHO_PORT_0      GPIOC                //ECHO
#define        TRIG_PIN_0       GPIO_Pin_8 //TRIG      
#define        ECHO_PIN_0       GPIO_Pin_7        //ECHO   

#define        TRIG_PORT_1      GPIOC                //TRIG      
#define        ECHO_PORT_1      GPIOC                //ECHO
#define        TRIG_PIN_1       GPIO_Pin_8 //TRIG      
#define        ECHO_PIN_1       GPIO_Pin_7        //ECHO  

#define        TRIG_PORT_2      GPIOC                //TRIG      
#define        ECHO_PORT_2      GPIOC                //ECHO
#define        TRIG_PIN_2       GPIO_Pin_8 //TRIG      
#define        ECHO_PIN_2       GPIO_Pin_7        //ECHO  
void UltrasonicWave_Init(void);
//int fputc(int ch, FILE *f);
//void USART1_printf(USART_TypeDef* USARTx, uint8_t *Data,...);

#endif
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-22 14:41:41 | 显示全部楼层
/**
  ******************************************************************************
  * @file    Project/STM32F10x_StdPeriph_Template/stm32f10x_it.c
  * @author  MCD Application Team
  * @version V3.5.0
  * @date    08-April-2011
  * @brief   Main Interrupt Service Routines.
  *          This file provides template for all exceptions handler and
  *          peripherals interrupt service routine.
  ******************************************************************************
  * @attention
  *
  * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
  * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
  * DIRECT, INDIRECT OR CONSEQUENTI
  
  AL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
  * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
  * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  *
  * <h2><center>&copy; COPYRIGHT 2011 STMicroelectronics</center></h2>
  ******************************************************************************
  */

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x_it.h"
#include "bsp_usart1.h"
#include "cj.h"

void Delay(__IO uint32_t ncount)   //yanshi
{
   for(; ncount !=0;ncount--);
}


u8 Flag_Obstruction=0;

u8 TIM8CH2_CAPTURE_STA = 0;    //í¨μà2μ&#196;2&#182;&#187;&#241;±ê&#214;&#190;            
u16 TIM8CH2_CAPTURE_UPVAL;
u16 TIM8CH2_CAPTURE_DOWNVAL;
u32 tempup2 = 0;     //2&#182;&#187;&#241;×üμ&#196;&#184;&#223;μ&#231;&#198;&#189;μ&#196;ê±&#188;&#228;
u32 TIM8_T2;            
float UltrasonicWave_Distance;      //&#188;&#198;&#203;&#227;3&#246;&#190;àà&#235;

/** @addtogroup STM32F10x_StdPeriph_Template
  * @{
  */

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/

/******************************************************************************/
/*            Cortex-M3 Processor Exceptions Handlers                         */
/******************************************************************************/

/**
  * @brief  This function handles NMI exception.
  * @param  None
  * @retval None
  */
void NMI_Handler(void)
{
}

/**
  * @brief  This function handles Hard Fault exception.
  * @param  None
  * @retval None
  */
void HardFault_Handler(void)
{
  /* Go to infinite loop when Hard Fault exception occurs */
  while (1)
  {
  }
}

/**
  * @brief  This function handles Memory Manage exception.
  * @param  None
  * @retval None
  */
void MemManage_Handler(void)
{
  /* Go to infinite loop when Memory Manage exception occurs */
  while (1)
  {
  }
}

/**
  * @brief  This function handles Bus Fault exception.
  * @param  None
  * @retval None
  */
void BusFault_Handler(void)
{
  /* Go to infinite loop when Bus Fault exception occurs */
  while (1)
  {
  }
}

/**
  * @brief  This function handles Usage Fault exception.
  * @param  None
  * @retval None
  */
void UsageFault_Handler(void)
{
  /* Go to infinite loop when Usage Fault exception occurs */
  while (1)
  {
  }
}

/**
  * @brief  This function handles SVCall exception.
  * @param  None
  * @retval None
  */
void SVC_Handler(void)
{
}

/**
  * @brief  This function handles Debug Monitor exception.
  * @param  None
  * @retval None
  */
void DebugMon_Handler(void)
{
}

/**
  * @brief  This function handles PendSVC exception.
  * @param  None
  * @retval None
  */
void PendSV_Handler(void)
{
}

/**
  * @brief  This function handles SysTick Handler.
  * @param  None
  * @retval None
  */
void SysTick_Handler(void)
{
}

void EXTI15_10_IRQHandler(void)
{
        if(EXTI_GetITStatus(EXTI_Line13) != RESET) //è·±£ê&#199;·&#241;2úéúá&#203;EXTI Line&#214;D&#182;&#207;
        {
                  GPIO_SetBits(TRIG_PORT_0,TRIG_PIN_0);  //PC8
                        Delay(20);
                        GPIO_ResetBits(TRIG_PORT_0,TRIG_PIN_0);               
                EXTI_ClearITPendingBit(EXTI_Line13);     //&#199;&#229;3y&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;
        }  
}


//&#182;¨ê±&#198;÷8μ&#196;&#214;D&#182;&#207;·t&#206;&#241;3ìDò   PC7
void TIM8_CC_IRQHandler(void)
{
                if ((TIM8CH2_CAPTURE_STA & 0X80) == 0)            //&#187;1&#206;′3é1|2&#182;&#187;&#241;        
        {
                if (TIM_GetITStatus(TIM8, TIM_IT_CC2) != RESET)     //2&#182;&#187;&#241;1·¢éú2&#182;&#187;&#241;ê&#194;&#188;t
                {
                        TIM_ClearITPendingBit(TIM8, TIM_IT_CC2);                 //&#199;&#229;3y&#214;D&#182;&#207;±ê&#214;&#190;
                        if (TIM8CH2_CAPTURE_STA & 0X40)                //2&#182;&#187;&#241;μ&#189;ò&#187;&#184;&#246;&#207;&#194;&#189;μ&#209;&#216;
                        {
                                TIM8CH2_CAPTURE_DOWNVAL = TIM_GetCapture2(TIM8);//&#188;&#199;&#194;&#188;&#207;&#194;′&#203;ê±μ&#196;&#188;&#198;êy&#198;÷&#214;μ
                                if (TIM8CH2_CAPTURE_DOWNVAL < TIM8CH2_CAPTURE_UPVAL)
                                {            /* è&#231;1&#251;&#188;&#198;êy&#198;÷3&#245;ê&#188;&#214;μ′óóú&#196;&#169;&#206;2&#214;μ&#203;μ&#195;÷&#188;&#198;êyóD&#206;êìa*/
                                        TIM8_T2 = 65535;
                                }
                                else
                                TIM8_T2 = 0;  
                                tempup2 = TIM8CH2_CAPTURE_DOWNVAL - TIM8CH2_CAPTURE_UPVAL+ TIM8_T2;
                                                                //μ&#195;μ&#189;×üμ&#196;&#184;&#223;μ&#231;&#198;&#189;ê±&#188;&#228;
                                tempup2 =tempup2 *17/1000;//&#188;&#198;&#203;&#227;&#190;àà&#235;&&UltrasonicWave_Distance<85
                        
                                printf(" %d   \t",TIM8CH2_CAPTURE_UPVAL);
                                printf(" %d   \t",TIM8CH2_CAPTURE_DOWNVAL);
                                printf("Channel 2 : %d cm\r\n",tempup2);
                                
                                TIM8CH2_CAPTURE_STA = 0;                //2&#182;&#187;&#241;&#206;&#187;&#199;&#229;á&#227;
                                TIM_OC2PolarityConfig(TIM8, TIM_ICPolarity_Rising); //éè&#214;&#195;&#206;aé&#207;éy&#209;&#216;2&#182;&#187;&#241;                 
                        }
                        else //·¢éú2&#182;&#187;&#241;ê&#194;&#188;tμ&#171;2&#187;ê&#199;&#207;&#194;&#189;μ&#209;&#216;£&#172;μúò&#187;′&#206;2&#182;&#187;&#241;μ&#189;é&#207;éy&#209;&#216;£&#172;&#188;&#199;&#194;&#188;′&#203;ê±μ&#196;&#188;&#198;êy&#198;÷&#214;μ
                        {
                                TIM8CH2_CAPTURE_UPVAL = TIM_GetCapture2(TIM8);                //&#187;&#241;è&#161;é&#207;éy&#209;&#216;êy&#190;Y
                                TIM8CH2_CAPTURE_STA |= 0X40;                //±ê&#188;&#199;ò&#209;2&#182;&#187;&#241;μ&#189;é&#207;éy&#209;&#216;
                                TIM_OC2PolarityConfig(TIM8, TIM_ICPolarity_Falling);//éè&#214;&#195;&#206;a&#207;&#194;&#189;μ&#209;&#216;2&#182;&#187;&#241;
                        }
                }
        }
        
        //TIM_ClearITPendingBit(TIM8,TIM_IT_CC2); //&#199;&#229;3y&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;
}   

/******************************************************************************/
/*                 STM32F10x Peripherals Interrupt Handlers                   */
/*  Add here the Interrupt Handler for the used peripheral(s) (PPP), for the  */
/*  available peripheral interrupt handler's name please refer to the startup */
/*  file (startup_stm32f10x_xx.s).                                            */
/******************************************************************************/

/**
  * @brief  This function handles PPP interrupt request.
  * @param  None
  * @retval None
  */
/*void PPP_IRQHandler(void)
{
}*/

/**
  * @}
  */


/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-22 14:42:11 | 显示全部楼层
qiu大哥帮忙看一下。输出不对啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-22 14:45:29 | 显示全部楼层
求解答,新手不会啊
回复 支持 反对

使用道具 举报

发表于 2015-11-22 16:27:26 | 显示全部楼层
直接用V3配套例程,可以测量高电平和低电平的时间
TIM—输入捕获(测量脉宽).zip (544.57 KB, 下载次数: 16)
TIM—输入捕获(电容按键).zip (353.67 KB, 下载次数: 11)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-22 19:53:45 | 显示全部楼层
fire 发表于 2015-11-22 16:27
直接用V3配套例程,可以测量高电平和低电平的时间

火哥,我就是用的你的例程测量脉宽的,好吧,我再好好学习学习
回复 支持 反对

使用道具 举报

发表于 2015-11-23 11:38:28 | 显示全部楼层
小旭旭 发表于 2015-11-22 19:53
火哥,我就是用的你的例程测量脉宽的,好吧,我再好好学习学习

定时器捕获那个例程,确认你的按键是接到定时器通道上
回复 支持 反对

使用道具 举报

发表于 2015-11-23 12:44:17 | 显示全部楼层
小旭旭 发表于 2015-11-22 19:53
火哥,我就是用的你的例程测量脉宽的,好吧,我再好好学习学习

例程用的是PA0测试高电平的时间            
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-23 18:32:11 | 显示全部楼层
fire 发表于 2015-11-23 12:44
例程用的是PA0测试高电平的时间

嗯嗯,现在可以了火哥,我是为了用超声波模块,感觉得到的时间需要把整数位-1小数位-638400,不然时间不对,也不知道为什么。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-23 18:32:59 | 显示全部楼层
flyleaf 发表于 2015-11-23 11:38
定时器捕获那个例程,确认你的按键是接到定时器通道上

嗯嗯,已经可以了,谢谢fly哥!
回复 支持 反对

使用道具 举报

发表于 2015-11-23 22:21:39 | 显示全部楼层
小旭旭 发表于 2015-11-23 18:32
嗯嗯,现在可以了火哥,我是为了用超声波模块,感觉得到的时间需要把整数位-1小数位-638400,不然时间不 ...

解决了就好                     
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-8 14:39 , Processed in 0.043188 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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