Вход и выход ШИМ
Вход и выход ШИМ

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

Параметры ШИМ

В ШИМ есть три важных параметра: частота, скважность (отношение длительности высокого уровня к длительности всего периодического сигнала) и разрешение (регулируемая точность скважности).

На следующем рисунке показана диаграмма формы сигнала в режиме ШИМ 1:

Принцип выхода волны ШИМ таков:,Использование ТИМтаймера и сравнение результатов,ТИМтаймер будет периодически расти линейно,Когда значение счетчика ниже установленного значения сравнения, он выводит высокий уровень.,Когда оно больше или равно значению сравнения, выводится низкий уровень. Потому что это линейный рост,Пропорция длительности высокого уровня ко всей длительности сигнала цикла фиксирована.,Это соотношение называется «рабочим циклом».,Английский“Duty Cycle”。 во встроенных системах,Особенно при использовании таймера для генерации сигналов ШИМ.,Часто используетсятаймерсравнить регистр(Capture/Compare Register,CCR)и автоперезагрузка реестра(Auto-Reload Register,ARR) для управления рабочим ШИМ цикл。 Данный:

  • CCR: значение регистра сравнения (обычно используется для установки рабочего цикла сигнала ШИМ)
  • ARR: значение регистра автоматической перезагрузки (обычно используется для установки периода сигнала ШИМ).

Так:Duty=CCR/(ARR+1)

Почему ARR+1, а не ARR?

Диапазон подсчета фактически составляет от 0 до ARR, с общим количеством значений ARR+1. Предположим, что значение ARR равно 99, а значение CCR — 50. меньше, чемCCRиз Числа0-49общий50индивидуальный,Диапазон счета составляет0-99общий100индивидуальный,рабочий цикл должен составлять 50%. Это CCR/(ARR+1)

Регулируя CRR,Рабочий цикл ШИМ может быть изменен. ARR - это другое,Точность регулировки рабочего цикла также различна. Значение CCR плюс один,Такрабочий циклулучшится1/(ARR+1),Чем больше ARR,Чем меньший минимальный шаг может быть достигнут,Чем выше разрешение,вернорабочий циклиз Чем тоньше регулировка。 PWMизразрешение(Resolution)только сARRсвязанный:Reso=1/(ARR+1) Последний параметр — это частота ШИМ, то есть частота, с которой счетчик изменяется от 0 до ARR. таймерчасколоколчастота Сразудаприлавокизсчитатьчастота,каждый цикл,Значение счетчика +1. Нужно прибавить от 0 к ARR,общийARR+1индивидуальныйчасколокол周期。 То есть: длина цикла ШИМ = длина цикла таймера * (ARR + 1) Обратной величиной длины цикла является частота: частота ШИМ = частота таймера/(ARR+1) Частоту таймера можно получить путем деления частоты источника тактовой частоты на коэффициент деления. Данный:

  • CK_PSC: частота источника тактовой частоты счетного устройства.
  • PSC: коэффициент деления частоты

Так:Freq=CK_PSC/(PSC+1)/(ARR+1)

Выход ШИМ

Далее в качестве примера возьмем рулевой механизм SG90, двигатель постоянного тока и светодиодные фонари, Выход ШИМ. В том числе «Как получить доступ к документации по выбору контактов».

события и перерывы

Под изображением выше расположены «События» и «Прерывания и выход DMA».

  • Если генерируется прерывание обновления, сигнал перейдет к Конфигурация ОК. NVIC канал таймера, в это время CPU Будет реагировать на прерывание обновления таймера.
  • Если то, что генерируется, является событием обновления,Событие обновления не вызывает сбоя,Но это может спровоцировать работу других внутренних цепей.

Светодиодный дыхательный светильник

Запросите контакт светодиодного индикатора и на каком канале какого таймера он включен.

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

Запросив определение контакта, вы увидите, что PA8 также является каналом CH1 расширенного таймера TIM1.

Включить часы TIM1

Нам нужно сначала запросить место, где установлены часы TIM1. Это можно увидеть в определении библиотечной функции.

TIM1Появиться вRCC_APB2PeriphClockCmd()из Список параметровсередина,Функция этой функции заключается в управлении включением или отключением часов определенных периферийных устройств, подключенных к шине APB2 в микроконтроллере STM32.

  • RCC:представлятьReset and Clock Control (сброс и управление часами) — модуль, отвечающий за управление часами в микроконтроллере серии STM32.
  • APB2:представлятьAdvanced Peripheral Bus 2 (Advanced Peripheral Bus 2) — периферийная шина в STM32, используемая для подключения определенных периферийных устройств к ядру.
  • Periph:даPeripheral(периферийные устройства)изаббревиатура,Относится к периферийным устройствам, подключенным к шине APB2.
  • ClockCmd:даClock Аббревиатура Command (команда часов) относится к функции, используемой для управления включением или отключением периферийных часов.

На шине APB2 также установлен GPIOA, который можно включить с помощью операции ИЛИ и строки кода:

Язык кода:javascript
копировать
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1|RCC_APB2Periph_GPIOA,ENABLE);

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

Порт PA8 в настоящее время является каналом TIM1, и необходимо установить режим на мультиплексированный двухтактный выход.

Язык кода:javascript
копировать
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);

инициализация таймера

Этот шаг устанавливает внутренние часы в качестве источника синхронизации。существоватьstm32f10x_tim.hНайдено актуальное вфункция。

ПозвонивTIM_InternalClockConfigфункция,таймер может быть Конфигурация для использования внутренних ресурсов синхронизации。

Язык кода:javascript
копировать
TIM_InternalClockConfig(TIM1);

После настройки источника синхронизации вам необходимо настроить единицу измерения времени.

Язык кода:javascript
копировать
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period = 100 -1;
TIM_TimeBaseInitStructure.TIM_Prescaler = 720 -1;
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStructure);
  • TIM_ClockDivision: установлено на одно деление частоты.
  • TIM_CounterMode: выберите часто используемый режим восходящего счета.
  • TIM_Period: целевое значение счетчика. После достижения этого значения оно будет сброшено до значения, установленного TIM_RepetitionCounter.
  • TIM_Prescaler: настроен на деление на 720. Источник синхронизации отсчитывает один раз после появления 720 сигналов нарастающего фронта.
  • TIM_RepetitionCounter: после достижения целевого значения счетчика значение регистра автоматически перезагружается до 0.

Настройка сравнения выходных данных OC

Каждый таймер имеет несколько каналов, и вам необходимо указать канал и таймер во время инициализации. в:

  • таймер указывается через параметр функции
  • Каналы указаны по названию функции.
