К1921ВК01Т - вопросы по ТО и его доработка

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

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

Василий
Сообщения: 5
Зарегистрирован: 15 ноя 2017, 15:30
Предприятие: ООО "НПФ Вектор"

Re: К1921ВК01Т - вопросы по ТО и его доработка

Сообщение Василий » 15 ноя 2017, 16:06

День добрый! Пытаюсь реализовать аппаратный релейный регулятор тока с помощью цифрового компаратора. Есть пара вопросов по работе цифровых компараторов АЦП и пороговых выключателей ШИМ.
1. Многократный режим работы цифрового компаратора. В описании написано:
"- В многократном режиме (CTM = 00b) выходной триггер будет переключаться в единицу каждый раз, когда результат сравнения будет положительным."
Рисунок:
Pic_21.9.png
Pic_21.9.png (59.36 КБ) 163 просмотра
Далее по тексту:
"Переключение выходного триггера в единицу устанавливает соответствующий флаг
DCTRIGn в регистре DCRTC и генерирует управляющий сигнал для пороговых
выключателей блоков ШИМ. Сброс триггера и флага выполняется записью единицы в
соответствующий бит регистра DCRTC."

Вопрос следующий. Сбрасывается ли выходной триггер компаратора в "0" автоматически при изменении результата сравнения с положительного на отрицательный? Надо ли его сбрасывать вручную, и если да, то в какой момент это делать, чтобы компаратор корректно управлял выходом ШИМ?
2. Управление ШИМ-выходом при помощи порогового переключателя. В описании написано:
"При получении события от компаратора блока АЦП в режиме циклической
обработки немедленно формируется реакция на основе содержимого регистра HDCTL, в
результате чего меняется состояние сигналов на выходе порогового выключателя взамен
полученных от обработчика событий PWMA и/или PWMB на заданное пользователем в
регистре HDCTL. Дополнительно устанавливается флаг CBC в регистре HDFLG, и
генерируется прерывание PWM_HDINT. Удержание выходных сигналов PWMA и PWMB
заканчивается по событию TBCTR = 0000h, при условии, что событие компаратора блока
АЦП уже не активно. Таким образом, в режиме циклической обработки состояние
удержания сбрасывается в каждом периоде ШИМ. При этом флаг CBC остается активным
до его программного сброса. Если после сброса флага CBC вновь будет получено событие
компаратора блока АЦП, то флаг установится вновь."

Допустим, я настроил компаратор на условие «Измерение ≤ COMP0» (CTC = 00b), а пороговый переключатель так, чтобы при получении "1" от компаратора открывался верхний ключ стойки и закрывался нижний (HDA = 1; HDB = 2;). Как теперь мне обеспечить отключение верхнего и включение нижнего ключа (переход в обратное состояние), если условие «Измерение ≤ COMP0» не выполняется? Должен ли я для этого использовать уставку сравнения ШИМ-генератора (например, настроить ШИМ-генератор на комплиментарный режим с активным высоким сигналом для верхнего ключа; и задать уставку сравнения для верхнего ключа, равную периоду ШИМ)? И надо ли сбрасывать флаг CBC порогового переключателя?

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

Re: К1921ВК01Т - вопросы по ТО и его доработка

Сообщение bkolbov » 16 ноя 2017, 15:40

Добрый день!
1. Многократный режим работы цифрового компаратора.
...
Вопрос следующий. Сбрасывается ли выходной триггер компаратора в "0" автоматически при изменении результата сравнения с положительного на отрицательный? Надо ли его сбрасывать вручную, и если да, то в какой момент это делать, чтобы компаратор корректно управлял выходом ШИМ?
Автоматически не сбрасывается. Более того, пока не произойдет отрицательный результат сравнения - операции записи в DCRTC не будут приводить к сбросу триггера.
2. Управление ШИМ-выходом при помощи порогового переключателя.
...
Как теперь мне обеспечить отключение верхнего и включение нижнего ключа (переход в обратное состояние), если условие «Измерение ≤ COMP0» не выполняется?
Для сброса удержания необходимо чтобы произошел отрицательный результат сравнения компаратора, и затем триггер был сброшен через DCRTC. И тогда по ближайшему событию TBCTR = 0000h удержание будет отключено, и продолжится генерация ШИМ, согласно настройкам модуля.

Василий
Сообщения: 5
Зарегистрирован: 15 ноя 2017, 15:30
Предприятие: ООО "НПФ Вектор"

Re: К1921ВК01Т - вопросы по ТО и его доработка

Сообщение Василий » 16 ноя 2017, 17:43

В продолжение предыдущего поста. Надо ли программно сбрасывать флаг CBC в регистре HDFLG или достаточно сбросить триггер через DCRTC? И еще. Если я хочу по триггеру компаратора включить верхний ключ и выключить нижний, я пишу так:
HDCTL_bit.HDA = 1;
HDCTL_bit.HDB = 2;
Как это соотносится с работой регистра полярности сигнала модуля мертвого времени DBCTL_bit.POLSEL? Если там стоит режим 0x2 (активный высокий, комплиментарный) то мне нужно писать:
HDCTL_bit.HDA = 1;
HDCTL_bit.HDB = 1;
или модуль мертвого времени не влияет на работу ШИМ от порогового переключателя?

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

Re: К1921ВК01Т - вопросы по ТО и его доработка

Сообщение bkolbov » 17 ноя 2017, 09:58

Для сброса удержания достаточно сбросить триггер через DCRTC. Флаг в регистре HDFLG влияет только на генерацию прерывания порогового выключателя - если вы им пользуетесь, то надо сбрасывать.

Не совсем понял вторую часть сообщения. Модуль мертвого времени стоит после порогового переключателя (рис.14.1 ТО) в тракте прохождения сигналов ШИМ, и уже обрабатывает модифицированные пороговым выключателем сигналы.

Василий
Сообщения: 5
Зарегистрирован: 15 ноя 2017, 15:30
Предприятие: ООО "НПФ Вектор"

Re: К1921ВК01Т - вопросы по ТО и его доработка

Сообщение Василий » 22 ноя 2017, 16:40

Добрый день! Тестируя работу цифрового компаратора, столкнулся с проблемой: выходной триггер компаратора не меняет своего состояния.
Предполагается, что компаратор будет выдавать единицу на выходной триггер, когда измеренная величина меньше уставки сравнения. Режим - многократный.

Настройка компаратора (для одной фазы, остальные две - аналогично):
NT_ADC->DCCTL_bit[0].CHNL = 0;
NT_ADC->DCCTL_bit[0].CTC = 0;
NT_ADC->DCCTL_bit[0].CTM = 0;
NT_ADC->DCCMP_bit[0].COMP0 = 0;
NT_ADC->DCCMP_bit[0].COMP1 = 0;
NT_ADC->DCCTL_bit[0].CTE = 1;

Периодический сброс триггера (выполняется в прерывании 10 кГц):
NT_ADC->DCRTC_bit.DCTRIG0 = 1;
NT_ADC->DCRTC_bit.DCTRIG2 = 1;
NT_ADC->DCRTC_bit.DCTRIG12 = 1;

Присвоение уставок сравнения и проверка через отладочные переменные (выполняется в прерывании 10 кГц):
NT_ADC->DCCMP_bit[0].COMP0 = IBCmp;
NT_ADC->DCCMP_bit[2].COMP0 = IACmp;
NT_ADC->DCCMP_bit[12].COMP0 = ICCmp;
DebugW1 = NT_ADC->DCCMP_bit[0].COMP0;
DebugW2 = NT_ADC->DCVAL_bit[0].VAL;
DebugW3 = NT_ADC->DCRTC_bit.DCTRIG0;

Через отладочные переменные видно, что измеренный ток (красный график, DebugW1) примерно постоянен (колеблется около 2000, что соответствует нулевому измеренному току), уставка сравнения (голубой график, DebugW2) задается по синусоидальному закону и постоянно пересекает измеренную величину. При этом состояние выходного триггера (синий, DebugW3) не меняется: на нем постоянно "0". Убирал строчки, отвечающие за сброс выходных триггеров, картина не изменилась.
Прошу помощи в решении данной проблемы.
2017.11.22_15;31;44.png
2017.11.22_15;31;44.png (19.73 КБ) 107 просмотров

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

Re: К1921ВК01Т - вопросы по ТО и его доработка

Сообщение bkolbov » 22 ноя 2017, 17:10

Добрый день, Василий!

Пробовали осуществлять сброс/чтение значений триггеров не через битовый доступ, а через обычное чтение регистра и маскирование нужных бит?
Так получилось, что у него несколько специфичное расположение бит на чтение и запись (табл. А.1.23 в ТО), что трудно отразить в хедере.

Василий
Сообщения: 5
Зарегистрирован: 15 ноя 2017, 15:30
Предприятие: ООО "НПФ Вектор"

Re: К1921ВК01Т - вопросы по ТО и его доработка

Сообщение Василий » 23 ноя 2017, 14:21

bkolbov писал(а):
22 ноя 2017, 17:10
Пробовали осуществлять сброс/чтение значений триггеров не через битовый доступ, а через обычное чтение регистра и маскирование нужных бит?
Заменил битовый сброс триггеров:
NT_ADC->DCRTC_bit.DCTRIG0 = 1;
NT_ADC->DCRTC_bit.DCTRIG2 = 1;
NT_ADC->DCRTC_bit.DCTRIG12 = 1;

на сброс всего регистра:
NT_ADC->DCRTC = 0xFFFFFC00;

Заменил битовое чтение одного триггера:
DebugW3 = NT_ADC->DCRTC_bit.DCTRIG0;

на чтение всего регистра:
DebugW3 = NT_ADC->DCRTC;

Остальное оставил, как было описано выше. Результат такой же, из NT_ADC->DCRTC все время читается "0".

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

Re: К1921ВК01Т - вопросы по ТО и его доработка

Сообщение bkolbov » 23 ноя 2017, 14:32

А как настроили и запускаете АЦП?

Василий
Сообщения: 5
Зарегистрирован: 15 ноя 2017, 15:30
Предприятие: ООО "НПФ Вектор"

Re: К1921ВК01Т - вопросы по ТО и его доработка

Сообщение Василий » 23 ноя 2017, 16:21

Инициализация АЦП. В основном, соответствует последнему коммиту проекта MotorControlDemo на битбакете. Под дефайном #ifdef DIGITAL_CMP_RELAY_REG добавлена настройка режима работы компараторов.

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

void AdcDrv_init(TAdcDrv *p) {
	// Запрет всех секвенсоров
	NT_ADC->ACTSS = 0;

	// Сброс счётчиков прерываний и измерений
	NT_ADC->SEQ[0].OP = 0;
	NT_ADC->SEQ[1].OP = 0;
	NT_ADC->SEQ[2].OP = 0;
	NT_ADC->SEQ[3].OP = 0;
	NT_ADC->SEQ[4].OP = 0;
	NT_ADC->SEQ[5].OP = 0;
	NT_ADC->SEQ[6].OP = 0;
	NT_ADC->SEQ[7].OP = 0;

	//Включаем 2, 3, 4 и 5 секвенсоры, по одному на измеряемую величину (длина фифо каждого - 16 ячеек)
	//Примечание – Рекомендуется использовать только один секвенсор, либо несколько, но работающих синхронно (одинаковые события запуска, одинаковые задержки перезапуска измерений).
	NT_ADC->ACTSS_bit.ASEN2 = 1;
	NT_ADC->ACTSS_bit.ASEN3 = 1;
	NT_ADC->ACTSS_bit.ASEN4 = 1;
	NT_ADC->ACTSS_bit.ASEN5 = 1;
	NT_ADC->ACTSS_bit.ASEN6 = 1;
	NT_ADC->ACTSS_bit.ASEN7 = 1;
	//Ставим маску прерывания (для 4 секвенсора, нам не надо 4 прерывания, достаточно одного)
	NT_ADC->IM_bit.MASK4 = 1;
	//Настраиваем источник запуска
	NT_ADC->EMUX_bit.EM2 = 8; //запуск производится по команде SocA  Блока ШИМ 3 для vector card
	NT_ADC->EMUX_bit.EM3 = 8; //запуск производится по команде SocA  Блока ШИМ 3 для vector card
	NT_ADC->EMUX_bit.EM4 = 8; //запуск производится по команде SocA  Блока ШИМ 3 для vector card
	NT_ADC->EMUX_bit.EM5 = 8; //запуск производится по команде SocA  Блока ШИМ 3 для vector card
	NT_ADC->EMUX_bit.EM6 = 8; //запуск производится по команде SocA  Блока ШИМ 3 для vector card
	NT_ADC->EMUX_bit.EM7 = 8; //запуск производится по команде SocA  Блока ШИМ 3 для vector card
	NT_ADC->PSSI_bit.SS2 = 1; //разрешить программный запуск секвенсора
	NT_ADC->PSSI_bit.SS3 = 1; //разрешить программный запуск секвенсора
	NT_ADC->PSSI_bit.SS4 = 1; //разрешить программный запуск секвенсора
	NT_ADC->PSSI_bit.SS5 = 1; //разрешить программный запуск секвенсора
	NT_ADC->PSSI_bit.SS6 = 1; //разрешить программный запуск секвенсора
	NT_ADC->PSSI_bit.SS7 = 1; //разрешить программный запуск секвенсора

	//Настраиваем количество перезапусков секвенсора
	NT_ADC->SEQ[2].CTL_bit.RCNT = 0; //Перезапуск не требуется
	NT_ADC->SEQ[3].CTL_bit.RCNT = 0; //Перезапуск не требуется
	NT_ADC->SEQ[4].CTL_bit.RCNT = 0; //Перезапуск не требуется
	NT_ADC->SEQ[5].CTL_bit.RCNT = 0; //Перезапуск не требуется
	NT_ADC->SEQ[6].CTL_bit.RCNT = 0; //Перезапуск не требуется
	NT_ADC->SEQ[7].CTL_bit.RCNT = 0; //Перезапуск не требуется
	//Настраиваем частоту прерываний
	NT_ADC->SEQ[2].CTL_bit.ICNT = 0; //Прерывания после каждого запуска
	NT_ADC->SEQ[3].CTL_bit.ICNT = 0; //Прерывания после каждого запуска
	NT_ADC->SEQ[4].CTL_bit.ICNT = 0; //Прерывания после каждого запуска
	NT_ADC->SEQ[5].CTL_bit.ICNT = 0; //Прерывания после каждого запуска
	NT_ADC->SEQ[6].CTL_bit.ICNT = 0; //Прерывания после каждого запуска
	NT_ADC->SEQ[7].CTL_bit.ICNT = 0; //Прерывания после каждого запуска
	//NT_ADC->SEQUENCER.SEQ0.ADCSSTMR.bit.TMR

	NT_ADC->PP_bit[0].OM = 0x3; //OM2-OM0 = ’011’ All blocks active (ADC plus internal buffers plus internal bandgap).
	NT_ADC->PP_bit[1].OM = 0x3;
	NT_ADC->PP_bit[2].OM = 0x3;
	NT_ADC->PP_bit[3].OM = 0x3;
	NT_ADC->PP_bit[4].OM = 0x3;
	NT_ADC->PP_bit[5].OM = 0x3;
	NT_ADC->PP_bit[6].OM = 0x3;
	NT_ADC->PP_bit[7].OM = 0x3;
	NT_ADC->PP_bit[8].OM = 0x3;
	NT_ADC->PP_bit[9].OM = 0x3;
	NT_ADC->PP_bit[10].OM = 0x3;
	NT_ADC->PP_bit[11].OM = 0x3;

	//Включаем необходимые модули АЦП
	//Настраиваем разрешающую способность модуля АЦП
	NT_ADC->PP_bit[0].ENA = 1;	//Включаем модуль АЦП
	NT_ADC->PP_bit[1].ENA = 1;
	NT_ADC->PP_bit[2].ENA = 1;
	NT_ADC->PP_bit[3].ENA = 1;
	NT_ADC->PP_bit[4].ENA = 1;
	NT_ADC->PP_bit[5].ENA = 1;
	NT_ADC->PP_bit[6].ENA = 1;
	NT_ADC->PP_bit[7].ENA = 1;
	NT_ADC->PP_bit[8].ENA = 1;
	NT_ADC->PP_bit[9].ENA = 1;
	NT_ADC->PP_bit[10].ENA = 1;
	NT_ADC->PP_bit[11].ENA = 1;

#ifdef HW_MOTORCONTROLBOARD
	// Настраиваем компараторы каждый на свой канал АЦП -
	// из компараторов будем забирать оцифрованные данные, как из ADC result (брать можно из компараторов или из FIFO секвенсоров АЦП)
	NT_ADC->DCCTL_bit[4].CHNL = 4;		//Udc
	NT_ADC->DCCTL_bit[0].CHNL = 0;		//Ток фазы B
	NT_ADC->DCCTL_bit[2].CHNL = 2;		//Ток фазы A
	NT_ADC->DCCTL_bit[12].CHNL = 12;		//Ток фазы C
	NT_ADC->DCCTL_bit[16].CHNL = 16;	//Температура
	NT_ADC->DCCTL_bit[10].CHNL = 10;	//Задание

	//разрешение работы компараторов
	NT_ADC->SEQ[2].DCP_bit.CMP4 = 1;	//Udc
	NT_ADC->SEQ[3].DCP_bit.CMP0 = 1;	//Ток фазы B
	NT_ADC->SEQ[4].DCP_bit.CMP2 = 1;	//Ток фазы A
	NT_ADC->SEQ[5].DCP_bit.CMP12 = 1;	//Ток фазы C
	NT_ADC->SEQ[6].DCP_bit.CMP10 = 1;   //Задание
	NT_ADC->SEQ[7].DCP_bit.CMP16 = 1;	//Температура

	//выбор каналов для измерений
	NT_ADC->SEQ[2].MUX_bit.CH4 = 1;		//Udc
	NT_ADC->SEQ[3].MUX_bit.CH0 = 1;		//Ток фазы B
	NT_ADC->SEQ[4].MUX_bit.CH2 = 1;		//Ток фазы A
	NT_ADC->SEQ[5].MUX_bit.CH12 = 1;		//Ток фазы C
	NT_ADC->SEQ[6].MUX_bit.CH10 = 1;   //Задание
	NT_ADC->SEQ[7].MUX_bit.CH16 = 1;	//Температура

#ifdef DIGITAL_CMP_RELAY_REG
	//найстройка цифровых компараторов для аппаратного релейного регулирования токов
	//настроим, чтобы каждый раз, если ток меньше задания, на выходе компаратора была единица
	NT_ADC->DCCTL_bit[0].CTC = 0;		//Ток фазы B. Условие срабатывания выходного триггера - (Измерение <= COMP0)
	NT_ADC->DCCTL_bit[0].CTM = 0;		//Ток фазы B. Режим срабатывания выходного триггера - многократный (без гистерезиса)
	NT_ADC->DCCMP_bit[0].COMP0 = 0;		//Первая уставка сравнения компаратора. Обнуляем.
	NT_ADC->DCCMP_bit[0].COMP1 = 0;		//Вторая уставка сравнения компаратора. В выбранном режиме работы компаратора не задействована. Обнуляем.
	NT_ADC->DCCTL_bit[0].CTE = 1;		//Разрешение срабатывания выходного триггера компаратора

	NT_ADC->DCCTL_bit[2].CTC = 0;		//Ток фазы A. Условие срабатывания выходного триггера - (Измерение <= COMP0)
	NT_ADC->DCCTL_bit[2].CTM = 0;		//Ток фазы A. Режим срабатывания выходного триггера - многократный (без гистерезиса)
	NT_ADC->DCCMP_bit[2].COMP0 = 0;		//Первая уставка сравнения компаратора. Обнуляем.
	NT_ADC->DCCMP_bit[2].COMP1 = 0;		//Вторая уставка сравнения компаратора. В выбранном режиме работы компаратора не задействована. Обнуляем.
	NT_ADC->DCCTL_bit[2].CTE = 1;		//Разрешение срабатывания выходного триггера компаратора

	NT_ADC->DCCTL_bit[12].CTC = 0;		//Ток фазы C. Условие срабатывания выходного триггера - (Измерение <= COMP0)
	NT_ADC->DCCTL_bit[12].CTM = 0;		//Ток фазы C. Режим срабатывания выходного триггера - многократный (без гистерезиса)
	NT_ADC->DCCMP_bit[12].COMP0 = 0;		//Первая уставка сравнения компаратора. Обнуляем.
	NT_ADC->DCCMP_bit[12].COMP1 = 0;		//Вторая уставка сравнения компаратора. В выбранном режиме работы компаратора не задействована. Обнуляем.
	NT_ADC->DCCTL_bit[12].CTE = 1;		//Разрешение срабатывания выходного триггера компаратора
#endif


#endif

}
Запуск АЦП производится по таймеру ШИМ (PWM3 работает синхронно с PWM0-PWM2, которые управляют силовыми ключами):

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

	
	// ------------------------------------------------------------------------
	// Настраиваем модуль ePWM3 под АЦП
	// ------------------------------------------------------------------------
	// Setup TBCLK
	NT_PWM3->TBPRD = NT_PWM0->TBPRD;
	NT_PWM3->TBPHS_bit.TBPHS = 0x0001;      // Фаза равна 1 из-за задержки в один такт на синхронизацию
	NT_PWM3->TBCTR = 0x0000;                       // Clear counter

	// Setup counter mode
	NT_PWM3->TBCTL_bit.PRDLD = TB_SHADOW;        // загрузка TBPRD при TBCTR = 0
	NT_PWM3->TBCTL_bit.CTRMODE = TB_COUNT_UPDOWN;  // Count up-down
	NT_PWM3->TBCTL_bit.PHSEN = TB_ENABLE;         // Enable phase loading
	NT_PWM3->TBCTL_bit.PHSDIR = TB_UP;      // Считать вверх после загрузки фазы
	NT_PWM3->TBCTL_bit.HSPCLKDIV = 0;     // High Speed Time-base Clock Prescale
	NT_PWM3->TBCTL_bit.CLKDIV = 0;           // Time-base Clock Prescale
	NT_PWM3->TBCTL_bit.SYNCOSEL = TB_SYNC_IN; // разрешаем выдачу синхро-сигнала

	// Interrupt where we will change the Compare Values
	NT_PWM3->ETSEL_bit.INTSEL = ET_DISABLE;        // Disable INT
	NT_PWM3->ETSEL_bit.INTEN = 0;                  // Disable INT


	NT_PWM3->ETSEL_bit.SOCAEN = 1;		// Разрешить запуск ацп
	NT_PWM3->ETSEL_bit.SOCASEL = 1;		// Запускать при CTR == 0 (Underflow)
З.Ы.: а нет ли у Вас, примера правильной работы с цифровым компаратором и ШИМ в режиме удержания?

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

Re: К1921ВК01Т - вопросы по ТО и его доработка

Сообщение bkolbov » 23 ноя 2017, 16:45

Конкретно такого примера нету, но по-видимому надо будет его реализовать. Т.к. внешне ничего подозрительного в коде не заметил, а значит необходимо повторить вашу ситуацию у себя.

Ответить

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

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

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