Продолжаем работать с АЦП (ADC) контроллера STM32F1 с использованием библиотеки LL. Также работать мы пока будем с регулярными каналами с использованием периферии DMA, только в данном уроке мы также будем запускать АЦП автоматически, но уже не при помощи использования режима Continuous, а по таймеру.
С запуском АЦП по событию таймера мы уже знакомы из урока 188, поэтому написать нам код будет не так сложно. Также мы уже не будем исследовать изменения в инициализации ADC, так как мы уже знаем, что там и где изменится.
Схема нашего урока не изменилась также не изменилась
Проект мы сделаем из проекта урока 189 урока с именем LL_ADC_REG_DMA и дадим ему имя LL_ADC_REG_TIM_DMA.
Откроем наш проект в Cube MX и включим таймер 3
Настроим период таймера 100 милисекунд и включим событие, по которому таймер будет дёргать ADC
В свойствах ADC1 настроим старт конверсии от нашего таймера
Не забываем также задействовать библиотеку LL для таймера
Сгенерируем проект и откроем его в Keil, настроим автоперезагрузку после прошивки, отключим оптимизацию, подключим к дереву проекта файлы lcd.c и i2c_user.c, откроем main.c и в функции main() включим бит EXTTRIG в регистре CR2 ADC1 с помощью вызова определённой функции
1 2 |
LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_1); LL_ADC_REG_StartConversionExtTrig(ADC1,LL_ADC_REG_TRIG_EXT_RISING); |
Выведем соответствующую строку на дисплей
1 2 |
LCD_SetPos(0,2); LCD_String("Timer Ext Trigger"); |
Запустим наш таймер
1 2 |
LCD_String("Timer Ext Trigger"); LL_TIM_EnableCounter(TIM3); |
Удалим вызов функции старта АЦП из бесконечного цикла, так как он будет стартовать от таймера
/* USER CODE BEGIN 3 */
LL_ADC_REG_StartConversionSWStart(ADC1);
Также поднимем выше сброс флага во избежание одновременного обращения к массиву с сырыми значениями каналов
fl_adc = 0;
while (!fl_adc) {}
fl_adc = 0;
Также удалим задержку, она теперь нам не нужна, так как конверсия засчёт настройки таймера будет происходить 10 раз в секунду и мы будем вместо задержки ждать установки флага
LCD_String(str01);
LL_mDelay(100);
Соберём код, прошьём контроллер и посмотрим результат
У нас по-прежнему всё отлично работает!
Таким образом, на данном уроке мы научились запускать преобразование от регулярных каналов по событию таймера, как и раньше, используя при этом периферию DMA.
Всем спасибо за внимание!
Предыдущий урок Программирование МК STM32 Следующий урок
Отладочную плату STM32F103C8T6 можно приобрести здесь STM32F103C8T6
Программатор недорогой можно купить здесь ST-Link V2
Переходник I2C to LCD можно приобрести здесьI2C to LCD1602 2004
Логический анализатор 16 каналов можно приобрести здесь
Смотреть ВИДЕОУРОК (нажмите на картинку)
Добавить комментарий