STM32F4. Урок 5 — работа с АЦП

Данная библиотека используется для работы с АЦП в режиме единичного запроса. Выводы АЦП должны быть указанны в H-файле и правильно настроены в C-файле библиотеке. Также может быть выполнено усреднение значения измеряемой величины (период оценки увеличивается в соответствии с настройкой). В приложении прикреплено две одинаковые библиотеки ADC1 и ADC2 (они отличаются только именами используемых переменных).

Вот оценка точности:

Напряжение подается с подтяжкой 100кОм (без использования внешнего конденсатора). После 100тыс. измерений сравниваем разницу максимального и минимального значений (разрядность АЦП – 12бит, Uref=3В, погрешность — 730мкВ).

 без усреднения : 814 - 1144 = +/- 165   усреднение 2 : 974 - 1132 = +/- 79   усреднение 4 : 990 - 1114 = +/- 62   усреднение 8 : 1014 - 1101 = +/- 43  усреднение 16 : 1036 - 1086 = +/- 25  усреднение 32 : 1043 - 1077 = +/- 17  усреднение 64 : 1052 - 1068 = +/- 8 усреднение 128 : 1054 - 1066 = +/- 6 

В примере, для работы в аналоговом режиме ADC1 было использовано три вывода: PA3, PC4, PC5.

Требования:

   Подключаемые модули CooCox-IDE : GPIO, ADC.
   Поддерживаемые библиотеки: отсутствуют.

Перечисления:

 typedef enum {   ADC_PA3 = 0,  // PA3   ADC_PC4 = 1,  // PC4   ADC_PC5 = 2   // PC5 }ADC1s_NAME_t;  typedef enum {   MW_NONE =0,  // без усреднения   MW_2,        // усреднение 2   MW_4,        // усреднение 4   MW_8,        // усреднение 8   MW_16,       // усреднение 16   MW_32,       // усреднение 32   MW_64,       // усреднение 64   MW_128       // усреднение 128 }ADC1s_MW_t;

Функции:

 void UB_ADC1_SINGLE_Init(void);  // Инициализация ADC1 uint16_t UB_ADC1_SINGLE_Read(ADC1s_NAME_t adc_name); // непосредственное считывание данных с АЦП uint16_t UB_ADC1_SINGLE_Read_MW(ADC1s_NAME_t adc_name); //считывание данных АЦП с усреднением

Пример использования:

 //-------------------------------------------------------------- // File     : main.c // Datum    : 17.02.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 // Function : Demo of Button Library // Reference: These two files must be written to 8MHz //              "cmsis_boot/stm32f4xx.h" //              "cmsis_boot/system_stm32f4xx.c" //--------------------------------------------------------------  #include "main.h" #include "stm32_ub_adc1_single.h" #include "stm32_ub_led.h"  int main(void) {   uint16_t adc_wert;    SystemInit(); // Инициализация настроек кварца    UB_ADC1_SINGLE_Init(); // Инициализация ADC1   UB_Led_Init();         // Инициализация светодиодов     while(1)   {     // Канал АЦП PA3 управляет тремя светодиодами соответственно     adc_wert=UB_ADC1_SINGLE_Read_MW(ADC_PA3);     if(adc_wert>1024) UB_Led_On(LED_GREEN); else UB_Led_Off(LED_GREEN);     if(adc_wert>2048) UB_Led_On(LED_ORANGE); else UB_Led_Off(LED_ORANGE);     if(adc_wert>3072) UB_Led_On(LED_RED); else UB_Led_Off(LED_RED);      // Канал АЦП PC4 управляет синим светодиодом, инвертирую его состояние     adc_wert=UB_ADC1_SINGLE_Read_MW(ADC_PC4);     if(adc_wert>2048) UB_Led_On(LED_BLUE); else UB_Led_Off(LED_BLUE);   } }

Режим работы:

  • ADC1 инициализируется в режиме единичного запроса
  • измеряется уровень аналогового напряжения на выходах PA3 и PC4 (определяются в библиотеке)
  • в зависимости от величины напряжения 4 светодиода либо загораются, либо тухнут

Библиотека, использованная в примере: stm32_ub_adc1_single, stm32_ub_led.

В приложении проект CooCox и отдельная библиотека для использования в других проектах. Автор оригинала статьи просит задавать вопросы на его сайте на немецком или английских языках.