ШИМ

32-разрядные микроконтроллеры разработки ОАО "НИИЭТ"

Модераторы: pip, _sva_

bkolbov
Сообщения: 96
Зарегистрирован: 14 дек 2015, 11:37
Предприятие: АО НИИЭТ
Откуда: Воронеж

Re: ШИМ

Сообщение bkolbov » 22 июн 2017, 17:37

Кстати, а пробовали в CMPA писать не ноль, а близкое к нему значение? Там 1, 3, 5?

Аватара пользователя
MR.Smith
Сообщения: 76
Зарегистрирован: 25 апр 2016, 10:56

Re: ШИМ

Сообщение MR.Smith » 22 июн 2017, 18:38

bkolbov писал(а):
22 июн 2017, 17:37
Кстати, а пробовали в CMPA писать не ноль, а близкое к нему значение? Там 1, 3, 5?
Интересно получается:
Изображение
Если задать скважность 1, а не 0, то проблема не проявляется.
ШИМ работает в комплиментарном режиме, на верхнем сигнале нет переходов, т.к. мертвое время не позволяет там им появиться, это нормально.

hgost
Сообщения: 52
Зарегистрирован: 14 дек 2015, 12:07
Предприятие: АО НИИЭТ
Откуда: НИИЭТ
Contact:

Re: ШИМ

Сообщение hgost » 26 июн 2017, 12:27

Добрый день!
У нас не получилось воспроизвести описанную Вами ситуацию. Возможно, не совсем правильно поняли Вас.
Давайте уточним:
- Реакция на события настроена именно так?
PWM->AQCTLA_bit.CAU = 2; // Группа A на фронте
PWM->AQCTLA_bit.CAD = 1; // Группа A на спаде
- На первом присланном Вами рисунке момент перехода от CMPA=2000 к CMPA=0 ?
- можете представить диаграммы, когда не используется механизм TZ и все работает правильно?

И немного комментариев, которые, возможно, помогут Вам.
- Не стоит использовать синхронизацию при одновременном пуске всех ШИМ через сброс предделителей NT_COMMON_REG->PWM_SYNC. При пуске через сброс предделителей ШИМы и так будут гарантированно считать синхронно. Если же включить синхронизацию в момент когда ШИМЫ еще не запущены, это наоборот внесет дополнительные задержки. (Ситуация уже описана нами и в скором времени пояснение особенностей синхронизации появится в ТО. Если кратко - генерация и распространение сигнала синхронизации занимает 1 такт TBCLK, из-за чего значения счетчиков будут отличаться на 1)
- Реакция на событие CTR=CMPA и теневая загрузка CMPA. Если эти события настроены так, что приходятся на один такт, то сначала производится теневая загрузка, а затем проверяется, будет ли новое значение CMPA генерировать событие.

Аватара пользователя
MR.Smith
Сообщения: 76
Зарегистрирован: 25 апр 2016, 10:56

Re: ШИМ

Сообщение MR.Smith » 26 июн 2017, 16:52

Здравствуйте!

Код эволюционирует и кое-что я уже успел поменять.
hgost писал(а):
26 июн 2017, 12:27
- Реакция на события настроена именно так?
PWM->AQCTLA_bit.CAU = 2; // Группа A на фронте
PWM->AQCTLA_bit.CAD = 1; // Группа A на спаде
Было именно так, но я изменил здесь кусок, что к исправлению ситуации не привело.
Теперь так:

Код: Выделить всё

NT_PWM0->AQCTLA_bit.CAU = 1;
NT_PWM0->AQCTLA_bit.CAD = 2;
Также для работы в комплиментарном режиме включена инверсия канала A:

Код: Выделить всё

NT_PWM0->DBCTL_bit.POLSEL = 1;
До этого была инверсия канала B:

Код: Выделить всё

NT_PWM0->DBCTL_bit.POLSEL = 2;
Мне просто в программе удобнее управлять нижним ключом.
Т.е на данный момент при NT_PWM8->CMPA_bit.CMPA = 2000; получаем PWMA8 == 0 и PWMB8 == 1,
а при NT_PWM8->CMPA_bit.CMPA = 0; получаем PWMA8 == 1 и PWMB8 == 0.
Изображение

Аппаратура у меня построена таким образом, что аппаратные ключи закрыты при высоком уровне сигнала на выходе ШИМ. Есть необходимость периодически запрещать работу ШИМ, для этого используется TZ.

Картинку на осциллограмме строит следующий код в прерывании по CTR=PRD:

Код: Выделить всё

	if(dbgDutyCounter == 1)
	{
		NT_PWM8->CMPA_bit.CMPA = 0;
		pwmFan.enableA = TRUE;
	}
	else if(dbgDutyCounter == 10)
	{
		pwmFan.enableA = FALSE;
	}
	else if(dbgDutyCounter == 20)
	{
		NT_PWM8->CMPA_bit.CMPA = 2000;
		pwmFan.enableA = TRUE;
	}
	else if(dbgDutyCounter == 30)
	{
		pwmFan.enableA = FALSE;
	}
	else if(dbgDutyCounter >= 40)
	{
		dbgDutyCounter = 0;
	}
	dbgDutyCounter++;
Включением/отключением через механизм TZ управляет код в прерывании по CTR=ZERO:

Код: Выделить всё

if(pwmFan.enableA) NT_PWM8->TZCLR_bit.OST = 1;
else NT_PWM8->TZFRC_bit.OST = 1;
т.е. проблема проявляется при NT_PWM8->CMPA_bit.CMPA = 2000;
Как видно на осциллограмме ниже после NT_PWM8->CMPA_bit.CMPA = 2000 ШИМ включается словно на CMPA == 0 (хотя по факту в регистре записано 2000) и только при следующем событии CTR=PRD переключается в верное состояние.
Изображение

