Um die Frequenz und den Tastgrad (Dutycycle) von einem PWM-Signal messen zu können, habe ich diese Librarys erstellt.
(es gibt auch noch eine extra LIB wenn nur die Frq gemessen werden soll)
Es gibt für die Timer “TIM2, TIM3, TIM4, TIM5″ je eine Library.
Die Timer werden im PWM-InputCapture-Mode betrieben, mit MasterSlave und Autoreset. Die Interrupt-Funktion wird bei jeder Hi-Flanke vom Signal ausgelöst und ermittelt die Periodendauer und die Impulslänge vom Signal.
Pro Timer kann in diesem Mode nur ein Signal gemessen werden. Und es stehen auch nur die Kanäle 1 oder 2 zur Verfügung.
Der Kanal und Port-Pin der benutzt werden soll, muss im C-File eingetragen werden.
Im H-File wird die Takt-Frequenz vom Timer eingestellt. Diese beeinflusst die Auflösung und die minimale Frequenz die gemessen werden kann.
Hinweis : die Funktion zum auslesen der Frequenz übergibt nur den Timerwert der Periodendauer. Das umrechnen in eine Frequenz muss, wenn notwendig, extra gemacht werden. Falls kein Signal anliegt (oder die Messung noch nicht fertig ist) ist der Rückgabewert = 0. Damit kann ein fehlendes Signal erkannt werden.
Bild :
Voraussetzungen :
1 2 | Benutzte Module der CooCox-IDE : GPIO, TIM, MISC Benutzte Librarys : keine |
Funktionen (für PWM mit TIM2) :
1 2 3 | void UB_ICPWM_TIM2_Init(void); // um die PWM-Messung mit TIM2 zu initialisieren uint16_t UB_ICPWM_TIM2_ReadFRQ(void); // zum auslesen der gemessenen Frequenz uint16_t UB_ICPWM_TIM2_ReadDUTY(void); // zum auslesen vom gemessenen Dutycycle |
Beispiel :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | //-------------------------------------------------------------- // File : main.c // Datum : 20.07.2013 // Version : 1.0 // Autor : UB // EMail : mc-4u(@)t-online.de // Web : www.mikrocontroller-4u.de // CPU : STM32F4 // IDE : CooCox CoIDE 1.7.0 // Module : CMSIS_BOOT, M4_CMSIS_CORE // Funktion : Demo der InputCapture PWM-Library // Hinweis : Diese zwei Files muessen auf 8MHz stehen // "cmsis_boot/stm32f4xx.h" // "cmsis_boot/system_stm32f4xx.c" //-------------------------------------------------------------- #include "main.h" #include "stm32_ub_icpwm_tim2.h" int main(void) { uint32_t messwert=0,freuqenz=0,impuls=0; SystemInit(); // Quarz Einstellungen aktivieren // Init vom Timer2 zur PWM-Messung UB_ICPWM_TIM2_Init(); while(1) { // gemessene FRQ an PA1 auslesen messwert=UB_ICPWM_TIM2_ReadFRQ(); if(messwert>0) { // wenn Messwert gueltig // frequenz ausrechnen freuqenz=(1000000/messwert); // impuls auslesen impuls=UB_ICPWM_TIM2_ReadDUTY(); } } } |
Hier die Library zum Download :
Hier der komplette CooCox-Projektordner zum Download :