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 :
Hier der komplette CooCox-Projektordner zum Download :
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??
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.