Продолжаем работать с АЦП (ADC) контроллера STM32F1 с использованием библиотеки LL. Также работать мы пока будем с однократным преобразованием и с инжектированным каналом, используя при этом режим последовательного сканирования нескольких каналов, только отслеживать окончание процесса преобразования мы будем при помощи механизма прерываний от АЦП.
С данным механизмом мы уже неоднократно работали, поэтому, думаю, нам будет в данном уроке несложно.
Схема наша также осталась прежней
Проект мы будем использовать с прошлого урока с именем LL_ADC_INJ_ONCE_SCAN и назовём его LL_ADC_INJ_ONCE_SCAN_INT.
Откроем проект в Cube MX и в настройках ADC1 включим глобальные прерывания
Сгенерируем проект для Keil, откроем его, настроим автоперезагрузку после прошивки, отключим оптимизацию, подключим к дереву проекта файлы lcd.c и i2c_user.c, откроем main.c и добавим глобальный пользовательский флаг
1 2 |
/* USER CODE BEGIN PV */ __IO uint8_t fl_adc; |
Добавим функцию, в которой данный флаг будет устанавливаться
1 2 3 4 5 |
/* USER CODE BEGIN 4 */ void ADC_ConvCpltCallback(void) { fl_adc = 1; } |
Добавим прототип для данной функции в файле stm32f1xx_it.c
1 2 |
/* USER CODE BEGIN PFP */ void ADC_ConvCpltCallback(void); |
В функции-обработчике прерываний ADC1_2_IRQHandler сбросим флаг прерывания, если он установлен, и вызовем нашу функцию
1 2 3 4 5 6 7 8 |
void ADC1_2_IRQHandler(void) { /* USER CODE BEGIN ADC1_2_IRQn 0 */ if(LL_ADC_IsActiveFlag_JEOS(ADC1) != 0) { LL_ADC_ClearFlag_JEOS(ADC1); ADC_ConvCpltCallback(); } |
Вернёмся в main.c и включим локальные прерывания по событию окончания преобразования в функции main()
1 2 |
LCD_ini(); LL_ADC_EnableIT_JEOS(ADC1); |
Добавим в строку на дисплее слово
LCD_String("Scan Interrupt");
Удалим вот эти строки из бесконечного цикла
while (!LL_ADC_IsActiveFlag_JEOS(ADC1)) {}
LL_ADC_ClearFlag_JEOS(ADC1);
Вместо них обработаем установку нашего пользовательского флага
1 2 3 |
LL_ADC_INJ_StartConversionSWStart(ADC1); while (!fl_adc) {} fl_adc = 0; |
Всё готово. Проверим, как наш код будет работать с практической схемой
Всё отлично работает, все каналы сканируются и все преобразованные в вольты показатели выводятся на экран дисплея.
Таким образом, в данном уроке нам удалось, используя наши накопленные знания, запустить механизм обработки прерываний АЦП, используя при этом инжектированную группу каналов, в результате чего мы теперь можем отслеживать событие окончания преобразования в отдельном обработчике, не затрагивая ход основной программы. Хотя сейчас это у нас не особо заметно, так как процедуру перерасчёта в вольты сырого значения сигнала и вывод его на дисплей мы проделываем по-прежнему в основном коде, и также висим перед этим, дожидаясь пользовательского флага, ибо мы не можем столь не совсем короткие вещи поручить обработчику прерываний, тем не менее мы знаем, как данный обработчик организовать, что в будущем позволит нам более короткие процедуры обработки окончания преобразования вынести именно туда.
Всем спасибо за внимание!
Предыдущий урок Программирование МК STM32 Следующий урок
Отладочную плату STM32F103C8T6 можно приобрести здесь STM32F103C8T6
Программатор недорогой можно купить здесь ST-Link V2
Переходник I2C to LCD можно приобрести здесьI2C to LCD1602 2004
Логический анализатор 16 каналов можно приобрести здесь
Смотреть ВИДЕОУРОК в RuTube (нажмите на картинку)
Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)
Добавить комментарий