09-ADC-Single-Conversation (STM32F429)

diese Library dient zum betreiben der AD-Wandler im Single-Conversation-Mode

die ADC-Pins die benutzt werden sollen, müssen im H-File deklariert und im C-File den entsprechenden Port-Pins zugeordnet werden.

es kann auch eine Mittelwertbildung von dem Messwert durchgeführt werden
(die Messdauer steigt dann natürlich entsprechend an)

es gibt drei identische Libs für ADC1, ADC2 und ADC3
(sie unterscheiden sich nur in den verwendeten Variabelnnamen)

Hier eine Auswertung über die Genauigkeit :
Spannungswert über einen 100k Poti (ohne externen Kondensator)
100.000 Messungen und dann Anzeige der Min- und Max- AD-Werte
(ADC mit 12Bit, URef = 3V, 1 Digit ca 730 uV)

1
2
3
4
5
6
7
8
Ohne Mittelwerte :  814 - 1144 = +/- 165
   2 Mittelwerte :  974 - 1132 = +/- 79
   4 Mittelwerte :  990 - 1114 = +/- 62
   8 Mittelwerte : 1014 - 1101 = +/- 43
  16 Mittelwerte : 1036 - 1086 = +/- 25
  32 Mittelwerte : 1043 - 1077 = +/- 17
  64 Mittelwerte : 1052 - 1068 = +/- 8
 128 Mittelwerte : 1054 - 1066 = +/- 6

im Beispiel wurden 2 Pins als Analog-IN definiert und per ADC1 gemessen

1
PA5, PC3

Enumerationen (für ADC1) :

1
2
3
4
5
6
7
8
9
10
typedef enum {
  MW_NONE =0,  // keine Mittelwerte
  MW_2,        // 2 Mittelwerte
  MW_4,        // 4 Mittelwerte
  MW_8,        // 8 Mittelwerte
  MW_16,       // 16 Mittelwerte
  MW_32,       // 32 Mittelwerte
  MW_64,       // 64 Mittelwerte
  MW_128       // 128 Mittelwerte
}ADC1s_MW_t;

Funktionen (für ADC1) :

1
2
3
void UB_ADC1_SINGLE_Init(void);                         // zum init des ADC1
uint16_t UB_ADC1_SINGLE_Read(ADC1s_NAME_t adc_name);    // zum auslesen eines ADC direkt
uint16_t UB_ADC1_SINGLE_Read_MW(ADC1s_NAME_t adc_name); // zum auslesen eines ADC mit Mittelwertbildung

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
//--------------------------------------------------------------
// File     : main.c
// Datum    : 30.10.2013
// Version  : 1.0
// Autor    : UB
// EMail    : mc-4u(@)t-online.de
// Web      : www.mikrocontroller-4u.de
// CPU      : STM32F429
// IDE      : CooCox CoIDE 1.7.4
// GCC      : 4.7 2012q4
// Module   : CMSIS_BOOT, M4_CMSIS_CORE
// Funktion : Demo der ADC-Single-Library
// Hinweis  : Diese zwei Files muessen auf 8MHz stehen
//              "cmsis_boot/stm32f4xx.h"
//              "cmsis_boot/system_stm32f4xx.c"
// In Configuration diese Define hinzufügen :
// "STM32F429_439xx" , "__ASSEMBLY__" , "USE_STDPERIPH_DRIVER"
//--------------------------------------------------------------
 
#include "main.h"
#include "stm32_ub_lcd_ili9341.h"
#include "stm32_ub_font.h"
#include "stm32_ub_adc1_single.h"
#include <stdio.h>
 
int main(void)
{
  uint16_t adc_wert;
  char buf[20];
 
  SystemInit(); // Quarz Einstellungen aktivieren
 
  // Init vom LCD
  UB_LCD_Init();
  // Init vom ADC
  UB_ADC1_SINGLE_Init();
 
  // Init der Layer
  UB_LCD_LayerInit_Fullscreen();
  // auf Hintergrund schalten
  UB_LCD_SetLayer_1();
  // Hintergrund komplett mit einer Farbe füllen
  UB_LCD_FillLayer(RGB_COL_WHITE);
  // auf Vordergrund schalten
  UB_LCD_SetLayer_2();
  // Vordergrund komplett mit einer Farbe füllen
  UB_LCD_FillLayer(RGB_COL_GREEN);
 
  // Ueberschrift
  UB_Font_DrawString(10,10,"Demo_09 :  ",&Arial_11x18,RGB_COL_WHITE,RGB_COL_RED);
  UB_Font_DrawString(10,30,"ADC-Single ",&Arial_11x18,RGB_COL_WHITE,RGB_COL_RED);
 
  while(1)
  {
    // ADC-Messung ohne Mittelwertbildung
    adc_wert=UB_ADC1_SINGLE_Read(ADC_PA5);
    sprintf(buf,"PA5 = %4d",adc_wert);
    UB_Font_DrawString(10,100,buf,&Arial_11x18,RGB_COL_BLACK,RGB_COL_GREEN);
 
    // ADC-Messung mit Mittelwertbildung über 64 Werte
    adc_wert=UB_ADC1_SINGLE_Read_MW(ADC_PC3);
    sprintf(buf,"PC3 = %4d",adc_wert);
    UB_Font_DrawString(10,150,buf,&Arial_11x18,RGB_COL_BLACK,RGB_COL_GREEN);
  }
}

Hier die Library zum Download :

adc_single_f429_v100

Hier der komplette CooCox-Projektordner zum Download :

Demo_F429_09


2 Antworten auf 09-ADC-Single-Conversation (STM32F429)

  1. Wolfgang, DH1AKF sagt:

    Zunächst herzlichen Dank für Deine Veröffentlichungen, STM32 betreffend. Sie haben mir viel Zeit erspart…
    Problem: Alle ADC- Beispiele liefern, außer bei Mittelwertbildung von 64 Messungen, unvertretbar hohe Abweichungen. Ich habe mal eine Zeitschleife in die Anzeige genommen, da kann man es deutlich erkennen. Ist damit mein Ziel, einen Oszi mit 1Msps zu programmieren, hinfällig??

    • admin_ub sagt:

      was ist den “unvertretbar hoch” und brauchst du 12Bit Auflösung (wenn dein Oszi z.B. nur 8bit Anzeigen kann). Event. kann man noch einen besseren Filter per Software schreiben. Ich hab oben mal meine Messwerte gepostet.


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