Таймер с высоким разрешением в микроконтроллерах STM32

5 октября

управление двигателемпотребительская электроникалабораторные приборыинтернет вещейуниверсальное применениеST Microelectronicsстатьяинтегральные микросхемыCortex-M4МикроконтроллерSTM32G4HRTIMтаймер высокого разрешенияШИМPWM

Вячеслав Гавриков (г. Смоленск)

Для систем с цифровым управлением одним из важнейших параметров является разрешение. Чем точнее выполняется генерация и измерение сигналов, тем выше будет качество управления. Это касается таких приложений как источники питания, мощные инверторы, системы освещения, управление электродвигателями и прочие. Специально для ответственных задач компания STMicroelectronics предлагает использовать микроконтроллеры STM32 со встроенным таймером повышенного разрешения HRTIM.

Таймер повышенного разрешения HRTIM позволяет формировать сигналы с очень точными таймингами в пикосекундном диапазоне. Это делает его отличным инструментом для управления многофазными инверторами, электродвигателями, источниками питания и так далее.

По своей структуре HRTIM сложнее обычных таймеров. По этой причине его настройка и работа с ним также более сложны. Тем не менее, благодаря множеству готовых примеров, а также наличию отладочных плат и бесплатной среды STM32CubeIDE (со встроенным кодогенератором CubeMX) разобраться с HRTIM сможет даже тот, кто ранее не имел дела с STM32.

Ниже мы разберем конкретные примеры работы с HRTIM на базе фирменных отладочных плат производства STMicroelectronics.

Структура и особенности HRTIM

В настоящий момент таймер повышенного разрешения HRTIM можно найти в трех семействах микроконтроллеров STM32: STM32F3, STM32H7 и STM32G4 (таблица 1).

Таблица 1. Версии HRTIM в различных семействах STM32

Наименование семейства Наименование микроконтроллера Версия HRTIM Отличия
STM32F3 STM32F334xx V1.0
STM32H7 STM32H74xxx

STM32H75xxx

V1.1 Нет DLL
STM32G4 STM32G47xxx

STM32G48xxx

V2.0 Добавлен еще один таймер и вход FAULT, добавлены новые режимы работы

Возможности HRTIM зависят от версии. Самый продвинутый вариант HRTIM V2.0 реализован в линейках STM32G47xxx/ STM32G48xxx (рисунок 1). В модуле HRTIM V2.0 присутствует один ведущий таймер и шесть ведомых (TIMER A…F). Ведомые таймеры имеют свои собственные блоки захвата/сравнения и способны работать независимо друг от друга. Они используются для приема входных сигналов от внешних устройств и встроенной периферии (например, от компараторов), а также для управления выходами и встроенной периферией (например, запуска АЦП). У HRTIM есть 12 выходов, что позволяет формировать до шести комплементарных выходов.

Рис. 1. Блок-схема HRTIM в STM32G4

Рис. 1. Блок-схема HRTIM в STM32G4

В случае с HRTIM версии V2.0 тактирование осуществляется от PLL микроконтроллера, поэтому входная тактовая частота HRTIM может достигать 170 МГц (таблица 2). Внутри HRTIM тактовый сигнал дополнительно умножается с помощью встроенной схемы автоподстройки задержек (Delay‐Locked Loop, DLL). При максимальном коэффициенте умножения (32) частота тактирования ведущего и ведомых таймеров может достигать 5,44 ГГц, а разрешение выходных сигналов – 184 пс. Стоит отметить, что перед началом работы схема DLL требует самокалибровки. Повторная самокалибровка может потребоваться при изменении внешних условий: температуры, напряжения питания и так далее.

Таблица 2. Разрешение и максимальная частота таймеров HRTIM различных версий

Наименование Вход PLL Входная частота, МГц Частота HRTIM, ГГц Разрешение, пс
Мин. Макс. Мин. Макс. Мин. Макс.
STM32F334xx HSE 128 144 4,096 4,608 217 244
HSI 128 4,096
STM32H74xxx, STM32H75xxx Любой 480 0,48 208 (без DLL)
STM32G47xxx, STM32G48xxx 100 170 3,2 5,44 184 312

Прежде чем приступать к рассмотрению конкретных примеров, стоит сделать важное замечание относительно совместимости различных версий HRTIM.

Таймеры HRTIM версий V1.0 и V1.1 отличаются только наличием DLL (в V1.1 DLL отсутствует). С точки зрения битовой реализации они идентичны (одинаковые регистры, одинаковые поля и флаги). Таким образом, при работе с ними необходимо учитывать лишь две особенности:

  • в HRTIM версии V1.1 биты CKPSC[2:0] регистра HRTIM_MCR не используются;
  • в HRTIM версии V1.1 максимальное разрешение составляет 2,5 нс.

К сожалению, при миграции с HRTIM версий V1.0 или V1.1 на V2.0 проблем значительно больше из-за отсутствия полной регистровой идентичности. Тем не менее, при использовании фирменных HAL-библиотек процесс миграции существенно упрощается, особенно при работе с STM32CubeIDE.

Что необходимо для запуска готовых примеров

Для того чтобы максимально быстро разобраться с HRTIM, следует воспользоваться фирменными отладочными платами производства STMicroelectronics. Для запуска простых примеров, таких как ШИМ, будет достаточно плат Nucleo, например, NUCLEO-G474RE. Если же ставится цель разобраться с особенностями работы импульсных преобразователей, то для этого лучше подойдут платы Discovery, например, B-G474E-DPOW1 или STM32F3348-DISCO, так как они сами по себе представляют готовые понижающе-повышающие импульсные регуляторы.

Имея отладочную плату, пользователю останется всего лишь установить бесплатную среду STM32CubeIDE и необходимый программный пакет с библиотеками и примерами. В случае с STM32G4 это пакет STM32Cube FW_G4 V1.2.0 (актуальная версия на момент написания статьи).

STM32CubeIDE можно бесплатно скачать на официальном сайте ST. После установки STM32CubeIDE необходимо скачать и установить программный пакет STM32Cube FW_G4 V1.2.0 (рисунок 2):

  • запускаем STM32CubeIDE;
  • в меню «Help» выбираем пункт «Manage embedded software package»;
  • в открывшемся окне выбираем пункт с нужной библиотекой, устанавливаем галочку и нажимаем кнопку «Install Now».

Рис. 2. Добавляем библиотеку для STM32G4

Рис. 2. Добавляем библиотеку для STM32G4

Теперь можно запускать готовые примеры.