Если 0 заменить на 1, то ситуация исправляется:
Изображение
т.е. данное поведение вызывает перезапись CMPA из значения 0 в значение 2000. Если перезаписывать из 1 в 2000, то проблема не воспроизводится. Однако, замена 2000 на 1999 (при неизменном 0) не приводит к исправлению! Дело именно в перезаписи CMPA из 0 в 2000, но не наоборот!
hgost писал(а):
26 июн 2017, 12:27
- можете представить диаграммы, когда не используется механизм TZ и все работает правильно?
Да, пожалуйста:
Изображение
Никаких проблем, корректный переход с учетом мертвого времени:
Изображение
Все, что изменилось - больше нет запрета ШИМ (строки pwmFan.enableA = FALSE; заменены на pwmFan.enableA = TRUE;)

hgost
Сообщения: 52
Зарегистрирован: 14 дек 2015, 12:07
Предприятие: АО НИИЭТ
Откуда: НИИЭТ
Contact:

Re: ШИМ

Сообщение hgost » 26 июн 2017, 17:06

А мертвое время как у Вас настроено?

Аватара пользователя
MR.Smith
Сообщения: 76
Зарегистрирован: 25 апр 2016, 10:56

Re: ШИМ

Сообщение MR.Smith » 26 июн 2017, 19:13

hgost писал(а):
26 июн 2017, 17:06
А мертвое время как у Вас настроено?
Сначала я задаю величину мертвого времени в (тики процессора - 1) в соответствии с Eratta:

Код: Выделить всё

NT_PWM8->DBRED = 119;
NT_PWM8->DBFED = 119;
Затем для контроля по переднему и заднему фронтам я выбираю сигнал PWMA:

Код: Выделить всё

NT_PWM8->DBCTL_bit.IN_MODE = 0;
Далее выбираю фронт для которого включается задержка:

Код: Выделить всё

NT_PWM8->DBCTL_bit.OUT_MODE = 3;
И инвертирую один канал, чтобы получить сигнал в противофазе:

Код: Выделить всё

NT_PWM0->DBCTL_bit.POLSEL = 1;
Больше ничего для мертвого времени не делаю.

Аватара пользователя
MR.Smith
Сообщения: 76
Зарегистрирован: 25 апр 2016, 10:56

Re: ШИМ

Сообщение MR.Smith » 26 июн 2017, 19:34

hgost писал(а):
26 июн 2017, 12:27
- Не стоит использовать синхронизацию при одновременном пуске всех ШИМ через сброс предделителей NT_COMMON_REG->PWM_SYNC. При пуске через сброс предделителей ШИМы и так будут гарантированно считать синхронно. Если же включить синхронизацию в момент когда ШИМЫ еще не запущены, это наоборот внесет дополнительные задержки. (Ситуация уже описана нами и в скором времени пояснение особенностей синхронизации появится в ТО. Если кратко - генерация и распространение сигнала синхронизации занимает 1 такт TBCLK, из-за чего значения счетчиков будут отличаться на 1)
Я отключил синхронизацию для всех блоков ШИМ

Код: Выделить всё

NT_PWM0->TBCTL_bit.PHSEN = 0;
Но ситуация остается прежней.

Аватара пользователя
MR.Smith
Сообщения: 76
Зарегистрирован: 25 апр 2016, 10:56

Re: ШИМ

Сообщение MR.Smith » 27 июн 2017, 09:41

hgost, может быть у вас есть готовый пример с настройками? Я бы сравнил код более детально.
Когда я писал текущую версию программы, то периодически обращался к примеру из Vector IDE.
Да и раньше аналогично настраивал ШИМ на TMS320F28335, там проблем не было.

hgost
Сообщения: 52
Зарегистрирован: 14 дек 2015, 12:07
Предприятие: АО НИИЭТ
Откуда: НИИЭТ
Contact:

Re: ШИМ

Сообщение hgost » 27 июн 2017, 10:41

Все прояснилось, поведение ШИМ вполне логичное, сейчас попробую пояснить более детально.
PWM_0.PNG
PWM_0.PNG (10.24 КБ) 808 просмотров
Момент (1) по CTR=PRD загружается новое значение CMPA=2000, которое попадает в теневой регистр.
Момент (2) срабатывает событие CTR=0, которое приводит к перезаписи CMPA=2000 из теневого регистра в активный. При этом уже не возникает события CTR=AUp, которое приводило к переключению выводов. Вывода переключаются из-за того что в прерывании снимается сигнал TZ
Момент (3) вывода ШИМ переключаются, когда счетчик досчитает до периода 2000 и возникнет событие CTR=ADown.

Когда Вы вместо нуля используете CMPA=1, событие CTR=ADown=1 возникает на такт раньше момента теневой загрузки и успевает переключить вывода ШИМ.

Иными словами, если момент загрузки из теневого регистра в активный совпадает с событием CTR=CMPA, то сравнение будет производиться только с обновленным значением CMPA.

Аватара пользователя
MR.Smith
Сообщения: 76
Зарегистрирован: 25 апр 2016, 10:56

Re: ШИМ

Сообщение MR.Smith » 27 июн 2017, 15:43

hgost, спасибо большое за разъяснение!

т.е. получается, что причина исключительно в записи 0 в CMPA и ни синхронизация, ни мертвое время, ни TZ здесь не при чем?
Наиболее логичным выходом из ситуации мне видится перенос разрешения ШИМ (снятия запрета TZ) из прерывания CTR=ZERO в CTR=PRD.

Ответить

Вернуться в «32-разрядные микроконтроллеры на ядре ARM Cortex»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость