[Lanqiao Cup Embedded Expansion Board] —PWM入力キャプチャの詳細な説明(公式ウェブサイトプログラム最適化)(プログラムソースコードを添付)

まず第一に、このプログラムはテスト済みであり、公式のWebサイトルーチンよりも安定しているということです。そして、データエラーは非常に小さいです。デューティサイクルが高い場合、公式Webサイトプログラムには深刻なデータジッターが発生します。

STM32-ADC構成の詳細な説明とアプリケーション。例:ADCに関する「割り込みシングルチャネル読み取りADC」、「DMAマルチチャネル読み取りADC」
、この記事の内容は、Blue Bridge Cupのニーズを満たすだけでなく、拡張することもできます。

リンク:https://blog.csdn.net/qq_45689790/article/details/113862143

最適化されたコード

1、static void General_Timer_GPIO_Config(void)

static void General_Timer_GPIO_Config(void)
{
    
    
	GPIO_InitTypeDef GPIO_InitStruct;
	
	RCC_APB2PeriphClockCmd(TIM_CH_GPIO_CLK,ENABLE);

	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_InitStruct.GPIO_Pin = TIM_CH_GPIO_PIN;
	GPIO_Init(TIM_CH_GPIO_PORT,&GPIO_InitStruct);
}

2、static void General_Timer_NVIC_Config(void)

static void General_Timer_NVIC_Config(void)
{
    
    
	NVIC_InitTypeDef 	NVIC_InitStructure;
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
	
	NVIC_InitStructure.NVIC_IRQChannel = General_TIMx_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
}

3、static void General_Timer_Config(void)

static void General_Timer_Config(void)
{
    
    
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_ICInitTypeDef TIM_ICInitStruct;
	
	RCC_APB1PeriphClockCmd(General_TIM_CLK,ENABLE);
	/*------------------初始化时基结构体--------------*/
	TIM_TimeBaseInitStruct.TIM_Prescaler = General_TIM_Prescaler;
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStruct.TIM_Period = General_TIM_Period;
	TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(General_TIM_x,&TIM_TimeBaseInitStruct);
	
	/*------------------输入捕获结构体--------------*/
	TIM_ICInitStruct.TIM_Channel = TIM_Channel_2;
	TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;
	TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;
	TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;
	TIM_ICInitStruct.TIM_ICFilter = 0x0;
	
	TIM_PWMIConfig(General_TIM_x,&TIM_ICInitStruct);
	
	TIM_SelectInputTrigger(General_TIM_x,TIM_TS_TI2FP2);
	
	TIM_SelectSlaveMode(General_TIM_x,TIM_SlaveMode_Reset );
	TIM_SelectMasterSlaveMode(General_TIM_x,TIM_MasterSlaveMode_Enable);
	
	TIM_Cmd(General_TIM_x,ENABLE);
	
	TIM_ITConfig(TIM3, TIM_IT_CC2, ENABLE);
}

4、void General_Timer_Init(void)

void General_Timer_Init(void)
{
    
    
	General_Timer_GPIO_Config();
	General_Timer_NVIC_Config();
	General_Timer_Config();
}

5、 "bsp_GeneralTimer.h"

#ifndef _BSP_GENERALTIMER_H_
#define	_BSP_GENERALTIMER_H_

#include "stm32f10x.h"
		
#define TIM_CH_GPIO_PORT						GPIOA
#define TIM_CH_GPIO_PIN							GPIO_Pin_7
#define TIM_CH_GPIO_CLK							RCC_APB2Periph_GPIOA
	
//TIM3_CH2		
#define General_TIM_x							TIM3
#define General_TIM_CLK							RCC_APB1Periph_TIM3


#define General_TIM_Prescaler					(72-1)
#define General_TIM_Period						(0xffff)

#define General_TIMx_IRQn						TIM3_IRQn

void General_Timer_Init(void);

#endif /*_BSP_GENERALTIMER_H_*/

6、メイン

int main(void)
{
    
    
	LED_GPIO_Config();
	STM3210B_LCD_Init();
	General_Timer_Init();
	LCD_SetTextColor(White);
	LCD_SetBackColor(Blue);
	LCD_Clear(Blue);
	LCD_DisplayStringLine(Line1,"     PUSLE DEMO         ");

	LCD_SetTextColor(Blue);
	LCD_SetBackColor(White);
	
	LCD_ClearLine(Line4);
	LCD_ClearLine(Line5);
	LCD_ClearLine(Line6);
	LCD_ClearLine(Line7);
	LCD_ClearLine(Line8);
	LCD_ClearLine(Line9);
		
	while(1)
	{
    
    
		sprintf(TXT_test, " PA7-DTY:%d%%     ", DutyCycle);
		LCD_DisplayStringLine(Line6, TXT_test);
		
		sprintf(TXT_test," PA7-FRQ:%.1fKHz   ",Frequency/1000.);
		LCD_DisplayStringLine(Line7, TXT_test);
	}          
}

7、void TIM3_IRQHandler(void)

void TIM3_IRQHandler(void)
{
    
    
	
	if(TIM_GetITStatus(General_TIM_x, TIM_IT_CC2) == SET)
	{
    
    
			TIM_ClearITPendingBit(General_TIM_x, TIM_IT_CC2);

			IC1Value = TIM_GetCapture1(General_TIM_x);	//占空比
			IC2Value = TIM_GetCapture2(General_TIM_x);  //周期

		if (IC2Value != 0)
		{
    
    
				DutyCycle = ((IC1Value+0) * 100) / (IC2Value+1);
				Frequency = (SystemCoreClock/(General_TIM_Prescaler+1) )/ (IC2Value+1);
		}
		else
		{
    
    
				DutyCycle = 0;
				Frequency = 0;
		}
	}
}

実際、公式ウェブサイトのルーチンと比較して、初期化タイムベース構造が主に追加されています。期間は非常に重要です。入力キャプチャであるため、最大値の0xFFFFに直接設定されます。

さらに、期間とデューティサイクルを計算するときに、1つ追加する必要があります。

測定された安定したバッチ!

交換と議論へようこそ

おすすめ

転載: blog.csdn.net/qq_45689790/article/details/114149928