Генерация одного ШИМ-сигнала

Чтобы разобраться с особенностями настройки HRTIM, следует идти от простого к сложному. Именно поэтому мы начнем с самого простого примера – генерации одиночного ШИМ-сигнала. ШИМ-сигналы используются в широком спектре приложений: в импульсных источниках питания, приводах электродвигателей, системах освещения, усилителях мощности класса D и так далее.

Мы будем работать с платой NUCLEO-G474RE и готовым проектом HRTIM_Basic_SinglePWM, который вместе с другими примерами можно найти в папке STM32Cube\Repository\STM32Cube_FW_G4_V1.2.0\Projects\NUCLEO-G474RE\Examples\HRTIM\.

В данном примере HRTIM генерирует ШИМ-сигнал с частотой 100 кГц и коэффициентом заполнения 50% (рисунок 3). Период сигнала определяется содержимым регистра HRTIM_PER, а коэффициент заполнения – содержимым регистра сравнения HRTIM_CMP. Для неподготовленного пользователя данная задача может показаться относительно сложной, но огромным плюсом STM32CubeIDE является возможность создания кода инициализации с помощью кодогенератора CubeMX.

Рис. 3. Простой ШИМ-сигнал

Рис. 3. Простой ШИМ-сигнал

После открытия примера окно STM32CubeIDE будет выглядеть так, как показано на рисунке 4. Уже сейчас проект можно скомпилировать (project → build all) и запустить (Run → debug).

Рис. 4.Запуск проекта HRTIM_Basic_SinglePWM

Рис. 4. Запуск проекта HRTIM_Basic_SinglePWM

Чтобы разобраться с настройками системной периферии и HRTIM, следует запустить CubeMX. Для этого необходимо дважды кликнуть по файлу HRTIM_Basic_SinglePWM.ioc, входящему в состав проекта. Важно отметить, что в этом и во всех последующих примерах абсолютно ничего менять не нужно – все поля уже заданы. Мы будем просто отмечать наиболее важные особенности настроек. 

Настройка системы тактирования

Для нормальной работы HRTIM необходимо настроить систему тактирования. Благодаря CubeMX настройка системы тактирования выполняется за несколько кликов. Это можно сделать на вкладке «Clock Configuration» (рисунок 5). Как отмечалось выше, HRTIM тактируется напрямую от PLL. В качестве исходного сигнала для PLL может использоваться высокочастотный встроенный осциллятор HSI или высокочастотный внешний осциллятор HSE. В нашем случае тактирование микроконтроллера производится от HSE, и системная частота составляет 170 МГц. Стоит отметить, что настройки дерева тактирования во всех рассматриваемых в статье примерах будут иметь точно такой же вид.

При генерации кода CubeMX автоматически создает функцию SystemClock_Config(), в которой выполняется инициализация системы тактирования в соответствии с выбранными настройками. Мы можем открыть файл main.c и убедиться, что функция SystemClock_Config() генерируется автоматически и не требует каких-либо изменений со стороны пользователя.

Рис. 5. Вид дерева тактирования в примере HRTIM_Basic_SinglePWM.ioc

Рис. 5. Вид дерева тактирования в примере HRTIM_Basic_SinglePWM.ioc 

Инициализация выводов

Инициализация выводов микроконтроллера также выполняется с помощью CubeMX на вкладке «Pinout and Configuration».

Стоит отметить, что при генерации кода CubeMX помещает инициализацию всех выводов, не связанных напрямую с периферией, в функцию MX_GPIO_Init(). В то же время выводы с альтернативными функциями инициализируются в собственных функциях в файле stm32g4xx_hal_msp.c. В нашем случае выход таймера D (HRTIM1_CHD1) выведен на порт PB14 и инициализируется в отдельной функции HAL_HRTIM_MspPostInit(HRTIM_HandleTypeDef* hhrtim). Настройка параметров PB14 выполняется на вкладке Categories → System Core → GPIO → HRTIM (рисунок 6).

Рис. 6. Назначение выводов в примере HRTIM_Basic_SinglePWM

Рис. 6. Назначение выводов в примере HRTIM_Basic_SinglePWM

Инициализация HRTIM

Инициализация самого модуля HRTIM выполняется в окне «Pinout and Configuration» на вкладке Categories → Timers → HRTIM (рисунок 7). Так как нам нужен всего один ШИМ-сигнал, то в окне «Mode» разрешена только работа одного выхода Timer D: TD1 output active.

Рис. 7. Настройка параметров HRTIM в примере HRTIM_Basic_SinglePWM

Рис. 7. Настройка параметров HRTIM в примере HRTIM_Basic_SinglePWM

Для анализа настроек Timer D нужно перейти на вкладку «Timer D». Для доступа к продвинутым настройкам необходимо, чтобы в разделе «General» в графе «Basic/Advanced Configuration» был выбран вариант «Advanced» (рисунок 8).

В разделе «Time Base Setting» задаются базовые настройки счетчика. Поле «Prescaler Ratio» определяет коэффициент умножения входного тактового сигнала. Если выбран максимальный коэффициент 32 (как на рисунке 8), то частота тактирования таймера составит 5,44 ГГц. Период счета (в нашем случае это период ШИМ) задается в поле «Period». Как видно на рисунке 8, поле «Period» имеет значение TIMD_PERIOD. Чтобы программа корректно обрабатывала это символьное именование, необходимо убедиться, что в настройках поля стоит галочка «No check». Константа TIMD_PERIOD определяется вручную в коде программы, и о ней мы скажем позднее.

Рис. 8. Базовые настройки счетчика таймера D

Рис. 8. Базовые настройки счетчика таймера D

Кроме настройки параметров счета необходимо настроить блок сравнения в поле «Compare Unit 1» (рисунок 9). Как видно из этого рисунка, работа модуля сравнения разрешена («Enable»). Значение поля «Compare Value» в нашем примере определяет коэффициент заполнения ШИМ. Для задания снова используются константы, определяемые пользователем: TIMD_PERIOD × TIMD_DUTY_CYCLE.

Рис. 9. Настройки модуля сравнения CMP1 таймера D

Рис. 9. Настройки модуля сравнения CMP1 таймера D

На рисунке 10 выполняется настройка алгоритма переключения выхода таймера D. Поле «Output 1 Configuration» определяет, на какой вывод будет направлен выход таймера. В нашем случае это TD1. Поле «Polarity» определяет активный уровень сигнала. В поле «Set Source selection» необходимо задавать количество источников установки активного уровня на выходе. В нашем случае выходной сигнал принимает значение «1» только при сбросе счетчика, поэтому в этой графе стоит 1 (один источник установки). В следующей графе указан конкретный источник: Timer period event forces the output to its active state («Переполнение счетчика устанавливает активный уровень на выходе»). Следующая графа «Reset Source selection» определяет количество источников сброса выходного сигнала. У нас один источник сброса – Timer compare 1 event forces the output to its inactive state («Переполнение счетчика устанавливает неактивный уровень на выходе»).

Рис. 10. Настройки алгоритма переключения выхода таймера D

Рис. 10. Настройки алгоритма переключения выхода таймера D

В процессе генерации кода CubeMX автоматически создает код инициализации HRTIM в виде функции static void MX_HRTIM1_Init(void), в которой пользователю ничего менять не требуется. Кроме того, CubeMX автоматически разрешает тактирование порта B (с которым работает HRTIM) и выполняет инициализацию вывода PB14 в функции HAL_HRTIM_MspPostInit(HRTIM_HandleTypeDef* hhrtim), которая размещена в файле stm32g4xx_hal_msp.c.

Для большей наглядности часть констант в проекте определяется напрямую в CubeMX. На вкладке «User Constants» определены следующие значения (рисунок 7):

  • HRTIM_INPUT_CLOCK – входной тактовый сигнал таймера (170 МГц);
  • TIMD_PWM_FREQ – желаемая частота ШИМ (100 кГц);
  • TIMD_DUTY_CYCLE – коэффициент заполнения 0,5.

Все эти определения автоматически вставляются в файл main.h.

После окончания работы с CubeMX необходимо сгенерировать код (Project → Generate code) и сохранить проект. Рассмотрим сгенерированный код, а также ту незначительную часть кода, которая была добавлена вручную. При этом необходимо сразу отметить, что в данном примере пользовательский код присутствует только в файле main.c.

Основная функция main оказывается очень простой и содержит вызов всего нескольких функций:


int main(void)

{

  /* USER CODE BEGIN 1 */ 

  /* USER CODE END 1 */ 

  /* MCU Configuration--------------------------------------------------------*/ 

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */

  HAL_Init(); 

  /* USER CODE BEGIN Init */ 

  /* USER CODE END Init */ 

  /* Configure the system clock */

  SystemClock_Config(); 

  /* USER CODE BEGIN SysInit */ 

  /* USER CODE END SysInit */ 

  /* Initialize all configured peripherals */

  MX_GPIO_Init();

  MX_HRTIM1_Init();

  /* USER CODE BEGIN 2 */ 

  /* LED2 toggles during the demo */

  BSP_LED_Init(LED2); 

  /* Enable HRTIM's outputs TD1 and start Timer D */

  HAL_HRTIM_WaveformOutputStart(&hhrtim1, HRTIM_OUTPUT_TD1);

  HAL_HRTIM_WaveformCounterStart(&hhrtim1, HRTIM_TIMERID_TIMER_D); 

  /* USER CODE END 2 */ 

  /* Infinite loop */

  /* USER CODE BEGIN WHILE */

  while (1)

  {

    /* USER CODE END WHILE */ 

    /* USER CODE BEGIN 3 */ 

    BSP_LED_Toggle(LED2);

    HAL_Delay(100); 

  }

  /* USER CODE END 3 */

}

Рассмотрим вызываемые функции этого кода:

  • HAL_Init() – автоматически генерируемая функция, выполняющая инициализацию HAL;
  • SystemClock_Config() – автоматически генерируемая функция, выполняющая инициализацию системной периферии и тактирования микроконтроллера;
  • MX_GPIO_Init() – автоматически генерируемая функция, выполняющая инициализацию портов ввода/вывода (кроме PB14);
  • MX_HRTIM1_Init() – автоматически генерируемая функция, выполняющая инициализацию HRTIM;
  • BSP_LED_Init(LED2) – библиотечная функция (файл stm32g4xx_nucleo.c), которая выполняет инициализацию светодиода LED2;
  • HAL_HRTIM_WaveformOutputStart(&hhrtim1, HRTIM_OUTPUT_TD1) – библиотечная функция, разрешающая работу выхода TD1;
  • HAL_HRTIM_WaveformCounterStart(&hhrtim1, HRTIM_TIMERID_TIMER_D) – библиотечная функция, запускающая таймер D;
  • BSP_LED_Toggle(LED2) – библиотечная функция (файл stm32g4xx_nucleo.c), которая переключает светодиод;
  • HAL_Delay(100) – функция задержки.

Для нас наибольший интерес представляет функция MX_HRTIM1_Init(). Рассмотрим ее подробнее.

В начале MX_HRTIM1_Init() вызывается HAL-функция инициализации HAL_HRTIM_Init(&hhrtim1), в которой, в частности, разрешается тактирование HRTIM (за это отвечает функция __HAL_RCC_HRTIM1_CLK_ENABLE()).

Далее запускается калибровка DLL:



HAL_HRTIM_DLLCalibrationStart(&hhrtim1, HRTIM_CALIBRATIONRATE_3).

Окончание калибровки отслеживается методом обычного поллинга со значением таймаута 10:



HAL_HRTIM_PollForDLLCalibration(&hhrtim1, 10).

После калибровки DLL настраивается работа счетчика:



  pTimeBaseCfg.Period = TIMD_PERIOD;

  pTimeBaseCfg.RepetitionCounter = 0x00;

  pTimeBaseCfg.PrescalerRatio = HRTIM_PRESCALERRATIO_MUL32;

  pTimeBaseCfg.Mode = HRTIM_MODE_CONTINUOUS;

  if (HAL_HRTIM_TimeBaseConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_D, &pTimeBaseCfg) != HAL_OK)

  {

    Error_Handler();

  }

Несложно заметить, что все параметры в точности соответствуют параметрам, заданным вCubeMX (как показано на рисунке 8).

Период ШИМ задается с помощью константы TIMD_PERIOD. TIMD_PERIOD определяется в начале файла main.c в секции /* USER CODE BEGIN PD */. На этом определении нужно остановиться подробнее. В CubeMX уже были определены значения HRTIM_INPUT_CLOCK (входной тактовый сигнал таймера), TIMD_PWM_FREQ (желаемая частота ШИМ) и TIMD_DUTY_CYCLE (коэффициент заполнения ШИМ). Однако эти удобные для человека значения необходимо преобразовать в настройки HRTIM. Период ШИМ определяется содержимым регистра HRTIM_PER. Если таймер работает с максимальной рабочей частотой (Prescaler Ratio = 32, смотреть рисунок 8), тогда значение TIMD_PERIOD, записываемое в HRTIM_PER, определяется следующим образом:



#define TIMD_PERIOD ((uint16_t)((((uint64_t)HRTIM_INPUT_CLOCK) * 32) / TIMD_PWM_FREQ)).

Если получаемое значение не умещается в формате 16-битного числа, то следует использовать меньшую частоту. Например, при значении коэффициента Prescaler Ratio = 8 определение TIMD_PERIOD будет иметь следующий вид:



#define TIMD_PERIOD ((uint16_t)((((uint64_t)HRTIM_INPUT_CLOCK) * 8) / TIMD_PWM_FREQ)).

Сгенерированный код для настройки коэффициента заполнения соответствует настройкам CubeMX и имеет вид:



  pCompareCfg.CompareValue = TIMD_PERIOD * TIMD_DUTY_CYCLE;

  if (HAL_HRTIM_WaveformCompareConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_D, HRTIM_COMPAREUNIT_1, &pCompareCfg) != HAL_OK)

  {

    Error_Handler();

}

Сгенерированный код для настройки алгоритма изменения выходного сигнала также соответствует настройкам CubeMX и имеет вид:



  pOutputCfg.Polarity = HRTIM_OUTPUTPOLARITY_HIGH;

  pOutputCfg.SetSource = HRTIM_OUTPUTSET_TIMPER;

  pOutputCfg.ResetSource = HRTIM_OUTPUTRESET_TIMCMP1;

  if (HAL_HRTIM_WaveformOutputConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_D, HRTIM_OUTPUT_TD1, &pOutputCfg) != HAL_OK)

  {

    Error_Handler();

  }

В конце функции MX_HRTIM1_Init() вызывается функция HAL_HRTIM_MspPostInit(&hhrtim1). В ней разрешается тактирование порта B и настраивается работа вывода PB14:



void HAL_HRTIM_MspPostInit(HRTIM_HandleTypeDef* hhrtim)

{

  GPIO_InitTypeDef GPIO_InitStruct = {0};

  if(hhrtim->Instance==HRTIM1)

  {

  /* USER CODE BEGIN HRTIM1_MspPostInit 0 */ 

  /* USER CODE END HRTIM1_MspPostInit 0 */  

    __HAL_RCC_GPIOB_CLK_ENABLE();

    /**HRTIM1 GPIO Configuration    

    PB14     ------> HRTIM1_CHD1 

    */

    GPIO_InitStruct.Pin = GPIO_PIN_14;

    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

    GPIO_InitStruct.Pull = GPIO_NOPULL;

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;

    GPIO_InitStruct.Alternate = GPIO_AF13_HRTIM1;

    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); 

  /* USER CODE BEGIN HRTIM1_MspPostInit 1 */ 

  /* USER CODE END HRTIM1_MspPostInit 1 */

  }

}

Как видно из текста main.c, пользовательский код оказывается очень коротким:

  • в секции USER CODE BEGIN 2 инициализируется светодиод LED2 и запускается работа таймера:

  HAL_HRTIM_WaveformOutputStart(&hhrtim1, HRTIM_OUTPUT_TD1);

  HAL_HRTIM_WaveformCounterStart(&hhrtim1, HRTIM_TIMERID_TIMER_D);

  • в секции USER CODE BEGIN 3 происходит переключение светодиода и выполнение задержки;
  • в начале файла main.c выполняется определение TIMD_PERIOD.

Таким образом, генерация простого ШИМ с помощью HRTIM1 выполняется практически автоматически и не требует каких-то особых навыков программирования.

Генерация нескольких ШИМ-сигналов

Рассмотрим более сложный пример HRTIM_Basic_MultiplePWM с генерацией нескольких ШИМ-сигналов. Этот пример можно найти в папке STM32Cube\Repository\STM32Cube_FW_G4_V1.2.0\Projects\NUCLEO-G474RE\Examples\HRTIM\HRTIM_Basic_MultiplePWM\.

В этом примере Таймер A будет генерировать два смещенных друг относительно друга ШИМ-сигнала с частотой 100 кГц и коэффициентом заполнения 25%, а таймер D будет генерировать два смещенных друг относительно друга ШИМ-сигнала с частотой 33,3 кГц и коэффициентом заполнения 25% (рисунок 11).

Рис. 11. ШИМ-сигналы в проекте HRTIM_Basic_MultiplePWM

Рис. 11. ШИМ-сигналы в проекте HRTIM_Basic_MultiplePWM

Рассмотрим настройки проекта в CubeMX. Для этого необходимо открыть файл HRTIM_Basic_MultiplePWM.ioc. По сравнению с предыдущим примером настройка дерева тактирования не изменилась (рисунок 5). Изменения коснулись настройки портов ввода-вывода и самого таймера HRTIM (рисунок 12). Выходы таймера А были выведены на PA8 и PA9, а выходы таймера D – на PB14 и PB15.

Рис. 12. Настройка HRTIM и портов ввода-вывода в проекте HRTIM_Basic_MultiplePWM.ioc

Рис. 12. Настройка HRTIM и портов ввода-вывода в проекте HRTIM_Basic_MultiplePWM.ioc

В таймере А задействованы три модуля сравнения, в таймере D — два модуля сравнения. Стоит также отметить, что частота ШИМ таймера D (33,3 кГц) требует уменьшения тактовой частоты, в противном случае нам не удастся остаться в рамках 16 разрядов при вычислении TIMD_PERIOD. Поэтому для таймера D был выбран коэффициент Prescaler Ratio = 8 (рисунок 13).

Рис. 13. Настройка HRTIM в проекте HRTIM_Basic_MultiplePWM.ioc

Рис. 13. Настройка HRTIM в проекте HRTIM_Basic_MultiplePWM.ioc

Структура main.c осталась такой же, как и в предыдущем проекте, поэтому рассмотрим только наиболее важные изменения в коде.

Определения констант для задания частоты ШИМ имеют вид:



#define TIMD_PWM_FREQ (uint32_t)(TIMA_PWM_FREQ/3) // частота ШИМ таймера D  в три раза меньше чем, у таймера А

#define TIMA_PERIOD ((uint16_t)(((uint64_t)HRTIM_INPUT_CLOCK * 32) / TIMA_PWM_FREQ))

#define TIMD_PERIOD ((uint16_t)(((uint64_t)HRTIM_INPUT_CLOCK * 8) / TIMD_PWM_FREQ))

Здесь еще раз стоит отметить, что для получения частоты 33,3 кГц в таймере D пришлось использовать умножитель на 8. В противном случае значение TIMD_PERIOD не уместилось бы в 16-битный формат. В результате формула для TIMD_PERIOD изменилась.

Единственные изменения главной функции main(void) коснулись только запуска таймеров:



HAL_HRTIM_WaveformOutputStart(&hhrtim1, HRTIM_OUTPUT_TA1 + HRTIM_OUTPUT_TA2 + HRTIM_OUTPUT_TD1 + HRTIM_OUTPUT_TD2);

HAL_HRTIM_WaveformCounterStart(&hhrtim1, HRTIM_TIMERID_TIMER_A + HRTIM_TIMERID_TIMER_D);

Из остальных функций, реализованных в main.c, изменения коснулись, в основном, MX_HRTIM1_Init(). Во-первых, как отмечалось выше, при инициализации таймера D мы используем другой делитель: HRTIM_PRESCALERRATIO_MUL8. Во-вторых, изменилась логика переключений выходных сигналов. Установка выходного сигнала TA1 происходит при сбросе счетчика таймера A, а сброс выходного сигнала при сравнении с содержимым регистра HRTIM_CMP1 (TIMA_PERIOD/4) выглядит следующим образом:



  pOutputCfg.Polarity = HRTIM_OUTPUTPOLARITY_HIGH;

  pOutputCfg.SetSource = HRTIM_OUTPUTSET_TIMPER;

  pOutputCfg.ResetSource = HRTIM_OUTPUTRESET_TIMCMP1;

  pOutputCfg.IdleMode = HRTIM_OUTPUTIDLEMODE_NONE;

  pOutputCfg.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE;

  pOutputCfg.FaultLevel = HRTIM_OUTPUTFAULTLEVEL_NONE;

  pOutputCfg.ChopperModeEnable = HRTIM_OUTPUTCHOPPERMODE_DISABLED;

  pOutputCfg.BurstModeEntryDelayed = HRTIM_OUTPUTBURSTMODEENTRY_REGULAR;

  if (HAL_HRTIM_WaveformOutputConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_A, HRTIM_OUTPUT_TA1, &pOutputCfg) != HAL_OK)

  {

    Error_Handler();

  }

Установка выходного сигнала TA2 происходит при сравнении с содержимым регистра HRTIM_CMP2 (TIMA_PERIOD/2), а сброс – при сравнении с содержимым регистра HRTIM_CMP3 (3*TIMA_PERIOD/4):



  pOutputCfg.SetSource = HRTIM_OUTPUTSET_TIMCMP2;

  pOutputCfg.ResetSource = HRTIM_OUTPUTRESET_TIMCMP3;

  if (HAL_HRTIM_WaveformOutputConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_A, HRTIM_OUTPUT_TA2, &pOutputCfg) != HAL_OK)

  {

    Error_Handler();

  }

Установка выходного сигнала TD1 происходит при сбросе счетчика таймера D, а сброс выходного сигнала – при сравнении с содержимым регистра HRTIM_CMP1 (TIMD_PERIOD/4).

Установка выходного сигнала TD2 происходит при сравнении с содержимым регистра HRTIM_CMP2 (3*TIMD_PERIOD/4), а сброс – при сбросе счетчика таймера D.

Кроме того, поскольку число выходов таймеров увеличилось, то изменения коснулись и функции инициализации HAL_HRTIM_MspPostInit(&hhrtim1), в которой настраивается работа выходов таймеров.

Генерация ШИМ с привлечением ведущего таймера

Благодаря коммутирующей матрице ведомые таймеры HRTIM могут работать с любыми выходами HRTIM. Это обеспечивает высокую гибкость и простую переносимость кода. Например, выводы HRTIM_CHE1 и HRTIM_CHE2 есть не во всех корпусных исполнениях, тем не менее, таймер E может использоваться для генерации ШИМ на других выходах.

В следующем примере HRTIM_Basic_PWMMaster мы рассмотрим возможность генерации ШИМ с привлечением ведущего таймера (рисунок 14). Таймер D будет работать с частотой 100 кГц и генерировать ШИМ-сигнал на выходе TD1 с коэффициентом заполнения 0,25. Ведущий таймер будет работать с частотой 101 кГц и генерировать ШИМ-сигнал на выходе TD2 с коэффициентом заполнения 0,5.

Рис. 14. Генерация ШИМ в примере HRTIM_Basic_PWMMaster

Рис. 14. Генерация ШИМ в примере HRTIM_Basic_PWMMaster

Как всегда, начинаем с открытия готового примера и запуска файла CubeMX (рисунок 15). В отличие от предыдущих примеров, при настройке таймеров необходимо установить галочку «Master Timer Enable», чтобы разрешить работу ведущего таймера. Настройка ведущего таймера аналогична настройке ведомых таймеров. Кроме того, в списке определений появились новые пункты: MASTER_PWM_FREQ и MASTER_DUTY_CYCLE.

Рис. 15. Настройка HRTIM и портов ввода-вывода в проекте HRTIM_Basic_PWMMaster

Рис. 15. Настройка HRTIM и портов ввода-вывода в проекте HRTIM_Basic_PWMMaster

Константы, задающие период ШИМ, определены в файле main.c следующим образом:



#define TIMD_PERIOD ((uint16_t)(((uint64_t)HRTIM_INPUT_CLOCK * 32) / TIMD_PWM_FREQ))

#define MASTER_PERIOD ((uint16_t)(((uint64_t)HRTIM_INPUT_CLOCK * 32) / MASTER_PWM_FREQ))

Для запуска таймеров используются строки:



  HAL_HRTIM_WaveformOutputStart(&hhrtim1, HRTIM_OUTPUT_TD1 + HRTIM_OUTPUT_TD2);

  HAL_HRTIM_WaveformCounterStart(&hhrtim1, HRTIM_TIMERID_MASTER + HRTIM_TIMERID_TIMER_D);

Установка выходного сигнала TD1 происходит при сбросе счетчика таймера D, а сброс выходного сигнала – при сравнении с содержимым регистра HRTIM_CMP (TIMD_PERIOD/2):



  pOutputCfg.Polarity = HRTIM_OUTPUTPOLARITY_HIGH;

  pOutputCfg.SetSource = HRTIM_OUTPUTSET_TIMPER;

  pOutputCfg.ResetSource = HRTIM_OUTPUTRESET_TIMCMP1;

  pOutputCfg.IdleMode = HRTIM_OUTPUTIDLEMODE_NONE;

  pOutputCfg.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE;

  pOutputCfg.FaultLevel = HRTIM_OUTPUTFAULTLEVEL_NONE;

  pOutputCfg.ChopperModeEnable = HRTIM_OUTPUTCHOPPERMODE_DISABLED;

  pOutputCfg.BurstModeEntryDelayed = HRTIM_OUTPUTBURSTMODEENTRY_REGULAR;

  if (HAL_HRTIM_WaveformOutputConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_D, HRTIM_OUTPUT_TD1, &pOutputCfg) != HAL_OK)

  {

    Error_Handler();

  }

Установка выходного сигнала TD2 происходит при сбросе счетчика ведущего таймера, а сброс выходного сигнала – при сравнении с содержимым регистра HRTIM_MCMP (MASTER_PERIOD/2):



  pOutputCfg.SetSource = HRTIM_OUTPUTSET_MASTERPER;

  pOutputCfg.ResetSource = HRTIM_OUTPUTRESET_MASTERCMP1;

  if (HAL_HRTIM_WaveformOutputConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_D, HRTIM_OUTPUT_TD2, &pOutputCfg) != HAL_OK)

  {

    Error_Handler();

  }

Генерация сигнала произвольной формы

В предыдущих примерах все выходные сигналы имели только один источник сброса и один источник установки. Однако пользователи могут задавать несколько условий сброса/установки. Для ознакомления с такой возможностью следует использовать пример HRTIM_Basic_Arbitrary Waveform (рисунок 16).

Рис. 16. Генерация ШИМ в примере HRTIM_Basic_Arbitrary Waveform

Рис. 16. Генерация ШИМ в примере HRTIM_Basic_Arbitrary Waveform

На рисунке 17 показано, каким образом следует настраивать переключения на выходе Output 1. Так как для каждого из выходных сигналов есть по три источника сброса и по три источника установки, то в графах «Set Source selection» и «Reset Source selection» установлены значения «3». Сами источники также указываются в настройках (1st Set Source…3rd Set Source, 1st Reset Source…3rd Reset Source). В данном примере источники сброса и установки для TD1 совпадают:

  • сброс счетчика (первый источник);
  • сравнение с CMP1 (второй источник);
  • сравнение с CMP2 (третий источник).

В результате алгоритм переключений оказывается весьма специфичным (рисунок 16):

Шаг 1. TD1 устанавливается при сбросе таймера (первый источник установки)

Шаг 2. TD1 сбрасывается при совпадении с CMP1 (второй источник сброса).

Шаг 3. TD1 устанавливается при совпадении с CMP2 (третий источник установки).

Шаг 4. TD1 сбрасывается при сбросе таймера (первый источник сброса).

Шаг 5. TD1 устанавливается при совпадении с CMP1 (второй источник установки).

Шаг 6. TD1 сбрасывается при совпадении CMP2 (третий источник сброса).

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

Рис. 17. Настройка источников сброса/установки для выхода TD1

Рис. 17. Настройка источников сброса/установки для выхода TD1

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

Управление понижающим преобразователем напряжения

Импульсный понижающий преобразователь используется для преобразования высокого входного напряжения Vin в более низкое напряжение Vout (рисунок 18). При замыкании силового транзистора энергия передается в нагрузку и параллельно накапливается в выходной индуктивности. При отключении транзистора питание нагрузки осуществляется от энергии, накопленной в дросселе, причем ток протекает через обратный диод. Обычно коммутация транзистора выполняется с помощью ШИМ-сигнала с постоянной частотой и изменяемым коэффициентом заполнения: если усредненное выходное напряжение уменьшается, система управления увеличивает коэффициент заполнения и наоборот.

Рис. 18. Понижающий преобразователь

Рис. 18. Понижающий преобразователь

Для реализации такой системы управления необходимы таймер и АЦП. Таймер будет генерировать ШИМ и запускать АЦП, а АЦП будет измерять напряжение на выходе. Коэффициент заполнения ШИМ-сигнала будет подстраиваться в соответствии с измеренным напряжением.

Для ознакомления с возможностями HRTIM при создании импульсных источников напряжения лучше всего воспользоваться отладочной платой B-G474E-DPOW1. Чтобы подробнее изучить особенности работы HRTIM, рассмотрим готовый пример HRTIM_Dual_Buck, который можно найти в папке STM32Cube\Repository\STM32Cube_FW_G4_V1.2.0\Projects\B-G474E-DPOW1\Examples_MIX\HRTIM\HRTIM_Dual_Buck\.

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

В данном примере HRTIM управляет работой сразу двух понижающих преобразователей, включенных параллельно. Алгоритм работы этого приложения поясняется на рисунках 19 и 20. Таймер D генерирует два ШИМ-сигнала с частотой около118 кГц:

  • HRTIM_CHD1 устанавливается при сбросе счетчика и сбрасывается при сравнении с TD CMP1 (рисунок 19);
  • HRTIM_CHD2 устанавливается при сравнении с TD CMP2 и сбрасывается при сбросе счетчика.

Кроме модулей сравнения CMP1 и CMP2, задействованы модули CMP3 и CMP4. При сравнении по CMP3 и CMP4 формируется триггерный сигнал для запуска АЦП.

Коэффициент заполнения для ШИМ-сигнала на выходе HRTIM_CHD1 и момент запуска АЦП не являются фиксированными и корректируются при возникновении прерываний в случае переполнения таймера (рисунок 20). При обработке прерывания происходит увеличение коэффициента заполнения на один дискрет счетчика. Увеличение идет от 5% до 50%, а потом процесс перезапускается с 5%. Чтобы исключить влияние осцилляций и перенапряжений при коммутациях силового ключа, запуск АЦП происходит в середине импульса ШИМ. Период и коэффициент заполнения для HRTIM_CHD2 являются фиксированными, поэтому далее (для простоты) этот канал мы рассматривать не будем.

Еще одной особенностью проекта является использование аварийного входа Fault для остановки генерации ШИМ. При появлении аварийного сигнала генерация ШИМ блокируется.

Рис. 19. Диаграммы работы периферийных блоков в понижающем преобразователе

Рис. 19. Диаграммы работы периферийных блоков в понижающем преобразователе

Рис. 20. Обновление коэффициента заполнения ШИМ по прерыванию

