14-ADC_DMA-Mode (STM32F4)

-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 :

adc_dma

-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 :

ub_stm32f4_adc_dma_v101

Hier der komplette CooCox-Projektordner zum Download :

Demo_14_ADC_DMA

2 Antworten auf 14-ADC_DMA-Mode (STM32F4)

  1. Sepp Obermair sagt:

    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

    • admin_ub sagt:

      hast du im H-File die “ADC1d_ANZ” auf “1″ runtergesetzt ?


Wie hat Dir dieser Artikel gefallen?

1 Stern2 Sterne3 Sterne4 Sterne5 Sterne (Noch keine Bewertungen)
Loading...

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert