ШИМ Пороговый выключатель 1921ВК035

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

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

Ответить
Al-x
Сообщения: 21
Зарегистрирован: 02 фев 2021, 19:22
Предприятие: АО "НТЦ "РИФ"

ШИМ Пороговый выключатель 1921ВК035

Сообщение Al-x » 13 сен 2021, 17:31

В программе и отладчике в регистре HDSEL не устанавливаются биты CBC и OST. То есть при такой строчке PWM2->HDSEL_bit.ADCDC0 = 1; бит ADCDC0 устанавливается, состояние регистра HDSEL становится 0x00000001.
А при такой PWM2->HDSEL_bit.CBC= 1; - не меняется. Попробовал прямую запись: PWM2->HDSEL = PWM_HDSEL_ADCDC0_Msk | PWM_HDSEL_CBC_Msk; - регистр HDSEL становится 0x00000001. По умолчанию этот регистр равен 0x00018000;

Вопрос - как правильно настраивать ШИМ на срабатывание компаратора АЦП и событие удержания в циклическом режиме?

Код привожу ниже, пока выяснил: ключ открывается, устанавливаются все биты HDFLG (=0x00000007).

Код настройки привожу: Такт процессора 100МГц.

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

	RCU->PCLKCFG_bit.PWM2EN = 1;
	RCU->PRSTCFG_bit.PWM2EN = 1;

	//настраиваем таймер 2

	PWM2->TBPHS_bit.TBPHS = 0;

	PWM2->TBCTL_bit.SHDWGLOB = 0x1; 	// Теневая загрузка происходит согласно настройкам соответствующих полей
	PWM2->TBCTL_bit.FREESOFT = 0x2; 	// Счетчик продолжит работу
	PWM2->TBCTL_bit.PHSDIR = 0; // Вниз
	PWM2->TBCTL_bit.CLKDIV = 0x0;
	PWM2->TBCTL_bit.HSPCLKDIV = 0x0;

	PWM2->TBCTL_bit.SYNCOSEL = 0;
	PWM2->TBCTL_bit.PHSEN = 0;
	PWM2->TBCTL_bit.CTRMODE = 0;		// Вверх
	PWM2->TBCTL_bit.PRDLD = 0x0; // Режим отложенной загрузки регистра TBPRD разрешен

	PWM2->CMPCTL_bit.SHDWAMODE = 1; // Производится загрузка напрямую в активный регистр
	PWM2->CMPCTL_bit.SHDWBMODE = 1; // Производится загрузка напрямую в активный регистр

	PWM2->CMPCTL_bit.LOADAMODE = 0; // Поле задания события загрузки отложенного значения в регистр CMPA: CTR = Zero
	PWM2->CMPCTL_bit.LOADBMODE = 0; // Поле задания события загрузки отложенного значения в регистр CMPB: CTR = Zero

	PWM2->AQCTLA_bit.ZRO = 0x1; // Действие на выводе PWMA при CTR = Zero - ВКЛЮЧАЕМ ВЫХОД
	PWM2->AQCTLA_bit.PRD = 0x1; // Действие на выводе PWMA при CTR = PRD - ВКЛЮЧАЕМ ВЫХОД
	PWM2->AQCTLA_bit.CAU = 0; // Действие на выводе PWMA при CTR = CMPA при счете вверх
	PWM2->AQCTLA_bit.CAD = 0; // Действие на выводе PWMA при CTR = CMPA при счете вниз
	PWM2->AQCTLA_bit.CBU = 0; // Действие на выводе PWMA при CTR = CMPB при счете вверх
	PWM2->AQCTLA_bit.CBD = 0; // Действие на выводе PWMA при CTR = CMPB при счете вниз

	PWM2->AQCTLB_bit.ZRO = 0; // Действие на выводе PWMB при CTR = Zero
	PWM2->AQCTLB_bit.PRD = 0; // Действие на выводе PWMB при CTR = PRD
	PWM2->AQCTLB_bit.CAU = 0; // Действие на выводе PWMB при CTR = CMPA при счете вверх
	PWM2->AQCTLB_bit.CAD = 0; // Действие на выводе PWMB при CTR = CMPA при счете вниз
	PWM2->AQCTLB_bit.CBU = 0; // Действие на выводе PWMB при CTR = CMPB при счете вверх
	PWM2->AQCTLB_bit.CBD = 0; // Действие на выводе PWMB при CTR = CMPB при счете вниз

	PWM2->AQSFRC_bit.ACTSFA = 0x1; // Выбор действия с выходным сигналом на выводе: ВКЛЮЧАЕМ ВЫХОД
	PWM2->AQSFRC_bit.OTSFA = 0x1; // Запись единицы инициирует ожидание события CTR = Zero для однократного переключения вывода в состояние, согласно ACTSFA
	PWM2->AQSFRC_bit.ACTSFB = 0x0; // Выбор действия с выходным сигналом на выводе: Нет действий
	PWM2->AQSFRC_bit.OTSFB = 0x1; // Запись единицы инициирует ожидание события CTR = Zero для однократного переключения вывода в состояние, согласно ACTSFB

	PWM2->TBCTR = 0; // Сбрасываем счётчик
	PWM2->CMPA_bit.CMPA = 0; // 
	PWM2->CMPB_bit.CMPB = 0; // 

	PWM2->CMPCTL_bit.SHDWAMODE = 0; // Значение, записываемое в регистр CMPA, размещается в теневом регистре (отложенная загрузка)
	PWM2->CMPCTL_bit.SHDWBMODE = 0; // Значение, записываемое в регистр CMPB, размещается в теневом регистре (отложенная загрузка)

	PWM2->HDSEL_bit.ADCDC0 = 1; // Бит выбора цифрового компаратора (0 – 3) блока АЦП

	PWM2->HDCTL_bit.HDA = 1; // Переключается в состояние единицы
	PWM2->HDCTL_bit.HDB = 3; // Остается без изменений

	Энвик_SetPriority (PWM2_HD_IRQn, IRQ_PRIORITY_PWM_CLOSE); // Приоритет прерывания
	Энвик_EnableIRQ (PWM2_HD_IRQn); // 
	
	
	
	RCU->ADCCFG_bit.CLKSEL = 1;
	RCU->ADCCFG_bit.DIVN = 1;
	RCU->ADCCFG_bit.DIVEN = 1;
	RCU->ADCCFG_bit.CLKEN = 1;
	RCU->ADCCFG_bit.RSTDIS = 1;

	ADC->ACTL_bit.ADCEN = 1; // Включение АЦП. При каждом включении запускается процедура инициализации, которая завершается установкой ADCRDY.

	// Сброс

	ADC->EMUX_bit.EM0 = 0; // Установка бита GSYNC в регистре SEQSYNC
	ADC->EMUX_bit.EM1 = 0; // Установка бита GSYNC в регистре SEQSYNC

	ADC->SEQEN_bit.SEQEN0 = 0;
	ADC->SEQEN_bit.SEQEN1 = 0;

	// Настройка

	//ADC->EMUX_bit.EM0 = 0x4; // Сигнал от блока TMR1
	ADC->EMUX_bit.EM0 = 0xF; // Циклическая работа. Активируется после установки бита GSYNC в регистре SEQSYNC

	// Секвенсоры

	// Секвенсор 1 - измерение тока по каналу 0 компаратором 0 для ограничителя ШИМ
	ADC->SEQ[1].SCCTL_bit.RAVGEN = 0; // Бит разрешения режима усреднения результатов по перезапускам (для корректной работы этого режима поле RCNT регистра SCCTL должно содержать любое значение, соответствующее 2???1, где p=1..8.)
	ADC->SEQ[1].SCCTL_bit.RCNT = 0; // Поле задания количества перезапусков очереди запросов секвенсора s после его запуска по событию.
	ADC->SEQ[1].SCCTL_bit.ICNT = 0; // Поле задания количества запросов секвенсором s модуля АЦП, по достижении которого генерируется прерывание
	ADC->SEQ[1].SRTMR_bit.VAL = 10; // Поле задания задержки перезапуска очереди секвенсора
	ADC->SEQ[1].SRQCTL_bit.QAVGVAL = 0x1; // Поле задания количества необходимых опросов для усреднения сканированием - 2 в степени QAVGVAL
	ADC->SEQ[1].SRQCTL_bit.QAVGEN = 0x1; // Бит управления режимом усреднения сканированием
	ADC->SEQ[1].SRQCTL_bit.RQMAX = 0; // Количество каналов для измерения - 1 канал
	ADC->SEQ[1].SRQSEL_bit.RQ0 = 0x0; // 0 канал
	ADC->SEQ[1].SDC_bit.DC0 = 1; // Компаратор 0
	ADC->SEQ[1].SDC_bit.DC1 = 0; // Компаратор 1 - 0 канал
	ADC->SEQ[1].SDC_bit.DC2 = 0; // Компаратор 2 - 1 канал
	ADC->SEQ[1].SDC_bit.DC3 = 0; // Компаратор 3 - 2 канал

	// Компараторы

	ADC->DC[0].DCTL_bit.CHNL = 0x0; // Компаратор 0 // Поле выбирает канал, результат измерения которого будет передан на компаратор - 0 канал
	ADC->DC[1].DCTL_bit.CHNL = 0x0; // Компаратор 1 // Поле выбирает канал, результат измерения которого будет передан на компаратор - 0 канал
	ADC->DC[2].DCTL_bit.CHNL = 0x1; // Компаратор 2 // Поле выбирает канал, результат измерения которого будет передан на компаратор - 1 канал
	ADC->DC[3].DCTL_bit.CHNL = 0x2; // Компаратор 3 // Поле выбирает канал, результат измерения которого будет передан на компаратор - 2 канал

	ADC->DCTRIG = ADC_DCTRIG_TOS0_Msk;

	// Настройка компаратора ограничения тока // Компаратор ADC_DCCMP_PWM_LIMIT
	ADC->DC[ADC_DCCMP_PWM_LIMIT].DCTL_bit.CTM = 2; // Многократный с гистерезисом
	ADC->DC[ADC_DCCMP_PWM_LIMIT].DCTL_bit.CTC = 2; // COMP1 <= Измерение - выходной триггер будет переключаться в единицу каждый раз, когда результат измерения выше COMP1 (при 1 - превышение тока (запрет ШИМ))
	ADC->DC[ADC_DCCMP_PWM_LIMIT].DCTL_bit.CTE = 1; // Бит разрешения срабатывания выходного триггера компаратора

	ADC->SEQEN_bit.SEQEN1 = 1;

	while(!ADC->ACTL_bit.ADCRDY);


	
Код активации привожу:

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

	
		ADC->DC[ADC_DCCMP_PWM_LIMIT].DCMP_bit.CMPL = 0x0200;
	ADC->DC[ADC_DCCMP_PWM_LIMIT].DCMP_bit.CMPH = 0x0280;
	ADC->DCTRIG = ADC_DCTRIG_TOS0_Msk;

	PWM2->HDCLR = PWM_HDCLR_CBC_Msk | PWM_HDCLR_OST_Msk; // Сброс порогового переключателя
	PWM2->HDINTCLR = PWM_HDINTCLR_INT_Msk; // Бит сброса прерывания
	PWM2->AQSFRC_bit.ACTSFA = 0x1; // Выбор действия с выходным сигналом на выводе: ВКЛЮЧАЕМ ВЫХОД
	PWM2->AQSFRC_bit.OTSFA = 0x1; // Запись единицы инициирует ожидание события CTR = Zero для однократного переключения вывода в состояние, согласно ACTSFA
	PWM2->TBPRD = 0x1F0; // Задаём частоту ШИМ ограничения тока
	PWM2->TBCTR = 0; // Сбрасываем счётчик
	PWM2->HDSEL = PWM_HDSEL_ADCDC0_Msk | PWM_HDSEL_CBC_Msk; // Бит разрешения события по источнику DCMP в циклическом режиме обработки аварии
	PWM2->HDEINT_bit.CBC = 1; // Бит разрешения генерации прерывания в циклическом режиме

	SIU->PWMSYNC |= 0x4 << SIU_PWMSYNC_PRESCRST_Pos;
	
	void PWM2_HD_IRQHandler(void) {

	PWM2->HDINTCLR = PWM_HDINTCLR_INT_Msk; // Бит сброса прерывания



	}
	