Рис. 20. Обновление коэффициента заполнения ШИМ по прерыванию

Как всегда, начинаем с анализа настроек проекта в CubeMX. Для этого необходимо воспользоваться файлом HRTIM_Dual_Buck.ioc, который можно найти на панели навигации проекта.

Настройка дерева тактирования в этом проекте не отличается от предыдущих и соответствует изображению на рисунке 5.

Назначение выводов представлено на рисунке 21. HRTIM_CHD1 выведен на PB14, HRTIM_CHD2 — на PB15, аварийный вход Fault — на PA15, вход АЦП использует порт PA2.

Рис. 21. Назначение и настройка выводов таймера

Рис. 21. Назначение и настройка выводов таймера

На рисунке 22 показана настройка АЦП. Используется только канал 2, работающий в несимметричном режиме (Single-ended).

Рис. 22. Настройка АЦП

Рис. 22. Настройка АЦП

На рисунке 23 показана активация входов и выходов для HRTIM.

Рис. 23. Выбор входов и выходов для HRTIM

Рис. 23. Выбор входов и выходов для HRTIM

С точки зрения настройки HRTIM нас в первую очередь интересуют вкладки «Timer D» и «ADC Trigger configuration» (рисунки 24…27). На рисунке 24 для задания модуля счета используется значение BUCK_PWM_PERIOD. Эта константа определяется в проекте вручную. Также стоит отметить, что значение «Repetition Counter» равно 3. Это означает, что прерывание при переполнении генерируется не каждый раз, а только при каждом четвертом переполнении.

Рис. 24. Настройка счетчика

Рис. 24. Настройка счетчика

Настройка модулей сравнения представлена на рисунке 25.

Рис. 25. Настройка модулей сравнения

Рис. 25. Настройка модулей сравнения

Настройка выходов представлена на рисунке 26.

Рис. 26. Настройка логики выходных сигналов

Рис. 26. Настройка логики выходных сигналов

Задание числа аварийных сигналов FAULT и выбор их источников выполняется в следующих графах (рисунок 27):

  • Numbers of faults to enable =1 (один сигнал);
  • 1st Fault source = Fault 2 enable.

Задание числа прерываний от таймера и выбор их источников выполняется в следующих графах (рисунок 27):

  • Interrupt Request Source Selection = 1 (один источник прерывания);
  • 1st Interrupt Request source = HRTIM_TIM_IT_REP (прерывание не при каждом, а только при каждом N-ом переполнении, где N – содержимое регистра REP).

Рис. 27. Настройка аварийного входа и прерываний

Рис. 27. Настройка аварийного входа и прерываний

Настройка триггера для АЦП выполняется на вкладке «ADC trigger configuration» (рисунок 28).

Рис. 28. Настройка триггерного сигнала для АЦП

Рис. 28. Настройка триггерного сигнала для АЦП

Рассмотрение сгенерированного кода в CubeMX не представляет особого интереса, так как во многом повторяет ранее рассмотренные примеры. Принципиальным отличием является появление новой функции инициализации АЦП static void MX_ADC1_Init(void), но в ней пользователю ничего менять не требуется. Тем не менее, в проекте есть несколько важных кусков кода, добавляемых вручную, которые следует рассмотреть подробнее.

Во-первых, в файле main.h размещено определение константы BUCK_PWM_PERIOD:



#define BUCK_PWM_PERIOD ((uint16_t)46080)

Это значение используется для задания периода ШИМ. Так как таймер работает с максимальной частотой 5,44 ГГц, количество тактов 46080 будет примерно соответствовать частоте ШИМ 118 кГц.

В пользовательской секции /* USER CODE BEGIN 2 */ выполняется инициализация светодиодов, калибровка и запуск АЦП, разрешение входов/выходов и счетчика PER HRTIM, запуск таймера HRTIM:



  BSP_LED_Init(LED4);

  BSP_LED_Init(LED5);

  BSP_LED_Init(LED3); 

  BSP_JOY_Init(JOY1, JOY_MODE_GPIO, JOY_SEL); 

  HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED);

  HAL_ADC_Start(&hadc1); 

  LL_HRTIM_EnableOutput(HRTIM1, LL_HRTIM_OUTPUT_TD1 | LL_HRTIM_OUTPUT_TD2);

  LL_HRTIM_EnableIT_REP(HRTIM1, LL_HRTIM_TIMER_D);

  LL_HRTIM_TIM_CounterEnable(HRTIM1, LL_HRTIM_TIMER_D);

В секции /* USER CODE BEGIN 3 */ реализован алгоритм обработки сигнала Fault. После возникновения аварийного сигнала программа будет блокировать работу таймера, пока не будет нажата пользовательская кнопка:



      if (BSP_JOY_GetState(JOY1) == JOY_SEL)

      {

          LL_HRTIM_ClearFlag_FLT2(HRTIM1);

          LL_HRTIM_EnableOutput(HRTIM1, LL_HRTIM_OUTPUT_TD1);

      }

CubeMX подготавливает все необходимые функции обработки прерываний, но разрешение прерываний от HRTIM выполняется вручную. Этот код можно найти в пользовательской секции функции void HAL_HRTIM_MspInit(HRTIM_HandleTypeDef* hhrtim) в файле stm32g4xx_hal_msp.c:



    HAL_NVIC_SetPriority(HRTIM1_TIMD_IRQn, 0, 0);

    HAL_NVIC_EnableIRQ(HRTIM1_TIMD_IRQn);

Непосредственно алгоритм управления коэффициентом заполнения реализован в обработчике прерывания void HRTIM1_TIMD_IRQHandler(void), который можно найти в файле stm32g4xx_it.c. Программа увеличивает коэффициент заполнения на 1 при каждом прерывании. Увеличение идет от 5% до 50%, далее происходит сброс до величины 5%, и алгоритм повторяется:



void HRTIM1_TIMD_IRQHandler(void)

{

  uint32_t CurrentDuty; 

  /* For interrupt duration monitoring purpose */

  BSP_LED_On(LED3);  

  /* Clear interrupt flag */

  LL_HRTIM_ClearFlag_REP(HRTIM1, LL_HRTIM_TIMER_D); 

  /* Get current duty cycle value */

  CurrentDuty = LL_HRTIM_TIM_GetCompare1(HRTIM1, LL_HRTIM_TIMER_D); 

  /* Increase the compare value up to 50% duty cycle and re-start from 5% */

  if (CurrentDuty < BUCK_PWM_PERIOD/2)

  {

    CurrentDuty++;

    LL_HRTIM_TIM_SetCompare1(HRTIM1, LL_HRTIM_TIMER_D, CurrentDuty);// Duty cycle update

    LL_HRTIM_TIM_SetCompare3(HRTIM1, LL_HRTIM_TIMER_D, CurrentDuty/2); // ADC trigger position update

  }

  else  // Re-start ramp from 5% duty cycle

  {

    LL_HRTIM_TIM_SetCompare1(HRTIM1, LL_HRTIM_TIMER_D, BUCK_PWM_PERIOD/20);

    LL_HRTIM_TIM_SetCompare3(HRTIM1, LL_HRTIM_TIMER_D, BUCK_PWM_PERIOD/40);

  } 

  BSP_LED_Off(LED3);

}

Синхронный выпрямитель

Одним из важнейших показателей для импульсных регуляторов является КПД. КПД регулятора из предыдущего примера оказывается не очень высоким из-за потерь на обратном диоде. Для решения проблемы используют синхронную схему, в которой вместо диода присутствует транзистор (рисунок 29). Для управления силовыми транзисторами в такой схеме необходимо генерировать два комплементарных сигнала, разделенных мертвым временем (чтобы избежать сквозных токов).

Рис. 29. Синхронный понижающий преобразователь с защитой от перегрузки по току

Рис. 29. Синхронный понижающий преобразователь с защитой от перегрузки по току

В представленной на рисунке 29 схеме АЦП по-прежнему используется для контроля выходного напряжения, а вход Fault – для защиты по току. Таким образом, отличие от предыдущего примера кроется в первую очередь в использовании комплементарных управляющих сигналов.

Чтобы оценить работу HRTIM в таких приложениях, следует воспользоваться готовым примером HRTIM_Buck_Sync_Rect, который можно найти в папке STM32Cube\Repository\STM32Cube_FW_G4_V1.2.0\Projects\B-G474E-DPOW1\Examples_MIX\HRTIM\HRTIM_Buck_Sync_Rect\.

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

Диаграммы, поясняющие работу HRTIM в примере HRTIM_Buck_Sync_Rect, представлены на рисунке 30.

Рис.30. Диаграммы работы HRTIM в синхронном преобразователе

Рис.30. Диаграммы работы HRTIM в синхронном преобразователе

Для анализа настроек обратимся к CubeMX (файл HRTIM_Buck_Sync_Rect.ioc). Поскольку в этом примере используется таймер TIM C, то небольшие изменения коснулись распиновки (рисунок 31). ШИМ выводится на PB12 и PB13. Вывод PB15 используется для блокировки работы повышающе-понижающего преобразователя. Это статичный выход, на нем должен постоянно присутствовать высокий уровень.

Рис. 31. Назначение выводов в проекте HRTIM_Buck_Sync_Rect

Рис. 31. Назначение выводов в проекте HRTIM_Buck_Sync_Rect

По сравнению с предыдущим проектом, настройки АЦП остались без изменения, зато настройки таймера TIM С имеют некоторые важные изменения (рисунки 31…33):

  • генерация прерываний от таймера происходит только каждое 128-ое переполнение — RepetitionCounter= 127 (рисунок 32);
  • период ШИМ определяется значением BUCK_PWM_PERIOD = 21760, что соответствует частоте 250 кГц, данная константа определяется на вкладке «User Constants» (рисунок 32);
  • между переключениями выходов 1 и 2 вставляется мертвое время, что отображается на поле «Dead time insertion» (рисунок 33);
  • длительность мертвого времени при включении и выключении отличается и определяется значениями DT_RISING (250) и DT_FALLING (300), эти константы определяются на вкладке «User Constants»;
  • поскольку используется мертвое время, настройки TD2 автоматически повторяют настройки TD1 (рисунок 34).

Рис. 32. Базовые параметры

Рис. 32. Базовые параметры

Рис. 33. Параметры мертвого времени

Рис. 33. Параметры мертвого времени

Рис. 34. Алгоритм переключения выходов

Рис. 34. Алгоритм переключения выходов

Структура программы практически полностью соответствует структуре прошлого примера.

Другие примеры

Рассмотренные примеры не демонстрируют всех возможностей HRTIM. В руководстве AN4539 HRTIM cookbook [1] дополнительно рассматриваются примеры работы HRTIM в составе повышающе-понижающего преобразователя, корректора коэффициента мощности и многофазного преобразователя. Данное руководство опирается на примеры из библиотеки STM32Cube_FW_F3_V1.11.0, однако при желании изложенные в них принципы можно адаптировать для HRTIM микроконтроллеров STM32G4.

Краткий вывод

Таймер HRTIM отличается от обычных таймеров расширенным функционалом и возможностью генерации прецизионных таймингов выходных сигналов в пикосекундном диапазоне. В частности, микроконтроллеры STM32G47xxx/STM32G48xxx способны генерировать до 12 ШИМ-сигналов, или шести комплементарных пар выходных сигналов, с разрешением до 184 пс.

Наличие HRTIM и АЦП позволяет микроконтроллерам STM32G47xxx/STM32G48xxx обеспечивать максимальную эффективность при реализации различных импульсных преобразователей и инверторов в составе приводов электродвигателей, в системах освещения, в источниках питания.

Несмотря на сложную структуру HRTIM, проблем с настройкой HRTIM, в том числе при совместной работе с АЦП, при использовании готовых библиотек от ST не будет. Кроме того, процесс настройки HRTIM и АЦП, а также другой периферии, может быть выполнен за несколько минут с помощью кодогенератора CubeMX, входящего в состав бесплатной среды STM32CubeIDE.

Видео

Литература

  1. Application note. HRTIM cookbook.
  2. User manual. Discovery kit with STM32G474RE MCU.
•••

Наши информационные каналы

О компании ST Microelectronics

Компания STMicroelectronics является №1 производителем электроники в Европе. Компоненты ST широко представлены в окружающих нас потребительских товарах – от iPhone до автомобилей разных марок. Лидеры индустриального рынка выбирают компоненты ST за их надежность и выдающиеся технические параметры. В компании ST работает 48 000 сотрудников в 35 странах. Производственные мощности расположены в 12 странах мира. Более 11 тысяч сотрудников заняты исследованиями и разработками – инновационное лидерство ...читать далее

Товары
Наименование
NUCLEO-G474RE (ST)
B-G474E-DPOW1 (ST)
STM32G474CBT6 (ST)
STM32G484CEU6 (ST)