Язык кода:javascript
копировать
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCStructInit(&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse=0;
TIM_OC1Init(TIM1,&TIM_OCInitStructure);

TIM_OCInitTypeDefЕсть много структур Конфигурацияэлемент,Приведенный выше код является лишь его частью.,оставатьсяиз Все могутпроходитьTIM_OCStructInit(&TIM_OCInitStructure);Инициализировать。этотиндивидуальныйфункцияиз内容Сразудадля структурыизкаждыйэлемент Присвоить начальное значение,Поскольку данные необходимо изменить,Следовательно, методом передачи параметров является передача адреса. Режим сравнения выходов установлен на TIM_OCMode_PWM1. Это режим сравнения вверх,Это пример в начале статьи.,>=CCRнаходится на низком уровне, когда。

БолееизTIM_OCModeМожетсуществоватьstm32f10x_tim.hИскать в。 TIM_OCPolarityизэффектда Конфигурация Сигнализполярность:

  • TIM_OCPolarity_High:Полярность не меняется
  • TIM_OCPolarity_Low:полярность翻转

尽管TIM_OCMode_PWM1Уже указаноPWM1режимизметод работы,Но для того, чтобы гарантировать, что выходной сигнал соответствует ожиданиям и соответствует требованиям внешнего устройства,Еще нужно дальше Конфигурация Сравнение результатоврядизполярность。 TIM_OutputStateда Конфигурация Включение выхода,установлен наTIM_OutputState_Enableнормально выводить。 TIM_Pulseизценить СразудаCCRСравниватьзарегистрироватьсяизценить,установить на 0,Указывает, что он включен после сброса.,И яркость 100%.

Включить таймер TIM

Вышеуказанная операция — это всего лишь настройка, а не запуск.

Язык кода:javascript
копировать
TIM_Cmd(TIM1,ENABLE);
TIM_CtrlPWMOutputs(TIM1,ENABLE);

TIM_Cmd(TIM1,ENABLE);изэффектдадавать возможностьTIM1таймер。 существоватьпередовойтаймерсередина,нуждатьсяTIM_CtrlPWMOutputs()Выход ШИМ волна.

Достичь эффекта дышащего света

Нужно внести ясность:

  • TIM_TimeBaseInitTypeDefчастьда Конфигурациямодуль временной базы,это часы+счет
  • TIM_OCInitTypeDefчастьда Конфигурация Модуль сравнения выходов,Обработка подсчета

TIM_SetCompare1()изэффектда Исправлятьтаймеризряд1изCCR。

  • Канал 1 указан в названии функции.
  • таймер указывается в параметре Function
  • Значение CCR указывается в параметре функции.

Задержка добавлена, чтобы сделать эффект дыхания более заметным.

Привод рулевого механизма SG90

Сигнал управления рулевым механизмом SG90 представляет собой сигнал широтно-импульсной модуляции (ШИМ) с периодом 20 мс. Длительность импульса изменяется линейно от 0,5 мс до 2,5 мс, что соответствует положению рулевого колеса от 0 до 180 градусов. (версия с сервоприводом 180°).

Другими словами, период волны ШИМ составляет 20 мс.

Найдите контакт, на котором расположен сервоинтерфейс.

через схему,Может看到四индивидуальныйрулевой механизмиз БулавкаSERVO_xверноотвечатьPB12-PB15。 такой же Светодиодный дыхательный светильник: По принципиальной схеме невозможно определить конкретный канал.

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

Эти четыре контакта отличаются от «Светодиодного». дыхательный светильник”серединаизPA8

  • PA8даTIM1_CH1
  • PB12даTIM1_BKIN:TIM1из Резервный вход(Break Input)
  • PB13-15даTIM1_CHxN:TIM1изрядxиздополнительныйряд

Здесь мы по-прежнему используем PA8Выход Волна ШИМ через летающую линию выводит волну ШИМ на интерфейс сервопривода. Эта часть кода унаследована от светодиодной части, и ее нужно только изменить:

  • период волны ШИМ: изменен до 20 мс
  • Сравнительное значение CCR: 0,5/1/1,5/2,0/2,5

Изменить период волны ШИМ

Язык кода:javascript
копировать
TIM_TimeBaseInitStructure.TIM_Period = 2000 -1;
TIM_TimeBaseInitStructure.TIM_Prescaler = 720 -1;
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
  • TIM_PrescalerЗначение прескалера720,Системный такт составляет 72M.,Таким образом, частота после деления равна 0,1 МГц.,Период 10 мс.
  • TIM_PeriodЦелевое значение счетчика2000,Требуется 2000 тактов,Частота TIM составляет 0,1/2000 МГц.,Период 20мс.

Нажмите клавишу, чтобы изменить CCR

Включить кнопки относительно просто: вам нужно найти на принципиальной схеме порт GPIO, соответствующий кнопке.

При поиске в определении библиотечной функции GPIOB смонтирован на APB2.

Язык кода:javascript
копировать
void Key_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
}

Когда кнопка нажата,GPIO читает низкий уровень,После отпускания его следует подтянуть до высокого уровня.。То есть принятьGPIO_Mode_IPUрежим подтягивающего ввода。

  • Если это вход с выпадающим меню, результат будет одинаковым независимо от того, нажата она или нет, и все показания будут низкого уровня.
  • Если это плавающий вход, после однократного нажатия порт GPIO всегда будет считывать низкий уровень, и действителен только первый раз.
Язык кода:javascript
копировать
uint8_t Key_GetNum(void)
{
	uint8_t KeyNum = 0;
	if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 0)
	{
		Delay_ms(20);
		while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 0);
		Delay_ms(20);
		KeyNum = 1;
	}
	if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)
	{
		Delay_ms(20);
		while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0);
		Delay_ms(20);
		KeyNum = 2;
	}
	if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_4) == 0)
	{
		Delay_ms(20);
		while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_4) == 0);
		Delay_ms(20);
		KeyNum = 3;
	}
	if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_5) == 0)
	{
		Delay_ms(20);
		while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_5) == 0);
		Delay_ms(20);
		KeyNum = 4;
	}	
	return KeyNum;
}