Al-x
Сообщения: 21
Зарегистрирован: 02 фев 2021, 19:22
Предприятие: АО "НТЦ "РИФ"

Re: ШИМ Пороговый выключатель 1921ВК035

Сообщение Al-x » 13 сен 2021, 18:06

Со сбросом ADC->DCTRIG тоже не понятно.

Пока не смог найти режим автоматического сброса порогового выключателя ни для АЦП ни для ШИМ.

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

Re: ШИМ Пороговый выключатель 1921ВК035

Сообщение dav » 14 сен 2021, 12:12

Al-x писал(а):
13 сен 2021, 18:06
Со сбросом ADC->DCTRIG тоже не понятно.

Пока не смог найти режим автоматического сброса порогового выключателя ни для АЦП ни для ШИМ.
Доброго времени суток!
1) Из Errata для К1921ВК035:
3. Одиночный и циклический режимы удержания
Описание: Биты выбора режима удержания CBC и OST (регистр HDSEL) не влияют ни на что.
Условия: Всегда.
Последствия: Оба сигнала на удержание генерируются одновременно и объединяются через ИЛИ без учета разрешения конкретного режима. И если сигнал циклического удержания будет сброшен по новому периоду ШИМ автоматически, то сигнал одиночного удержания должен быть сброшен через флаг. Т.е. фактически циклический режим не функционирует, т.к. чтобы снять удержание необходимо также сбрасывать флаг одиночного удержания OST в регистре HDCLR. В итоге, снятие удержания возможно только при сбросе флага OST в HDCLR лишь после наступления нового периода PWM (CTR==0).
Рекомендации и способы обхода: Не использовать режим.

