05: TIM-Timer-Funktion ------ Eingabeerfassungsfunktion

Inhaltsverzeichnis

1: Fortsetzen

2: Frequenzmessung

3: Master-Slave-Triggermodus

4: Struktur

A: Messfrequenz der Eingabeerfassungsfunktion

1: Anschlussplan

2: Funktionseinführung

3: Wochenmessmethode

4 Grundstruktur des Eingabeerfassungsmodus

5: Schritte

6: Code

B: PWMI-Modus zur Messung des Frequenz-Tastverhältnisses

1: Anschlussplan

 2:Struktur des PWMI-Modus

 3: Funktionseinführung

4: Schritte

5: Code


1: Fortsetzen

        IC-Eingangserfassung (Input Capture).

        Wenn im Eingangserfassungsmodus ein bestimmter Pegelübergang am Kanaleingangspin auftritt, wird der aktuelle CNT-Wert im CCR gespeichert, der zum Messen der Frequenz, des Arbeitszyklus, des Impulsintervalls, der Pegeldauer usw. verwendet werden kann PWM-Wellenform. Parameter

        Jeder erweiterte Timer und jeder allgemeine Timer verfügt über 4 Eingangserfassungskanäle

        Konfigurierbar im PWMI-Modus zur gleichzeitigen Messung von Frequenz und Arbeitszyklus

        Kann mit dem Master-Slave-Triggermodus verwendet werden, um eine vollautomatische Messung der Hardware zu erreichen

2: Frequenzmessung

Für die STM32-Frequenzmessung können nur digitale Signale gemessen werden.

 Frequenz:  Dies ist die Häufigkeit, mit der sich ein periodischer Prozess innerhalb einer Zeiteinheit (1 s) wiederholt, zyklisch wiederholt oder vibriert.

Frequenzmessmethode : Im Allgemeinen beträgt T 1 s, was der Definition der Frequenz entspricht und zur Messung von Hochfrequenzsignalen geeignet ist.

Prinzip der Periodenmessmethode  : Messen Sie zuerst die Periode T des Signals und ermitteln Sie dann die Frequenz des Signals gemäß f = 1/T. Messen Sie die Zeit von 2 ansteigenden Flanken. Es gibt keine Stoppuhr mit unendlicher Genauigkeit zur Zeitmessung. Verwenden Sie daher diese Methode zur Kraftmessung (siehe: 3: Zyklusmessmethode). ----- Geeignet für die Messung von Hochfrequenzsignalen

Wenn N größer ist, hat der Fehler von plus oder minus 1 weniger Einfluss auf uns.

Wenn: Zu messende Frequenz < mittlere Frequenz ---- Verwenden Sie die Zyklusmessmethode

        Zu messende Frequenz > mittlere Frequenz ---- Verwenden Sie die Frequenzmessmethode

3: Master-Slave-Triggermodus

Master-Modus:  Sie können das interne Signal des Timers dem TRGO-Pin zuordnen und es zum Auslösen anderer Peripheriegeräte verwenden. Daher wird dieser Teil als Master-Modus bezeichnet.

Slave-Modus:  Er empfängt einige Signale von anderen Peripheriegeräten oder seinen eigenen Peripheriegeräten und dient zur Steuerung des Betriebs seines eigenen Timers, dh er wird durch andere Signale gesteuert.

Auswahl der Triggerquelle:  Hiermit wird die Triggersignalquelle des Slave-Modus ausgewählt. Als Teil des Slave-Modus wählt die Triggerquellenauswahl ein bestimmtes Signal aus, um TRGI zu erhalten. TRGI löst den Slave-Modus aus. Der Slave-Modus kann ein Element im auswählen Slave-Modus-Liste. Aktionen, die automatisch ausgeführt werden sollen

4: Struktur

Grundstruktur des Eingabeerfassungsmodus

Struktur des PWMI-Modus

A: Messfrequenz der Eingabeerfassungsfunktion

1: Anschlussplan

 

A0: ist der Ausgangspin, der für die Ausgabe der PWM-Wellenform verantwortlich ist.

A6: Kopieren Sie die berechnete Eingangsfrequenz für den Eingangspin

2: Funktionseinführung

Funktion in stm32f10x tim.h-Datei -----Geben Sie die erfasste Konfiguration ein

void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);

TIM_ICInit :

TIM_ICInitTypeDef TIM_initstruct;
    TIM_initstruct.TIM_Channel=TIM_Channel_1; //Der ausgewählte Kanal PA6 entspricht Kanal 1
    TIM_initstruct.TIM_ICFilter=; //Filter
    TIM_initstruct.TIM_ICPolarity=TIM_ICPolarity_Rising; //Wir wählen die Polarität, die bei der steigenden Flanke getriggert werden soll  
    TIM_initstruct.TIM_ICPrescaler=TIM_ ICPSC _DIV1; //Der Frequenzteiler teilt nicht (1), was bedeutet, dass er bei jedem Trigger gültig ist; der Frequenzteiler durch 2 bedeutet, dass er jedes zweite Mal gültig ist, und so weiter
    TIM_initstruct.TIM_ICSelection=TIM_ICSelection_DirectTI; //Wählen Sie aus, welcher Pin der Triggersignal wird eingegeben von (direkte Verbindung eingeben)

    TIM_ICInit(TIM3,&TIM_initstruct);

Funktion in der Datei stm32f10x tim.h ---- Auswahl der Triggerquelle: Konfigurieren Sie die Triggerquelle von TRGI auf TI1FP1

void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource)

TIM_SelectInputTrigger : Der zweite Parameter wählt die Triggerquelle aus

Funktion in der Datei stm32f10x tim.h ----- Slave-Modus konfigurieren - Slave-Modus auf Reseta konfigurieren

void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode)

Die Funktion in der Datei stm32f10x tim.h ----- ändert den Wert von PSC individuell

void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode)

 TIM_PrescalerConfig : Funktion, die den Wert von PSC ändern kann

Der dritte Parameter (gibt den Neulademodus des Timer-Prescalers an): TIM_PSCReloadMode_Update Der Prescaler wird im Update-Ereignis neu geladen und wird nach der Update-Zeit wirksam

TIM_PSCReloadMode_Immediate: sofort wirksam

 

Die Funktion in der Datei stm32f10x tim.h ---------channel X liest den Wert von CCR

uint16_t TIM_GetCapture1(TIM_TypeDef* TIMx);
uint16_t TIM_GetCapture2(TIM_TypeDef* TIMx);
uint16_t TIM_GetCapture3(TIM_TypeDef* TIMx);
uint16_t TIM_GetCapture4(TIM_TypeDef* TIMx);

PA6 entspricht Kanal 1, also wählen Sie TIM_GetCapture1 – welcher Kanal ausgewählt werden soll, hängt von der Definition des Pins ab

3: Wochenmessmethode

Das Beispiel verwendet die Zyklusmessmethode; für die STM32-Frequenzmessung können nur digitale Signale gemessen werden.

Wochenmessmethode: Zählen Sie innerhalb von zwei ansteigenden Flanken die Zeiten bei der Standardfrequenz fc, um N zu erhalten, dann ist die Frequenz fx=fc/N

 

Selbstinkrementierungsfrequenz des Zählers = Zählstandardfrequenz fc = CK_PSC (72 MHz) / Vorteiler (PSC)   

N : Ein einfaches Verständnis ist der Wert von CCR (weitere Informationen finden Sie im zweiten Artikel Ihres Lebenslaufs).

4 Grundstruktur des Eingabeerfassungsmodus

 

5: Schritte

1: RCC schaltet die Uhr ein (die Uhren der TIM-Peripheriegeräte – RCC_APB1PeriphClockCmd und der GPIO-Peripheriegeräte – RCC_APB2PeriphClockCmd sind eingeschaltet)

2: Konfigurieren Sie GPIO----GPIO_Init (schreiben Sie den zweiten Schritt zuletzt)

3: Taktauswahl----TIM_InternalClockConfig (intern)

4: Zeitbasiseinheit konfigurieren -----TIM_TimeBaseInit()

5: Eingabeerfassung konfigurieren (ic ) ----TIM_ICInit()

6: Auswahl der Triggerquelle: Konfigurieren Sie die Triggerquelle von TRGI als TI1FP1----------TIM_SelectInputTrigger()

