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 і окрема бібліотека для використання в інших проектах. Автор оригіналу статті просить задавати питання на його сайті німецькою або англійською мовами.
Прикреплені файли:
- Demo_05_ADC_Single_RUS.rar (179 Кб)
- ub_stm32f4_adc_single_v100_RUS.rar (8 Кб)