Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Кармин Новиелло - Освоение STM32.pdf
Скачиваний:
2751
Добавлен:
23.09.2021
Размер:
47.68 Mб
Скачать

Таймеры

345

На рисунке 29 показан выходной сигнал канала 1 таймера TIM3: как видите, используя адекватный каскад фильтрации37, достаточно просто генерировать чистый синусоидальный сигнал 50 Гц.

11.3.7.2. Использование CubeMX для конфигурации режима ШИМ

Процесс конфигурации режима ШИМ в CubeMX становится простым, как только будут освоены основные принципы генерации ШИМ. Первым шагом является выбор режима PWM Generation CHx для желаемого канала, как показано на рисунке 19. Далее, из представления конфигурации TIMx (здесь не показано), можно сконфигурировать другие параметры ШИМ (Режим ШИМ 1 или 2, полярность канала и т. д.).

11.3.8. Одноимпульсный режим

Одноимпульсный режим (One Pulse Mode, OPM) представляет собой сочетание режимов захвата входного сигнала и сравнения выходного сигнала, предлагаемых таймерами об-

щего назначения и расширенного управления. Он позволяет запускать счетчик в ответ на раздражитель и генерировать импульс с программируемой длительностью (ШИМ) после программируемой задержки.

OPM – это режим, разработанный для работы исключительно с каналами 1 и 2 таймера. Мы можем решить, какой из двух каналов является выходным, а какой – входным, используя функцию:

HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef* sConfig,

uint32_t OutputChannel, uint32_t InputChannel);

Оба канала конфигурируются экземпляром структуры Си TIM_OnePulse_InitTypeDef, которая определена следующим образом:

typedef struct {

 

 

uint32_t Pulse;

/* Задает значение импульса для загрузки в

 

 

регистр CCRx

*/

/* Конфигурация выходного канала */

 

uint32_t OCMode;

/* Задает режим таймера.

*/

uint32_t OCPolarity;

/* Задает активный фронт выходного сигнала.

*/

uint32_t OCNPolarity; /* Задает полярность комплементарного выхода.

*/

uint32_t OCIdleState; /* Задает состояние вывода сравнения выходного

 

 

сигнала во время состояния простоя (Idle state).

*/

uint32_t OCNIdleState;

/* Задает состояние комплементарного вывода сравнения

 

 

выходного сигнала во время состояния простоя.

*/

/* Конфигурация входного канала */

 

uint32_t ICPolarity;

/* Задает активный фронт входного сигнала.

*/

uint32_t ICSelection;

/* Задает вход.

*/

uint32_t ICFilter;

/* Задает фильтр захвата входа.

*/

} TIM_OnePulse_InitTypeDef;

Структура логически разделена на две части: одна связана с конфигурацией входного канала, а другая – с конфигурацией выходного. Мы не будем вдаваться в подробности

37 Здесь я использовал резистор 100 Ом и конденсатор 10 мкФ, которые дают частоту среза ~159 Гц и Vpp, равное 0,08 В.

TIM_OPMODE_REPETITIVE
TIM_OPMODE_SINGLE

Таймеры

346

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

Важным аспектом для понимания является способ, которым таймер вычисляет задержку и длительность импульса. Задержка рассчитывается по следующей формуле:

Задержка =

 

Pulse

 

 

TIMx _ CLK

 

 

 

 

 

 

 

Prescaler +1

 

[10]

в то время как длительность (то есть коэффициент заполнения) импульса вычисляется следующим образом:

Длительность =

Period− Pulse

TIMx _ CLK

 

 

 

 

 

 

Prescaler +1

 

[11]

Это означает, что, как только входной канал обнаруживает событие запуска, таймер начинает отсчет, и, когда регистр CNT достигает регистра CCRx (Pulse), он генерирует выходной сигнал, который длится до тех пор, пока регистр CNT не достигнет регистра

ARR (Period), то есть Period Pulse.

OPM может быть сконфигурирован как одиночный импульс или в режиме повторения. Это выполняется с помощью

HAL_TIM_OnePulse_Init(TIM_HandleTypeDef *htim, uint32_t OnePulseMode);

которая принимает указатель на дескриптор таймера и символьную константу для конфигурации OPM в режиме одиночного импульса или

для включения режима повторения.

В следующем примере показано, как сконфигурировать TIM3 в режиме OPM на микроконтроллере STM32F030.

Имя файла: src/main-ex10.c

12int main(void) {

13HAL_Init();

15Nucleo_BSP_Init();

16MX_TIM3_Init();

18HAL_TIM_OnePulse_Start(&htim3, TIM_CHANNEL_1);

20while (1);

21}

22

23/* Функция инициализации TIM3 */

24void MX_TIM3_Init(void) {

25TIM_OnePulse_InitTypeDef sConfig;

27htim3.Instance = TIM3;

28htim3.Init.Prescaler = 47;

29htim3.Init.CounterMode = TIM_COUNTERMODE_UP;

Таймеры

347

30htim3.Init.Period = 65535;

31HAL_TIM_OnePulse_Init(&htim3, TIM_OPMODE_SINGLE);

33/* Конфигурирование канала 1 */

34sConfig.OCMode = TIM_OCMODE_PWM1;

35sConfig.OCPolarity = TIM_OCPOLARITY_LOW;

36sConfig.Pulse = 19999;

38/* Конфигурирование канала 2 */

39sConfig.ICPolarity = TIM_ICPOLARITY_RISING;

40sConfig.ICSelection = TIM_ICSELECTION_DIRECTTI;

41sConfig.ICFilter = 0;

43HAL_TIM_OnePulse_ConfigChannel(&htim3, &sConfig, TIM_CHANNEL_1, TIM_CHANNEL_2);

44}

Строки [34:36] конфигурируют выходной канал в Режиме ШИМ 1, а строки [39:41] конфигурируют входной канал. Функция HAL_TIM_OnePulse_ConfigChannel() в строке 43 конфигурирует два канала, устанавливая канал 1 в качестве выходного и канал 2 в качестве входного. Наконец, HAL_TIM_OnePulse_Start() (вызывается в строке 18) запускает таймер в режиме OPM. При переключении вывода PA7 в Nucleo-F030R8 таймер запускается с задержкой в 20 мс и генерирует ШИМ около 45 мс, как показано на рисунке 30.

Рисунок 30: Как работает Одноимпульсный режим

Выходной канал таймера, работающего в одноимпульсном режиме, можно сконфигурировать даже в других режимах, отличных от ШИМ.

11.3.8.1.Использование CubeMX для конфигурации одноимпульсного режима

Чтобы включить режим OPM при помощи CubeMX, сначала необходимо сконфигурировать два канала (1 и 2) независимыми, а затем установить флажок One Pulse Mode, как показано на рисунке 31. Далее, из представления конфигурации TIMx (здесь не показано), можно сконфигурировать параметры других каналов.