블루 브리지 삽입식 TIM의 입력 캡처Again (1)

이 규칙은 입력 신호의 주파수만 포획할 수 있으며, 대응하는 비례를 포획하려면 여기를 참고할 수 있다
프로젝트 가시성 Github1

1. 주요 코드

main.c
/*******************************************************************************
*    :main.c
*     :
*     :CLAY
*    :v1.0.0
*     : 2019 2 19 
*     :    LCD  
*         PA7 (TIM3_CH2)           (     )
*******************************************************************************
*/

#include "stm32f10x.h"
#include "lcd.h"
#include "e2prom.h"
#include "stdio.h"
#include "i2c.h"
#include "adc.h"
#include "rtc.h"
#include "usart2.h"
#include "pwm.h"
#include "pwm_oc.h"
#include "pwm_ic.h"

u32 TimingDelay = 0;
u8 RxdCnt = 0;
u8 RxdOver = 0;
u8 RxdBuf[20];
void Delay_Ms(u32 nTime);
u8 RTC_Flag = 0;

extern __IO uint32_t TIM3Freq;

//Main Body
int main(void)
{	
	u8 str[20];
	
	STM3210B_LCD_Init();
	LCD_Clear(Blue);
	LCD_SetBackColor(Blue);
	LCD_SetTextColor(White);
	
	SysTick_Config(SystemCoreClock/1000);
	
	//PWM_Init(500, 60);//500Hz 60%  
	PWM_OC_Init(500, 60);//500Hz 60%  
	
	
	PWM_IC_Init();
	while(1)
	{
		sprintf((char *)str, "  Freq = %d     ", TIM3Freq);//      ,        
		LCD_DisplayStringLine(Line5, str);
		Delay_Ms(200);
	}
}

//
void Delay_Ms(u32 nTime)
{
	TimingDelay = nTime;
	while(TimingDelay != 0);	
}

pwm_ic.c
#include "stm32f10x.h"

void PWM_IC_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_ICInitTypeDef  TIM_ICInitStructure;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	
	//           
	TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
	TIM_TimeBaseStructure.TIM_Prescaler = 71;
	TIM_TimeBaseStructure.TIM_ClockDivision = 0;
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);//        (        )
	
	
	TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
	TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
	TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
	TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
	TIM_ICInitStructure.TIM_ICFilter = 0x0;
	TIM_ICInit(TIM3, &TIM_ICInitStructure);
	
	TIM_Cmd(TIM3, ENABLE);
	TIM_ITConfig(TIM3, TIM_IT_CC2, ENABLE);
}

pwm_ic.h
#ifndef _PWM_IC_H
#define _PWM_IC_H

void PWM_IC_Init(void);

#endif

stm32f10x_it.c
...
__IO uint16_t IC3ReadValue1 = 0, IC3ReadValue2 = 0;
__IO uint16_t CaptureNumber = 0;
__IO uint32_t Capture = 0;
__IO uint32_t TIM3Freq = 0;

void TIM3_IRQHandler(void)
{ 
	if(TIM_GetITStatus(TIM3, TIM_IT_CC2) == SET) 
	{
		/* Clear TIM3 Capture compare interrupt pending bit */
		TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);
		if(CaptureNumber == 0)
		{
			/* Get the Input Capture value */
			IC3ReadValue1 = TIM_GetCapture2(TIM3);
			CaptureNumber = 1;
		}
		else if(CaptureNumber == 1)
		{
			/* Get the Input Capture value */
			IC3ReadValue2 = TIM_GetCapture2(TIM3); 

			/* Capture computation */
			if (IC3ReadValue2 > IC3ReadValue1)
			{
				Capture = (IC3ReadValue2 - IC3ReadValue1); 
			}
			else
			{
				Capture = ((0xFFFF - IC3ReadValue1) + IC3ReadValue2); 
			}
			/* Frequency computation */ 
			TIM3Freq = 1000000 / Capture;
			CaptureNumber = 0;
		}
	}
}
...

주의사항


루틴 참조 경로: \ \STM32 v3.5\stm32f10x_stdperiph_lib\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\TIM\InputCapture구문을 사용합니다.및 4main.c1、포획 타이머가 없는 설정을 입력하려면 별도로 추가해야 합니다!또한 주의해서 덧붙일 때는 복사해서 바로 사용하지 말고 자신이 어떤 TIM을 사용하는지 똑똑히 보세요

2、루틴의 인터럽트 중 stm32f10xit.c TIM3Freq = (uint32 t) SystemCoreClock / Capture로 변경하려면


3. 주함수 안의 데이터는 지난 차장의 데이터가 이번 짧은 데이터를 덮어쓰는 영향을 피하고 뒤에 빈칸을 넣는 것이 좋은 작업이다.

좋은 웹페이지 즐겨찾기