Функция Delay_ms — предотвращать тряску клавиш и удалять заусенцы.

Подключение согласно принципиальной схеме

На рисунке ниже я вставил положение J4, которое соответствует контакту 26.

IMG_20240208_203627.HEIC
IMG_20240208_203627.HEIC

Подключите контакт 26 к контакту 17, где расположен PA8, с помощью провода Dupont.

VID_20240208_204405

двигатель постоянного тока

В отличие от светодиодных фонарей и сервоприводов, двигатель постоянного тока — устройство большой мощности.,Требуются дополнительные драйверы,Обычных возможностей управления портом ввода-вывода недостаточно.

Согласно принципиальной схеме найдите положение штифта драйвера двигателя.

PA0повторное использованиеTIM2_CH1_ETR,Еще не учусь。Поэтому данная статья выбираетPA2иPA3。верноотвечатьиздаTIM2_CH3иTIM2_CH4

image.png
image.png

Настройте RCC TIM2

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

image.png
image.png

Иди сюда, Нужно внести ясность:

  • TIM_OCInitTypeDefдаверно Сравнение результатоврядиз Конфигурацияинформация。
  • TIM_OCxInitда Воля Конфигурациязагрузить в конкретныйизрядначальство。потому чтожитьсуществоватьмногоиндивидуальныйTIMтаймер,Каждый таймер имеет несколько каналов. Поэтому необходимо указать, в какой канал и в какой таймер загружается файл Конфигурации. таймер указывается через параметр функции,Каналы указаны по названию функции.。

На передний светодиод и сервопривод необходимо вывести волну ШИМ только на один канал:

  • Светодиод имеет только один вход, а другой конец припаян к GND и всегда имеет низкий уровень.
  • Сервопривод SG90 также имеет только один управляющий вход.

исуществоватьдвигатель постоянного По току два входных контакта имеют разные состояния на разных высоких и низких уровнях:

image.png
image.png

Оба контакта должны быть выходными. Волна ШИМ, а не фиксированная на низком или высоком уровне. Затем необходимо загрузить файл конфигурации на каналы CH3 и CH4 таймера TIM2.

Язык кода:javascript
копировать
TIM_OC3Init(TIM2,&TIM_OCInitStructure);
TIM_OC4Init(TIM2,&TIM_OCInitStructure);

TIM2 не является продвинутым таймером,Поэтому нетнуждатьсяTIM_CtrlPWMOutputs()

Используйте OLED для облегчения отладки

image.png
image.png

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

захват ввода

захват ввода(Input Захват), также известный как IC。 существоватьзахват В режиме ввода, когда на входном выводе канала происходит указанный переход уровня, текущее значение CNT будет зафиксировано в CCR, который можно использовать для измерения частоты, рабочего цикла, интервала импульсов, длительности уровня и других параметров ШИМ. форма волны. Каждый таймер высокого уровня и общий таймер имеют по 4 захвата. Канал ввода имеет две цели:

  • Конфигурация находится в режиме PWMI, одновременно измеряя Частота. и рабочий цикл
  • Взаимодействие с режимом запуска «главный-подчиненный» для реализации полностью автоматического измерения оборудования.
image.png
image.png
  • Метод измерения частоты: в пределах времени стробирования T,Подсчитайте количество нарастающих фронтов N,частотаf=N/T
  • Недельный метод измерения: в пределах двух нарастающих фронтов,Подсчитано на стандартной частоте fc,Количество раз N.,частотаf=fc/N

Два приведенных выше результата теста будут иметь присущую погрешность, то есть «в подсчете есть ошибка плюс-минус 1»:

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

но:

  • Метод измерения частоты подходит для тестирования высокочастотных сигналов. Чем больше выборок (количество нарастающих фронтов) в течение времени вентиля, тем больше отсчетов поможет уменьшить ошибку.
  • Метод измерения циклов подходит для тестирования низкочастотных сигналов. Низкочастотный сигнал имеет большой период и большое количество отсчетов, поэтому ошибка меньше.
  • Скорость обновления метода измерения частоты медленнее, чем у метода измерения цикла, но числовое значение относительно стабильно. Метод измерения цикла обновляется быстро, но значение быстро скачет.

