STM Урок 188. LL. STM32F1. ADC. Regular Once. Запуск по таймеру



Продолжаем работать с АЦП (ADC) контроллера STM32F1 с использованием библиотеки LL. Также работать мы пока будем с регулярным каналом. Запускать мы будем также наш АЦП на данном уроке автоматически, хотя вернёмся мы в режим однократного преобразования. Как же такое возможно и для чего это нужно?

В режиме кольцевого запуска (continuous) АЦП не может запускаться реже чем через 252 цикла (12,5 + 239,5). Порой бывает нужно запускать АЦП автоматически гораздо реже. Для этого существует у контроллера STM32F1 а АЦП запуск от таймера. Причём запустить наш АЦП мы можем, используя различные события таймера, такие как захват, сравнение и переполнение счётчика.

Вот сегодня мы и попробуем настроить АЦП на запуск от таймера.

Схема нашего урока не изменилась

 

 

Проект мы сделаем из проекта прошлого урока под названием LL_ADC_REG_CONT_INT и присвоим ему имя LL_ADC_REG_ONCE_TIM.

Откроем наш проект в Cube MX и включим таймер 3

 

 

Настроим нашему таймеру период в 1 милисекунду и включим триггер на обновление счётчика

 

 

У таймера никакие прерывания не включаем.

 

 

Переходим в настройки АЦП и отключим там режим автоматического запуска

 

 

Также включим для нашего АЦП режим срабатывания от таймер 3 по событию переполнения счётчика

 

 

Для таймера включим использование библиотеки LL

 

 

Сгенерируем проект и откроем его в Keil, настроим автоперезагрузку после прошивки, отключим оптимизацию, подключим к дереву проекта файлы lcd.c и i2c_user.c, откроем main.c и посмотрим, что у нас изменилось в инициализации АЦП в результате включения режима срабатывания от таймера. Для этого зайдём в тело функции MX_ADC1_Init и посмотрим изменения.

 

 

Во-первых, у нас засчёт отключения режима Continuous не будет устанавливаться бит CONT в регистре CR2

 

ADC_REG_InitStruct.ContinuousMode = LL_ADC_REG_CONV_SINGLE;

 

Также мы видим установку поля структуры на срабатывание от таймера

 

ADC_REG_InitStruct.TriggerSource = LL_ADC_REG_TRIG_EXT_TIM3_TRGO;

 

Засчёт этого в битовой маске EXTSEL регистра CR2 включится только старший бит, что будет означать настройку АЦП на срабатывание от события TRGO таймера 3

 

 

Также засчёт снижения интервала между выборками настройка данного поля структуры тоже изменилась

 

LL_ADC_SetChannelSamplingTime(ADC1, LL_ADC_CHANNEL_1, LL_ADC_SAMPLINGTIME_7CYCLES_5);

 

Вследствие этого в битовой маске SMP1 регистра SMPR2 включится только младший бит

 

 

Перейдём в функцию main() и вызовем там вот такую интересную функцию

 

 

Тем самым мы включим бит EXTTRIG регистра CR2, который скажет нашему АЦП, что оно будет работать от внешнего события. Вот так то. Оказывается. Недостаточно настроить только битовую маску EXTSEL. Странно то, почему этот бит не включили в функцию инициализации АЦП.

Из 2 строки дисплея уберём Continuous

 

LCD_String(«Regular Continuous»);

 

Также изменим надпись в 3 строке дисплея

 

LCD_String("Timer Ext Trigger");

 

А вот эта строка, где происходит первый запуск АЦП, нам теперь вообще не нужна, таймер его сам запустит

 

LL_ADC_REG_StartConversionSWStart(ADC1);

 

Вместо неё запустим наш таймер

 

 

Соберём код, прошьём контроллер и проверим, как работает наш АЦП, покрутив регулятор подстроечного резистора делителя напряжения

 

 

Всё работает отлично!

Таким образом, на данном занятии мы научились запускать АЦП контроллера STM32F1 от таймера, что позволило нам теперь более гибко и более в широких пределах настраивать период автоматического запуска преобразования.

Всем спасибо за внимание!

 

 

Предыдущий урок Программирование МК STM32 Следующий урок

 

Исходный код

 

 

Отладочную плату STM32F103C8T6 можно приобрести здесь STM32F103C8T6

Программатор недорогой можно купить здесь ST-Link V2

Дисплей LCD 16×2

Переходник I2C to LCD можно приобрести здесьI2C to LCD1602 2004

Логический анализатор 16 каналов можно приобрести здесь

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

STM LL. STM32F1. ADC. Regular Once. Запуск по таймеру

Один комментарий на “STM Урок 188. LL. STM32F1. ADC. Regular Once. Запуск по таймеру
  1. 0 SWSTART-LL_ADC_REG_StartConversionSWStart(ADC1); это тот бит нужно отключить?Заранее говорю спасибо.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*