ШИМ
Модераторы: ea, dav, bkolbov, Alis, pip, _sva_
Re: ШИМ
Кстати, а пробовали в CMPA писать не ноль, а близкое к нему значение? Там 1, 3, 5?
Re: ШИМ
Интересно получается:
Если задать скважность 1, а не 0, то проблема не проявляется.
ШИМ работает в комплиментарном режиме, на верхнем сигнале нет переходов, т.к. мертвое время не позволяет там им появиться, это нормально.
-
- Сообщения: 61
- Зарегистрирован: 14 дек 2015, 12:07
- Предприятие: АО НИИЭТ
- Откуда: НИИЭТ
- Контактная информация:
Re: ШИМ
Добрый день!
У нас не получилось воспроизвести описанную Вами ситуацию. Возможно, не совсем правильно поняли Вас.
Давайте уточним:
- Реакция на события настроена именно так?
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 генерировать событие.
У нас не получилось воспроизвести описанную Вами ситуацию. Возможно, не совсем правильно поняли Вас.
Давайте уточним:
- Реакция на события настроена именно так?
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 генерировать событие.
Re: ШИМ
Здравствуйте!
Код эволюционирует и кое-что я уже успел поменять.
Теперь так:
Также для работы в комплиментарном режиме включена инверсия канала A:
До этого была инверсия канала B:
Мне просто в программе удобнее управлять нижним ключом.
Т.е на данный момент при NT_PWM8->CMPA_bit.CMPA = 2000; получаем PWMA8 == 0 и PWMB8 == 1,
а при NT_PWM8->CMPA_bit.CMPA = 0; получаем PWMA8 == 1 и PWMB8 == 0.
Аппаратура у меня построена таким образом, что аппаратные ключи закрыты при высоком уровне сигнала на выходе ШИМ. Есть необходимость периодически запрещать работу ШИМ, для этого используется TZ.
Картинку на осциллограмме строит следующий код в прерывании по CTR=PRD:
Включением/отключением через механизм TZ управляет код в прерывании по CTR=ZERO:
т.е. проблема проявляется при 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, но не наоборот!
Никаких проблем, корректный переход с учетом мертвого времени:
Все, что изменилось - больше нет запрета ШИМ (строки pwmFan.enableA = FALSE; заменены на pwmFan.enableA = TRUE;)
Код эволюционирует и кое-что я уже успел поменять.
Было именно так, но я изменил здесь кусок, что к исправлению ситуации не привело.
Теперь так:
Код: Выделить всё
NT_PWM0->AQCTLA_bit.CAU = 1;
NT_PWM0->AQCTLA_bit.CAD = 2;
Код: Выделить всё
NT_PWM0->DBCTL_bit.POLSEL = 1;
Код: Выделить всё
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++;
Код: Выделить всё
if(pwmFan.enableA) NT_PWM8->TZCLR_bit.OST = 1;
else NT_PWM8->TZFRC_bit.OST = 1;
Как видно на осциллограмме ниже после NT_PWM8->CMPA_bit.CMPA = 2000 ШИМ включается словно на CMPA == 0 (хотя по факту в регистре записано 2000) и только при следующем событии CTR=PRD переключается в верное состояние.
Если 0 заменить на 1, то ситуация исправляется:
т.е. данное поведение вызывает перезапись CMPA из значения 0 в значение 2000. Если перезаписывать из 1 в 2000, то проблема не воспроизводится. Однако, замена 2000 на 1999 (при неизменном 0) не приводит к исправлению! Дело именно в перезаписи CMPA из 0 в 2000, но не наоборот!
Да, пожалуйста:
Никаких проблем, корректный переход с учетом мертвого времени:
Все, что изменилось - больше нет запрета ШИМ (строки pwmFan.enableA = FALSE; заменены на pwmFan.enableA = TRUE;)
Re: ШИМ
Сначала я задаю величину мертвого времени в (тики процессора - 1) в соответствии с Eratta:
Код: Выделить всё
NT_PWM8->DBRED = 119;
NT_PWM8->DBFED = 119;
Код: Выделить всё
NT_PWM8->DBCTL_bit.IN_MODE = 0;
Код: Выделить всё
NT_PWM8->DBCTL_bit.OUT_MODE = 3;
Код: Выделить всё
NT_PWM0->DBCTL_bit.POLSEL = 1;
Re: ШИМ
Я отключил синхронизацию для всех блоков ШИМhgost писал(а): ↑26 июн 2017, 12:27 - Не стоит использовать синхронизацию при одновременном пуске всех ШИМ через сброс предделителей NT_COMMON_REG->PWM_SYNC. При пуске через сброс предделителей ШИМы и так будут гарантированно считать синхронно. Если же включить синхронизацию в момент когда ШИМЫ еще не запущены, это наоборот внесет дополнительные задержки. (Ситуация уже описана нами и в скором времени пояснение особенностей синхронизации появится в ТО. Если кратко - генерация и распространение сигнала синхронизации занимает 1 такт TBCLK, из-за чего значения счетчиков будут отличаться на 1)
Код: Выделить всё
NT_PWM0->TBCTL_bit.PHSEN = 0;
Re: ШИМ
hgost, может быть у вас есть готовый пример с настройками? Я бы сравнил код более детально.
Когда я писал текущую версию программы, то периодически обращался к примеру из Vector IDE.
Да и раньше аналогично настраивал ШИМ на TMS320F28335, там проблем не было.
Когда я писал текущую версию программы, то периодически обращался к примеру из Vector IDE.
Да и раньше аналогично настраивал ШИМ на TMS320F28335, там проблем не было.
-
- Сообщения: 61
- Зарегистрирован: 14 дек 2015, 12:07
- Предприятие: АО НИИЭТ
- Откуда: НИИЭТ
- Контактная информация:
Re: ШИМ
Все прояснилось, поведение ШИМ вполне логичное, сейчас попробую пояснить более детально.
Момент (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.
Момент (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.
Re: ШИМ
hgost, спасибо большое за разъяснение!
т.е. получается, что причина исключительно в записи 0 в CMPA и ни синхронизация, ни мертвое время, ни TZ здесь не при чем?
Наиболее логичным выходом из ситуации мне видится перенос разрешения ШИМ (снятия запрета TZ) из прерывания CTR=ZERO в CTR=PRD.
т.е. получается, что причина исключительно в записи 0 в CMPA и ни синхронизация, ни мертвое время, ни TZ здесь не при чем?
Наиболее логичным выходом из ситуации мне видится перенос разрешения ШИМ (снятия запрета TZ) из прерывания CTR=ZERO в CTR=PRD.