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 і окрема бібліотека для використання в інших проектах. Автор оригіналу статті просить задавати питання на його сайті німецькою або англійською мовами.

Оригінал статті

Прикреплені файли:

Top