-mit dieser Library kann der ADC per DMA zyklisch ausgelesen werden um die CPU last zu senken. Es können maximal 16 ADC-Kanäle pro AD-Wandler festgelegt werden.
-die Einstellung erfolgt (wie in der ADC-Single-Conversation-Library) als Struktur im C-File. Dort müssen die ADC-Pins den Port-Pins zugeordnet werden.
-es sind wieder zwei LIBs getrennt für ADC1 und ADC2. Die können aber auch gleichzeitig benutzt werden falls mehr als 16 ADC-Kanäle notwendig sind.
Beispielbild :
-im Beispiel werden nur 3 Kanäle benutzt um das Prinzip zu verdeutlichen.
1 | PA3, PC4, PC5 |
Voraussetzungen :
1 2 | Benutzte Module der CooCox-IDE : GPIO, ADC, DMA Benutzte Librarys : keine |
Enumerationen (für ADC1) :
1 2 3 4 5 | typedef enum { ADC_PA3 = 0, // PA3 ADC_PC4 = 1, // PC4 ADC_PC5 = 2 // PC5 }ADC1d_NAME_t; |
Funktionen (für ADC1) :
1 2 | void UB_ADC1_DMA_Init(void); // zum initialisieren und starten uint16_t UB_ADC1_DMA_Read(ADC1d_NAME_t adc_name); // zum auslesen eines ADC-Kanals |
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 42 43 44 | //-------------------------------------------------------------- // File : main.c // Datum : 03.03.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 ADC-DMA-Library // Hinweis : Diese zwei Files muessen auf 8MHz stehen // "cmsis_boot/stm32f4xx.h" // "cmsis_boot/system_stm32f4xx.c" //-------------------------------------------------------------- #include "main.h" #include "stm32_ub_led.h" #include "stm32_ub_adc2_dma.h" int main(void) { uint16_t adc_wert; SystemInit(); // Quarz Einstellungen aktivieren UB_Led_Init(); // Init der LEDs UB_ADC2_DMA_Init(); // Init vom ADC2 im DMA-Mode while(1) { // ADC-Messwert auslesen und LED entsprechend schalten adc_wert=UB_ADC2_DMA_Read(ADC_PA3); if(adc_wert<2048) UB_Led_On(LED_GREEN); else UB_Led_Off(LED_GREEN); // ADC-Messwert auslesen und LED entsprechend schalten adc_wert=UB_ADC2_DMA_Read(ADC_PC4); if(adc_wert<2048) UB_Led_On(LED_RED); else UB_Led_Off(LED_RED); // ADC-Messwert auslesen und LED entsprechend schalten adc_wert=UB_ADC2_DMA_Read(ADC_PC5); if(adc_wert<2048) UB_Led_On(LED_BLUE); else UB_Led_Off(LED_BLUE); } } |
Hier die Library zum Download :
Hier der komplette CooCox-Projektordner zum Download :
Zunächst ein Dickes Lob für deine Seite und deine Libs – die mir den Einstieg sehr erleichtert haben um vom PIC auf den STm32 zu kommen.
Ich habe versucht das obige Beispiel soabzuändern das nur ein Kanal ausgelesen und per DMA gespeichert wird. Jedoch eine bestimmt Anzahl an Werten z.B. 100.
Hierzu habe ich bei den Enumerationen (für ADC1) nur einen Channel eingetragen und die Anzahl der Conversions auf 100 gesetzt.
Die Größe des Buffers habe ich natürlich auch angepasst. Jedoch fehlt hier noch irgendetwas, ich erhalte zwar 100 Werte, aber nur jeder 6 Wert macht Sinn.
Hast du hier einen Tipp?
grüße Sepp
hast du im H-File die “ADC1d_ANZ” auf “1″ runtergesetzt ?