Метод измерения частоты подходит для высокочастотных сигналов, а метод измерения цикла подходит для низкочастотных сигналов. Споры вызовет диапазон высокочастотных сигналов и низкочастотных сигналов, то есть сколько частот считаются высокими частотами и сколько частот считаются низкими частотами. Поэтому вводится концепция добавления «средней частоты». Сигналы с частотой выше средней частоты являются высокочастотными сигналами, и ошибка измерения с использованием метода измерения частоты меньше, сигналы с частотой ниже средней частоты являются низкочастотными сигналами, и ошибка измерения; меньше при использовании метода измерения перицикла. Средняя граничная частота: используйте метод измерения частоты и метод измерения периферии для измерения частоты сигнала. Если ошибки, вызванные этими двумя, равны, частота сигнала определяется как средняя граничная частота.

Настройте RCC для входных каналов

image.png
image.png

Вам нужно только выбрать канал CH для одновременного измерения частоты ШИМ и коэффициента заполнения: после входа во входной фильтр и детектор фронта срабатывает последующая схема и генерируются один или оба сигнала TI1FP1 и TI1FP2.

  • CH1 и CH2 можно использовать перекрестно, а CH3 и CH4 можно использовать перекрестно.
  • CH1 может одновременно открывать два канала, TI1FP1 и TI1FP2, и одновременно измерять частоту сигнала и рабочий цикл сигнала.
image.png
image.png

Эти каналы являются дополнительными. двигатель на предыдущем шаге постоянного тока мы использовали PA2 и PA3, TIM2_CH3 и TIM2_CH4. Теперь мы можем выбрать TIM3 в качестве захватывающего. вводаизтаймер。потому чтоCH1иCH2существоватьвходитьчас Может交叉使用,Любой вход можно разделить на два канала. Таким образом, временные развертки каналов CH1 и CH2 соответствуют конфигурации IC.,Отличается только расположение инициализированного контакта GPIO.

Инициализировать входной контакт

В этой статье выбирается канал CH1 TIM3.

Язык кода:javascript
копировать
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
  • GPIO_Mode: гарантирует, что вывод будет переведен на высокий логический уровень при отсутствии внешнего входа, тем самым предотвращая дрейф вывода или недопустимый ввод. Его также можно установить в качестве раскрывающегося списка.
  • GPIO_Pin: TIM3_CH1 соответствует PA6, поэтому инициализированный вывод GPIO — GPIO_Pin_6.

источник синхронизации

Установите внутренние часы в качестве источника синхронизации TIM3.

Язык кода:javascript
копировать
TIM_InternalClockConfig(TIM3);

Настройка базовой единицы времени

Язык кода:javascript
копировать
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period=65536-1;
TIM_TimeBaseInitStructure.TIM_Period=72-1;
TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);

Сравнивая этот код с приведенным выше выводом ШИМ, разницы, похоже, нет. TIM_PeriodиTIM_Periodиз Конфигурацияпричина Волясуществоватьобъяснил позже,Прежде чем объяснятьнуждаться Подготовьте почву для некоторого контента。 Возникает вопрос: он все равно запускается нарастающим фронтом внутренних часов, а за периодическое накопление отвечает ТИМ. Идет подсчет количества ударов внутренних часов, и захватывает При чем тут ввод?

КонфигурацияICзахват ввода

image.png
image.png

На рисунке входному каналу дано двоичное представление, которое можно найти в определении библиотечной функции:

image.png
image.png
Язык кода:javascript
копировать
TIM_ICInitTypeDef TIM_ICInitStructure;
TIM_ICInitStructure.TIM_Channel=TIM_Channel_1;
TIM_ICInitStructure.TIM_ICFilter=0;
TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;
TIM_ICInit(TIM3,&TIM_ICInitStructure);
  • TIM_Channel: канал ввода захвата — TIM_Channel_1.,Это CH1.
  • TIM_ICFilter: фильтр. Когда высокие уровни N+1 собираются непрерывно, это считается высоким уровнем. В случае прерывания уровень предыдущего цикла будет продолжен. Используется для фильтрации заусенцев.
  • TIM_ICPolarity: обнаружение фронта, установлено на нарастающий фронт, также может быть настроен спадающий фронт.
  • TIM_ICPrescaler: коэффициент деления частоты, установленный на 1 деление частоты, то есть без деления частоты.
  • TIM_ICSelection: входной канал. Макрос канала, соответствующий двоичному 01, определяется как TIM_ICSelection_DirectTI.

На данный момент, похоже, до сих пор не ясно, что делать с захватом. Какое отношение имеет ввод к тому, как определить частоту ввода. Для достижения автоматического измерения необходимо настроить режим «ведущий-подчиненный».

Настроить подчиненный режим

image.png
image.png

ВоляTI1FP1Сигналустановлен наперезагрузитьчасбазовый блокиз触发Сигнал。TI1FP1выражатьTimer Input 1 Filtered Channel 1,Это означает, что внешний сигнал из канала 1 (через фильтр) будет использоваться в качестве входного сигнала запуска TIM3.

Язык кода:javascript
копировать
TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);
TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);
  • TIM_SelectInputTrigger: для выбора TIM3 Вход таймера запускает вызов функции. Это означает TIM3 таймер будет реагировать на внешний триггерный сигнал на канале 1, чтобы запустить захват. вводадействовать。
  • TIM_SelectSlaveMode:используется для КонфигурацияTIM3таймеризподчиненный режим。здесь,Подчиненный режим установлен в режим сброса TIM_SlaveMode_Reset.

Процесс измерения частоты

  1. При появлении нарастающего фронта сигнал будет передаваться по TI1 на TIM_TS_TI1FP1.
  2. TIM_TS_TI1FP1встреча Ввод, который запускает TIM3таймерсобытие,Метод ответа Конфигурации — режим сброса. Значение счетчика будет сброшено до исходного значения. Начальное значение Конфигурация равно 0.
  3. ТИМтаймер продолжит отсчет до следующего нарастания.
  4. Когда наступит следующий нарастающий фронт,Сигнал будет передан по TI1 на TIM_TS_TI1FP1.,Ввод, который запускает TIM3таймерсобытие,Введите событие для режима сброса. в это время,Значение счетчика представляет собой количество раз стандартной частоты между двумя нарастающими фронтами.
  5. Каждый нарастающий фронт вызывает захват вводачас,Оба канала ввода запроса сохранят текущее значение счетчика в CCR. снова знакомо,Дословный перевод CCR: регистр захвата/сравнения.
  6. Другими словами, измеряется количество стандартных частот между двумя нарастающими фронтами, а реализуется метод измерения цикла.

Частота чтения

TIM_Period, настроенный в единице измерения времени, делится на 72, то есть стандартная частота равна 1 МГц. Когда срабатывает сигнал нарастающего фронта, регистр CCR сохраняет значение в таймере, которое представляет собой количество раз на стандартной частоте. Нарастающий фронт запускает стандартную частоту N раз, тогда частота этого периода ШИМ равна: стандартная частота/N.

Язык кода:javascript
копировать
uint16_t IC_GetFreq()
{
	return 1000000/(TIM_GetCapture1(TIM3) + 1);
}
  • TIM_GetCapture1 используется для захвата. вводаряд1изCCRизценить。потому чтожитьсуществоватьмногоиндивидуальныйтаймер,Для каждого таймера существует несколько каналов,Поэтому местоположение должно быть ясным. Каналы указаны по названию функции.,таймер указывается через параметр функции。

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

Язык кода:javascript
копировать
int main(void)
{
	uint16_t FOR=0;
	uint16_t BAK=0;	
	PWM_Init();
	Key_Init();
	OLED_Init();
	IC_Init();
	OLED_ShowString(1,1,"FOR:");
	OLED_ShowString(2,1,"BAK:");
	OLED_ShowString(3,1,"Freq:00000Hz");
	while(1)
	{
		uint16_t keyNum=Key_GetNum();
		if(keyNum==1){
			PWM_SetCompare3(FOR+=100);
			PWM_SetCompare4(BAK+=0);
		}
		else if(keyNum==2){
			PWM_SetCompare3(FOR-=100);
			PWM_SetCompare4(BAK-=0);
		}
		else if(keyNum==3){
			PWM_SetCompare3(FOR+=0);
			PWM_SetCompare4(BAK+=100);
		}
		else if(keyNum==4){
			PWM_SetCompare3(FOR-=0);
			PWM_SetCompare4(BAK-=100);
		}
		OLED_ShowNum(1,5,FOR,5);
		OLED_ShowNum(2,5,BAK,5);
		OLED_ShowNum(3,6,IC_GetFreq(),5);
	}
}
IMG_20240209_180903.HEIC
IMG_20240209_180903.HEIC

Попробуйте изменить FOR и BAK и обнаружите, что оба результата составляют 100 Гц. Это потому, что 100Гц — это частота волны ШИМ, а FOR и BAK — значения регистра сравнения. Изменяется рабочий цикл, а не частота. Изменение частоты требует изменения коэффициента деления частоты и целевого числа циклов.

Подвести итог

Регистр CCR используется как для ввода, так и для вывода.

CCR зарегистрироваться(Capture/Compare Register,регистры захвата/сравнения) имеют разные роли на входе и выходе:

  • Режим ввода:
    • в режиме ввода,Регистр CCR используется для записи времени захвата входного сигнала. Когда происходит событие захвата (например, нарастающий или спадающий фронт),Значение счетчика таймера будет сохранено в соответствующем регистре CCR.
    • существоватьзахват В режиме ввода регистр CCR обычно используется для хранения временной метки или ширины импульса события захвата.
  • Режим вывода:
    • в режиме вывода,Регистр CCR используется для установки значения сравнения. Значение счетчика таймера сравнивается со значением сравнения, установленным в регистре CCR.,Что определяет поведение вывода,Например, генерация сигнала ШИМ или запуск события сравнения выходных данных.
    • В режиме сравнения выходов регистр CCR обычно используется для установки точки запуска сравнения выходов или рабочего цикла ШИМ.
image.png
image.png

Как видно, TIM_SetCompare и захват вызываются при сравнении результатов. вводасерединавызовизTIM_GetCapture,Доступ к тому же регистру,Выполните операции присвоения и получения значения соответственно.

Частота и рабочий цикл

Входной канал может быть назначен двум линиям для измерения частоты и рабочего цикла соответственно. Приведенный выше код представляет только частоту. Параметры, соответствующие частоте и рабочему циклу, различны, и их нельзя получить, принимая как должное одну линию захвата. При нахождении частоты непосредственно получается значение регистра CCR, которое представляет собой количество циклов, которое на самом деле является «временем». Если требуется рабочий цикл, спадающий фронт можно фиксировать в строке 2 и определять «время» высокого уровня. Сравнивая это со временем всего цикла, получаем рабочий цикл.

Настройте GPIO, временную развертку, OC, IC

Соглашения об именахда:xInitTypeDef xInitStructure。 этот只да:Конфигурацияиз“информация”,Это не «процесс» Конфигурации. После завершения настройки,проходитьxInit(),Воля Конфигурацияинформация Действует доверноотвечатьизинтерфейс。 Когда объявляется структура информации о конфигурации, она четко не указывает, к какому выводу GPIO или к какому каналу какого таймера TIM она относится. Эта информация указывается в методе инициализации либо через параметры функции, либо через имя функции.

Прерывания и события

событие Нет необходимости реализовывать функцию обработки прерываний,Например, при вводе захвата,Триггер — это событие,Может быть установлен в режим сброса с помощью функции библиотеки.,Аппаратное обеспечение автоматически перезагружается.

  • Если генерируется прерывание обновления, сигнал перейдет к Конфигурация ОК. NVIC канал таймера, в это время CPU Будет реагировать на прерывание обновления таймера.
  • Если то, что генерируется, является событием обновления,Событие обновления не вызывает сбоя,Но это может спровоцировать работу других внутренних цепей.

Как получить доступ к документации

Способы получения информации:

  • Определения схемы и выводов: Определите взаимосвязь между выводами. Например, контакт светодиода 1 — PA8, который активен на низком уровне. Я могу инициализировать контакт GPIOA_Pin_8 как двухтактный выход и управлять включением и выключением света через GPIOA_Pin_8. Если вывод не подключен напрямую к устройству, его можно подключить через провод. Например, во время работы сервопривода выходной вывод ШИМ-волны GPIOA_Pin_8 подключается к GPIOB_Pin_12 через провод.
  • Руководства и библиотеки Функция: какое устройство на какой шине установлено,Вы можете проверить это в определении функции библиотеки.,Такие как APB1 и APB2,Подключенное устройство указывается при определении функции библиотеки. Направление схемы сложно понять по комментариям к коду.,Например, при вводе захвата выбранная ветвь не может быть определена с помощью TIM_ICSelection.,Но двоичное представление указывается при определении макроса. Бинарное представление ветки в руководстве дано в двоичной форме. Объедините определения и руководства,Вы сами можете определить, что заполнять.

«Определение макроса» и «магическое число» в проектах на языке C.

«Магические числа» обычно относятся к жестко закодированным числам или константам, которые появляются в программировании и используются непосредственно в коде без предоставления четких объяснений или комментариев. Такой подход может привести к тому, что код станет трудным для понимания, сопровождения и плохо читаемым. Хотя в руководстве дано двоичное представление, макросы следует использовать, если их можно использовать в реальном коде. Строка 0011 вызовет много проблем при обслуживании кода, поэтому следует избегать, насколько это возможно, «магических чисел». Вместо этого используйте осмысленные именованные константы или перечисления, которые могут повысить читаемость и удобство сопровождения вашего кода.

ссылка

boy illustration
Учебное пособие по Jetpack Compose для начинающих, базовые элементы управления и макет
boy illustration
Код js веб-страницы, фон частицы, код спецэффектов
boy illustration
【новый! Суперподробное】Полное руководство по свойствам компонентов Figma.
boy illustration
🎉Обязательно к прочтению новичкам: полное руководство по написанию мини-программ WeChat с использованием программного обеспечения Cursor.
boy illustration
[Забавный проект Docker] VoceChat — еще одно приложение для мгновенного чата (IM)! Может быть встроен в любую веб-страницу!
boy illustration
Как реализовать переход по странице в HTML (html переходит на указанную страницу)
boy illustration
Как решить проблему зависания и низкой скорости при установке зависимостей с помощью npm. Существуют ли доступные источники npm, которые могут решить эту проблему?
boy illustration
Серия From Zero to Fun: Uni-App WeChat Payment Practice WeChat авторизует вход в систему и украшает страницу заказа, создает интерфейс заказа и инициирует запрос заказа
boy illustration
Серия uni-app: uni.navigateЧтобы передать скачок значения
boy illustration
Апплет WeChat настраивает верхнюю панель навигации и адаптируется к различным моделям.
boy illustration
JS-время конвертации
boy illustration
Обеспечьте бесперебойную работу ChromeDriver 125: советы по решению проблемы chromedriver.exe не найдены
boy illustration
Поле комментария, щелчок мышью, специальные эффекты, js-код
boy illustration
Объект массива перемещения объекта JS
boy illustration
Как открыть разрешение на позиционирование апплета WeChat_Как использовать WeChat для определения местонахождения друзей
boy illustration
Я даю вам два набора из 18 простых в использовании фонов холста Power BI, так что вам больше не придется возиться с цветами!
boy illustration
Получить текущее время в js_Как динамически отображать дату и время в js
boy illustration
Вам необходимо изучить сочетания клавиш vsCode для форматирования и организации кода, чтобы вам больше не приходилось настраивать формат вручную.
boy illustration
У ChatGPT большое обновление. Всего за 45 минут пресс-конференция показывает, что OpenAI сделал еще один шаг вперед.
boy illustration
Copilot облачной разработки — упрощение разработки
boy illustration
Микросборка xChatGPT с низким кодом, создание апплета чат-бота с искусственным интеллектом за пять шагов
boy illustration
CUDA Out of Memory: идеальное решение проблемы нехватки памяти CUDA
boy illustration
Анализ кластеризации отдельных ячеек, который должен освоить каждый&MarkerгенетическийВизуализация
boy illustration
vLLM: мощный инструмент для ускорения вывода ИИ
boy illustration
CodeGeeX: мощный инструмент генерации кода искусственного интеллекта, который можно использовать бесплатно в дополнение к второму пилоту.
boy illustration
Машинное обучение Реальный бой LightGBM + настройка параметров случайного поиска: точность 96,67%
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция без кодирования и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
LM Studio для создания локальных больших моделей
boy illustration
Как определить количество слоев и нейронов скрытых слоев нейронной сети?
boy illustration
[Отслеживание целей] Подробное объяснение ByteTrack и детали кода