2) Что касается сброса порогового выключателя ШИМ: в руководстве пользователя на стр.82: Удержание выходных сигналов будет производиться до программного сброса записью единицы в бит OST регистра HDCLR.

Al-x
Сообщения: 21
Зарегистрирован: 02 фев 2021, 19:22
Предприятие: АО "НТЦ "РИФ"

Re: ШИМ Пороговый выключатель 1921ВК035

Сообщение Al-x » 14 сен 2021, 15:03

Спасибо за ответ. В принципе, я так и полагал, даже сказал бы - опасался, что дела обстоят именно так.
Errata
это уже интересно, срочно необходим документ.

Что касается вопроса по существу. С ШИМ понятно, сбрасываем вручную. PWM2->HDCLR = PWM_HDCLR_CBC_Msk | PWM_HDCLR_OST_Msk; // Бит сброса прерывания

А флаг ADC->DCTRIG так же требуется очищать вручную, автоматом никак? Я пока не нашёл способа его автоматической очистки. Сейчас так сделано:

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

void PWM2_IRQHandler(void) {

	PWM2->ETCLR = PWM_ETCLR_INT_Msk;
	PWM2->INTCLR = PWM_INTCLR_INT_Msk;

	if (ADC->DCTRIG & ADC_DCTRIG_TOS0_Msk) {

......

		ADC->DCTRIG = ADC_DCTRIG_TOS0_Msk/* | ADC_DCTRIG_DCEV0_Msk*/; // Очистка флага компаратора

	}

	PWM2->HDCLR = PWM_HDCLR_CBC_Msk | PWM_HDCLR_OST_Msk; // Бит сброса прерывания

}
Понятно, что раз очищаем OST, то можно поставить и очистку DCTRIG, но суть в другом.

На ВК01Т я экспериментально обнаружил интересный момент.

Там у меня было сделано так же:

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

void PWM3_IRQHandler(void) {

	PWM_LIMIT_MODULE_REG->ETCLR = PWM_ETCLR_INT_Msk;
	PWM_LIMIT_MODULE_REG->INTCLR = PWM_INTCLR_INT_Msk;

	NT_ADC->DCRTC = 0x1 << (ADC_DCCMP_PWM_LIMIT+8); // Очистка флага компаратора

	PWM_LIMIT_MODULE_REG->HDCLR = PWM_HDEINT_OST_Msk; // Сброс OST порогового переключателя

}
и изначально прерывание вызывалось при переполнении таймера. И получился интересный момент - флаг в NT_ADC->DCRTC очищался, происходила перезагрузка порогового выключателя и он открывался. Но ток на этот момент ещё не успел упасть, происходило измерение АЦП и пороговый выключатель срабатывал снова - итог - микроимпульсы длительностью до одного периода измерения АЦП. В итоге я процедуру разблокировки по прерывания ШИМ сделал не по переполнению таймера, а на несколько тактов раньше переполнения ШИМ. (По сравнению одного из каналов CMP). PWM_LIMIT_MODULE_REG->ETSEL_bit.INTSEL = 0x6; Тогда на момент переполнения АЦП уже успевал сделать измерение и пороговый выключатель не сбрасывался.

Не исключаю, что по существу я не прав. Но во всяком случае после указанной корректировки проблема коротких импульсов на ВК01Т ушла. Я пока не знаю проявится ли проблема на ВК035, пока аппаратура не позволяет проверить.

Stacey_S
Сообщения: 1
Зарегистрирован: 16 сен 2021, 17:33
Предприятие: Темп

Re: ШИМ Пороговый выключатель 1921ВК035

Сообщение Stacey_S » 17 сен 2021, 12:33

dav писал(а):
14 сен 2021, 12:12
Al-x писал(а):
13 сен 2021, 18:06
Со сбросом ADC->DCTRIG тоже не понятно.

Пока не смог найти режим автоматического сброса порогового выключателя ни для АЦП ни для ШИМ.
Доброго времени суток!
1) Из Errata для К1921ВК035:
3. Одиночный и циклический режимы удержания
Описание: Биты выбора режима удержания CBC и OST (регистр HDSEL) не влияют ни на что.
Условия: Всегда.
Последствия: Оба сигнала на удержание генерируются одновременно и объединяются через ИЛИ без учета разрешения конкретного режима. И если сигнал циклического удержания будет сброшен по новому периоду ШИМ автоматически, то сигнал одиночного удержания должен быть сброшен через флаг. Т.е. фактически циклический режим не функционирует, т.к. чтобы снять удержание необходимо также сбрасывать флаг одиночного удержания OST в регистре HDCLR. В итоге, снятие удержания возможно только при сбросе флага OST в HDCLR лишь после наступления нового периода PWM (CTR==0).
Рекомендации и способы обхода: Не использовать режим.

2) Что касается сброса порогового выключателя ШИМ: в руководстве пользователя на стр.82: Удержание выходных сигналов будет производиться до программного сброса записью единицы в бит OST регистра HDCLR.
Здравствуйте! Где найти errata на 1921ВК035 и 1921ВК028?

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

Re: ШИМ Пороговый выключатель 1921ВК035

Сообщение dav » Сегодня, 09:16

Stacey_S писал(а):
17 сен 2021, 12:33
Здравствуйте! Где найти errata на 1921ВК035 и 1921ВК028?
errata_K1921VK028_210702.pdf
Errata 1921ВК028
(407.32 КБ) 3 скачивания
errata_K1921VK035_210702.pdf
Errata 1921ВК035
(346.04 КБ) 3 скачивания

Ответить

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

Пользователи онлайн

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