7: Konfigurieren Sie den Slave-Modus „Konfigurieren Sie den Slave-Modus auf Zurücksetzen--------TIM_SelectSlaveMode()

8: Timer starten-----TIM_Cmd()

6: Code

Der PA0-Port verwendet TIM2, um eine PWM-Wellenform auszugeben, und der PA6-Port misst die Frequenz.

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "PWM.h"
#include "IC.h"
void PWM_init(){
	//第一步,RCC开启时钟,把我们要用的TIM外设和GPIO外设的时钟打开
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	

	//第二步,配置GPIO
	GPIO_InitTypeDef GPIO_INITStruct;
	GPIO_INITStruct.GPIO_Mode=GPIO_Mode_AF_PP;  //复用推挽输出
	GPIO_INITStruct.GPIO_Pin=GPIO_Pin_0 ;
	GPIO_INITStruct.GPIO_Speed= GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_INITStruct);
	//第三步,时钟源选择(内部时钟)
	TIM_InternalClockConfig(TIM2);
	//第四步,配置时基单元
	TIM_TimeBaseInitTypeDef TIM_INITStruct;
	TIM_INITStruct.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_INITStruct.TIM_CounterMode=TIM_CounterMode_Up;  向上计数
	TIM_INITStruct.TIM_Period=100-1;     //ARR
	TIM_INITStruct.TIM_Prescaler=720-1;			//PSC
	TIM_INITStruct.TIM_RepetitionCounter=0;
	TIM_TimeBaseInit(TIM2,&TIM_INITStruct);
	//第五步,配置输出比较单元
	TIM_OCInitTypeDef TIM_OCInitStructure;
	TIM_OCStructInit(&TIM_OCInitStructure);//给输出比较结构体赋一个默认的值
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择PWM1的模式
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //有效电频为低电频
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  //使能
	TIM_OCInitStructure.TIM_Pulse = 0;		//CCR
	TIM_OC1Init(TIM2, &TIM_OCInitStructure);
	//第六步,启动定时器
	TIM_Cmd(TIM2,ENABLE);
}

void PWM_SetCompare1(uint16_t Compare)
{
	TIM_SetCompare1(TIM2, Compare);
}

void PWM_SetPrescaler(uint16_t Prescaler)
{	
	//可以单独改变PSC的值
	TIM_PrescalerConfig(TIM2, Prescaler, TIM_PSCReloadMode_Immediate);
}


void IC_init(){
	//第一步,RCC开启时钟,把我们要用的TIM外设和GPIO外设的时钟打开
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	//第二步,配置GPIO
	GPIO_InitTypeDef GPIO_INITStruct;
	GPIO_INITStruct.GPIO_Mode=GPIO_Mode_IPU;  //上拉输入
	GPIO_INITStruct.GPIO_Pin=GPIO_Pin_6 ;
	GPIO_INITStruct.GPIO_Speed= GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_INITStruct);
	//第三步,时钟源选择(内部时钟)
	TIM_InternalClockConfig(TIM3);
	//第四步,配置时基单元
	TIM_TimeBaseInitTypeDef TIM_INITStruct;
	TIM_INITStruct.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_INITStruct.TIM_CounterMode=TIM_CounterMode_Up;  向上计数
	TIM_INITStruct.TIM_Period=65536 - 1;		//ARR
	TIM_INITStruct.TIM_Prescaler=72-1;			//PSC
	TIM_INITStruct.TIM_RepetitionCounter=0;
	TIM_TimeBaseInit(TIM3,&TIM_INITStruct);
	//第五步,配置输入捕获(ic)
	TIM_ICInitTypeDef TIM_initstruct;
	TIM_initstruct.TIM_Channel=TIM_Channel_1;  //选择的通道 PA6对应的为通道1
	TIM_initstruct.TIM_ICFilter=0xF;   //滤波器
	TIM_initstruct.TIM_ICPolarity=TIM_ICPolarity_Rising; //极性 我们选择上升沿触发  
	TIM_initstruct.TIM_ICPrescaler=TIM_ICPSC_DIV1;    //分频器 不分频(1)就是每次触发都有效;2分频就是每隔一次有效一次,以此类推
	TIM_initstruct.TIM_ICSelection=TIM_ICSelection_DirectTI;   //选择触发信号从哪个引脚输入(直连输入)
	TIM_ICInit(TIM3,&TIM_initstruct);
	//第六步,触发源选择: 配置TRGI的触发源为TI1FP1
	TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);
	//第七步,配置从模式-:配置从模式为Reseta
	TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);
	//第八步,启动定时器
	TIM_Cmd(TIM3,ENABLE);

}

uint32_t IC_GetFreq(void)   //Fc=72mHZ/(PSC+1)  psc=72-1  FC=1000 000
{    //高电平的计数值存在CCR2里,整个周期的计数值存在CCR1里
	return 1000000 / (TIM_GetCapture1(TIM3) + 1);  //FX=FC/N  N就是读取CCR的值
}


int main(void)
{
	OLED_Init();
	PWM_init();
	IC_init();
	
	OLED_ShowString(1, 1, "Freq:00000Hz");
																		//pwm文件中ARR定时了为100
	PWM_SetPrescaler(720 - 1);			//Freq = 72M / (PSC + 1) / 100    改变PA0引脚PSC预分频器的值
	PWM_SetCompare1(50);				//Duty = CCR / 100   		改变PA0引脚CCR的值
	
	while (1)
	{
		OLED_ShowNum(1, 6, IC_GetFreq(), 5);
	}
}

 Sie verwenden keinen Timer? Verwenden Sie TMI2 für den Ausgangsvergleich (Ausgangs-PWM) und TIM3 für die Eingangserfassung (Frequenzmessung).

 Die 4 Eingangserfassungs- und Ausgangsvergleichskanäle (CH) teilen sich 4 CCR-Register, und ihre CH1 bis CH4, die 4 Kanalpins, werden ebenfalls gemeinsam genutzt. Für den  gleichen Timer können Eingangserfassung und Ausgangsvergleich nur eines davon verwenden. Eins, können nicht gleichzeitig verwendet werden

Eingabeerfassung berechnen

Die Eingabeerfassung verwendet den TIM3-Universaltimer

Der High-Level-Zählwert wird in CCR2 gespeichert, und der Zählwert des gesamten Zyklus wird in CCR1 gespeichert.

 

Pin-Kanal

Eingabeerfassung

 Diesmal verwenden wir den PA6-Pin des gleichen Timers TIM3. Gemäß der Definition des Pins sollten wir Kanal 1 verwenden

Die Kanalauswahl für die Eingabeerfassung wird bei der Konfiguration des IC ( Konfiguration der Eingabeerfassung ) ausgewählt : TIM_initstruct.TIM_Channel=TIM_Channel_1; ---Channel 1

Master-Slave-Triggermodus ------ CNT löschen

       Die steigende Flanke wird verwendet, um die Eingabeerfassung auszulösen, und CNT wird zum Zählen und Timing verwendet. Bei jeder steigenden Flanke wird der Wert von CNT erfasst und automatisch in CCR gespeichert. Der von CCR erfasste Wert. Es ist der Zählwert N. Der Antriebstakt von CNT ist fc 

        Nach jeder Erfassung müssen wir CNT auf 0 zurücksetzen. Bei der erneuten Erfassung bei der nächsten ansteigenden Flanke entspricht der herausgenommene CNT-Wert dem Zeitintervall zwischen zwei ansteigenden Flanken.

        Der Schritt des automatischen Löschens von CNT nach einer Erfassung kann mithilfe des Master-Slave-Triggermodus automatisch abgeschlossen werden.

        Die Hardware-Schaltung kann das Löschen von CNT nach der Erfassung automatisch abschließen; 

        Sowohl das TI1FP1-Signal als auch das Flankensignal von TI1 können zum Slave-Modus-Controller führen. TI1FP1 kann gleichzeitig auch den Slave-Modus auslösen. Im Slave-Modus gibt es eine Schaltung, die den CNT automatisch löschen kann.

 Ich möchte den CNT des TI1FP1-Signalbenutzers löschen:

1: Auswahl der Triggerquelle ------- Wählen Sie hier TI1FP1 TIM_SelectInputTrigger aus

2: Wählen Sie diese Option, um den Reset-Vorgang im Modus TIM_SelectSlaveMode durchzuführen

Beachten:

Hier gibt es eine Obergrenze für den Wert von CNT. ARR ist im Allgemeinen auf maximal 65535 eingestellt und CNT kann nur bis zu 65535 Zahlen zählen. 

        Bei der Auswahl der Triggerquelle gibt es nur die Signale von TF1FP1 und TF2FP2, nicht jedoch die Signale von TF3FP3 und TF4FP4. Wenn Sie den Slave-Modus zum automatischen Löschen von CNT verwenden möchten, können Sie nur Kanal 1 und Kanal 2 verwenden 3 und Kanal 4 können Sie nur „Strahlunterbrechungen erfassen“ aktivieren. Das manuelle Löschen verbraucht mehr Systemressourcen.

B: PWMI-Modus zur Messung des Frequenz-Tastverhältnisses

1: Anschlussplan

Und A: Die Messfrequenz der Eingangserfassungsfunktion ist ein Anschlussdiagramm

 2:Struktur des PWMI-Modus

 3: Funktionseinführung

Funktion in der Datei stm32f10x tim.h -----PWMI-Modus aktivieren

void TIM_PWMIConfig(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);

Unterstützt nur Kanal 1 und Kanal 2 

4: Schritte

1: RCC schaltet die Uhr ein (die Uhren der TIM-Peripheriegeräte – RCC_APB1PeriphClockCmd und der GPIO-Peripheriegeräte – RCC_APB2PeriphClockCmd sind eingeschaltet)

2: Konfigurieren Sie GPIO----GPIO_Init (schreiben Sie den zweiten Schritt zuletzt)

3: Taktauswahl----TIM_InternalClockConfig (intern)

4: Zeitbasiseinheit konfigurieren -----TIM_TimeBaseInit()

5: Eingabeerfassung konfigurieren (ic ) ----TIM_ICInit()

6: PWMI-Modus einschalten -----TIM_PWMIConfig();

7: Auswahl der Triggerquelle: Konfigurieren Sie die Triggerquelle von TRGI als TI1FP1----------TIM_SelectInputTrigger()

8: Slave-Modus konfigurieren „Slave-Modus als Reset konfigurieren--------TIM_SelectSlaveMode()

9: Timer starten-----TIM_Cmd()

5: Code

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "PWM.h"
#include "IC.h"
void PWM_init(){
	//第一步,RCC开启时钟,把我们要用的TIM外设和GPIO外设的时钟打开
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	

	//第二步,配置GPIO
	GPIO_InitTypeDef GPIO_INITStruct;
	GPIO_INITStruct.GPIO_Mode=GPIO_Mode_AF_PP;  //复用推挽输出
	GPIO_INITStruct.GPIO_Pin=GPIO_Pin_0 ;
	GPIO_INITStruct.GPIO_Speed= GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_INITStruct);
	//第三步,时钟源选择(内部时钟)
	TIM_InternalClockConfig(TIM2);
	//第四步,配置时基单元
	TIM_TimeBaseInitTypeDef TIM_INITStruct;
	TIM_INITStruct.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_INITStruct.TIM_CounterMode=TIM_CounterMode_Up;  向上计数
	TIM_INITStruct.TIM_Period=100-1;     //ARR
	TIM_INITStruct.TIM_Prescaler=720-1;			//PSC
	TIM_INITStruct.TIM_RepetitionCounter=0;
	TIM_TimeBaseInit(TIM2,&TIM_INITStruct);
	//第五步,配置输出比较单元
	TIM_OCInitTypeDef TIM_OCInitStructure;
	TIM_OCStructInit(&TIM_OCInitStructure);//给输出比较结构体赋一个默认的值
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择PWM1的模式
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //有效电频为低电频
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  //使能
	TIM_OCInitStructure.TIM_Pulse = 0;		//CCR
	TIM_OC1Init(TIM2, &TIM_OCInitStructure);
	//第六步,启动定时器
	TIM_Cmd(TIM2,ENABLE);
}

void PWM_SetCompare1(uint16_t Compare)
{
	TIM_SetCompare1(TIM2, Compare);
}

void PWM_SetPrescaler(uint16_t Prescaler)
{	
	//可以单独改变PSC的值
	TIM_PrescalerConfig(TIM2, Prescaler, TIM_PSCReloadMode_Immediate);
}


void IC_init(){
	//第一步,RCC开启时钟,把我们要用的TIM外设和GPIO外设的时钟打开
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	//第二步,配置GPIO
	GPIO_InitTypeDef GPIO_INITStruct;
	GPIO_INITStruct.GPIO_Mode=GPIO_Mode_IPU;  //上拉输入
	GPIO_INITStruct.GPIO_Pin=GPIO_Pin_6 ;
	GPIO_INITStruct.GPIO_Speed= GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_INITStruct);
	//第三步,时钟源选择(内部时钟)
	TIM_InternalClockConfig(TIM3);
	//第四步,配置时基单元
	TIM_TimeBaseInitTypeDef TIM_INITStruct;
	TIM_INITStruct.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_INITStruct.TIM_CounterMode=TIM_CounterMode_Up;  向上计数
	TIM_INITStruct.TIM_Period=65536 - 1;		//ARR
	TIM_INITStruct.TIM_Prescaler=72-1;			//PSC
	TIM_INITStruct.TIM_RepetitionCounter=0;
	TIM_TimeBaseInit(TIM3,&TIM_INITStruct);
	//第五步,配置输入捕获(ic)
	TIM_ICInitTypeDef TIM_initstruct;
	TIM_initstruct.TIM_Channel=TIM_Channel_1;  //选择的通道 PA6对应的为通道1
	TIM_initstruct.TIM_ICFilter=0xF;   //滤波器
	TIM_initstruct.TIM_ICPolarity=TIM_ICPolarity_Rising; //极性 我们选择上升沿触发  
	TIM_initstruct.TIM_ICPrescaler=TIM_ICPSC_DIV1;    //分频器 不分频(1)就是每次触发都有效;2分频就是每隔一次有效一次,以此类推
	TIM_initstruct.TIM_ICSelection=TIM_ICSelection_DirectTI;   //选择触发信号从哪个引脚输入(直连输入)
	TIM_ICInit(TIM3,&TIM_initstruct);
	TIM_PWMIConfig(TIM3,&TIM_initstruct);
	
	//第六步,触发源选择: 配置TRGI的触发源为TI1FP1
	TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);
	//第七步,配置从模式-:配置从模式为Reseta
	TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);
	//第八步,启动定时器
	TIM_Cmd(TIM3,ENABLE);

}

uint32_t IC_GetFreq(void)   //Fc=72mHZ/(PSC+1)  psc=72-1  FC=1000 000
{
	return 1000000 / (TIM_GetCapture1(TIM3) + 1);  //FX=FC/N  N就是读取CCR的值
}


uint32_t IC_duty_cycle(void){
	//高电平的计数值存在CCR2里,整个周期的计数值存在CCR1里
	return TIM_GetCapture2(TIM3)*100/TIM_GetCapture1(TIM3);

}



int main(void)
{
	OLED_Init();
	PWM_init();
	IC_init();
	
	OLED_ShowString(1, 1, "Freq:00000Hz");
	OLED_ShowString(2, 1, "Duty:00%");

																		//pwm文件中ARR定时了为100
	PWM_SetPrescaler(720 - 1);			//Freq = 72M / (PSC + 1) / 100    改变PA0引脚PSC预分频器的值
	PWM_SetCompare1(50);				//Duty = CCR / 100   									改变PA0引脚CCR的值
	
	while (1)
	{
		OLED_ShowNum(1, 6, IC_GetFreq(), 5);
		OLED_ShowNum(2, 6, IC_duty_cycle(), 2);
	}
}

 Auslastungsgrad

uint32_t IC_duty_cycle(void){     //Der Zählwert auf hoher Ebene wird in CCR2 gespeichert, und der Zählwert des gesamten Zyklus wird in CCR1 gespeichert.     return TIM_GetCapture2(TIM3)*100/TIM_GetCapture1(TIM3);

}

Im Vergleich zu Code A: Eingangserfassungsfunktion zur Messung der Frequenz wird der PWMI-Kanal nur geöffnet, wenn die Eingangserfassung (IC) konfiguriert wird.

TIM_PWMIConfig();

Ich denke du magst

Origin blog.csdn.net/m0_74739916/article/details/132473674
Empfohlen
Rangfolge