К1921ВК01Т (арм Cortex-M4F)

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

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

Donor
Сообщения: 6
Зарегистрирован: 08 апр 2019, 18:59
Предприятие: АО "СИ-ЭЛ"
Откуда: Санкт-Петербург
Contact:

Re: К1921ВК01Т (арм Cortex-M4F)

Сообщение Donor » 11 июн 2021, 02:51

BogatovNA писал(а):
10 июн 2021, 12:44
судя по документации, порт общего ввода/вывода можно настроить на внешнее прерывание, но только на одно из событий (только на нарастающему, либо только по падающему фронту). Невозможно сконфигурировать ножку МК на прерывание сразу по обоим фронтам?
Невозможно, но вы можете в самом обработчике прерывания переключать вывод микроконтроллера на фронт или спад. В практике я такое использовал.

BogatovNA
Сообщения: 6
Зарегистрирован: 31 мар 2021, 16:23
Предприятие: ООО НПП ЭКРА

Re: К1921ВК01Т (арм Cortex-M4F)

Сообщение BogatovNA » 30 июн 2021, 12:20

Какая последовательность действий должна быть чтобы остановить ШИМ?
На данный момент я настроил ШИМ на определенную частоту. Мне необходимо в произвольный момент остановить генерацию ШИМ.
Я попробовал изменить регистр TBCTL в режиме дебага (Keil 5) поле CTRMODE: было 0(счет вверх), записал 3(остановка).
Генерация на выходе прекратилась, но таймер все равно считает, регистр TBCTR изменяется.
Пробовал изменить поле FREE/SOFT в регистре TBCTL на зачение 0 (остановка счета на следующем такте), но это тоже не помогает.
Может я что-то упускаю?

Аватара пользователя
Лашкевич
Сообщения: 268
Зарегистрирован: 13 май 2015, 13:10
Предприятие: ООО "НПФ Вектор"
Откуда: Москва
Contact:

Re: К1921ВК01Т (арм Cortex-M4F)

Сообщение Лашкевич » 30 июн 2021, 12:49

Остановить ШИМ или остановить таймер? Это разные задачи. Обычно в задачах преобразовательной техники таймер ШИМ никогда не останавливают, а отключают именно генерацию ШИМ. Вот два способа на выбор:
1. Через регистр AQCSFRC, задавая на выходе конкретные значения, соответствующие выключенным ключам. Тут надо внимательно проверить, как дальше работает и настроен блок мёртвого времени, чтобы противоположный ключ не оставался включенным.
2. Через модуль TZ, а именно сгенерировать "аппаратную аварию" программно, TZFRC_bit.OST = 1. Тогда модуль ШИМ перейдёт в безопасное состояние, такое, какое настроено в модуле TZ. Тут есть тонкость, как в ПО отличать настоящую аппаратную аварию от программной, если по TZ настроено прерывание. Надо лишние флажки вводить.
С уважением,
Лашкевич Максим.
Инженер-программист ООО "НПФ Вектор", Москва.
http://motorcontrol.ru/

BogatovNA
Сообщения: 6
Зарегистрирован: 31 мар 2021, 16:23
Предприятие: ООО НПП ЭКРА

Re: К1921ВК01Т (арм Cortex-M4F)

Сообщение BogatovNA » 01 июл 2021, 15:47

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

Код инициализации и прерывания прикладываю
| Показать

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

void PWM1_Init(void)
{	
    PWM_CTR_Init_TypeDef PWM_CTR_InitStruct;
    GPIO_Init_TypeDef GPIO_InitStruct;

    // Настраиваем пины
    GPIO_StructInit(&GPIO_InitStruct);
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AltFunc;
    GPIO_InitStruct.GPIO_AltFunc = GPIO_AltFunc_1;
    GPIO_InitStruct.GPIO_Out = GPIO_Out_En;
	
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3; //PWM_A1
    GPIO_Init(NT_GPIOG, &GPIO_InitStruct);
	
    // Настраиваем пины
    GPIO_StructInit(&GPIO_InitStruct);
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AltFunc;
    GPIO_InitStruct.GPIO_AltFunc = GPIO_AltFunc_3;
    GPIO_InitStruct.GPIO_Out = GPIO_Out_En;
	
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_11; //PWM_B1
    GPIO_Init(NT_GPIOA, &GPIO_InitStruct); 
	
    // Включаем тактирование и выводим из сброса	
    RCC_PeriphClkCmd(RCC_PeriphClk_PWM1, ENABLE);
    RCC_PeriphRstCmd(RCC_PeriphRst_PWM1, ENABLE);
	
    // Настраиваем таймер
    PWM_CTR_StructInit(&PWM_CTR_InitStruct);
    // Инверсия вывода каждый раз при равенстве таймера периоду
    PWM_CTR_InitStruct.PWM_ChAction_CTREqPeriod_A = PWM_ChAction_Inv;
    PWM_CTR_InitStruct.PWM_ChAction_CTREqPeriod_B = PWM_ChAction_Inv;
    PWM_CTR_InitStruct.PWM_CTR_Mode = PWM_CTR_Mode_Up;
    PWM_CTR_InitStruct.PWM_LoadMode_Period = PWM_LoadMode_Direct;
	
    // Тактовую частоту 24МГц делим на 1 чтобы получить TBCLK=24МГц
    PWM_CTR_InitStruct.PWM_ClkDiv = PWM_ClkDiv_1;
    PWM_CTR_InitStruct.PWM_ClkDivExtra = PWM_ClkDivExtra_1;
    // Период задаем 
    PWM_CTR_InitStruct.PWM_Period = 24000;
	
    PWM_CTR_Init(NT_PWM1, &PWM_CTR_InitStruct);
    PWM_PrescCmd(PWM_Presc_1, ENABLE);
	
   // Настраиваем прерывания 
   PWM_ITConfig(NT_PWM1, PWM_Event_CTREqPeriod, 0);
   PWM_ITCmd(NT_PWM1, ENABLE);     
	
   Энвик_EnableIRQ(PWM1_IRQn);  
}

void PWM1_IRQHandler (void)
{	
	if( PWM_ITStatus(NT_PWM1) == Flag_SET )
	{		
		PWM_ITStatusClear(NT_PWM1);
	}
	else 
	{
		errorInterrupt++;
	}
	
	enterInterrupt = DWT->CYCCNT;
	DWT->CYCCNT = 0;
}

Аватара пользователя
Disona
Сообщения: 65
Зарегистрирован: 06 дек 2016, 11:18
Предприятие: НПФ Вектор
Откуда: Москва
Contact:

Re: К1921ВК01Т (арм Cortex-M4F)

Сообщение Disona » 01 июл 2021, 16:02

BogatovNA писал(а):
01 июл 2021, 15:47
Т.е. таймер досчитал, инвертировал на выходе уровень ШИМ и зашел в прерывание. В прерывании я сбрасываю флаг,делаю какие-нибудь действия и выхожу из прерывания.
Вы в прерывании для сброса прерывания вызываете функцию "PWM_ITStatusClear".
Мне кажется, не хватает ещё одной функции - "PWM_ITPendClear".
Их нужно вызывать вместе. Не уверен, правда, какую сначала, а какую потом.
С уважением, Дмитрий Шпак
ООО "НПФ Вектор"

BogatovNA
Сообщения: 6
Зарегистрирован: 31 мар 2021, 16:23
Предприятие: ООО НПП ЭКРА

Re: К1921ВК01Т (арм Cortex-M4F)

Сообщение BogatovNA » 01 июл 2021, 16:07

Disona писал(а):
01 июл 2021, 16:02
BogatovNA писал(а):
01 июл 2021, 15:47
Т.е. таймер досчитал, инвертировал на выходе уровень ШИМ и зашел в прерывание. В прерывании я сбрасываю флаг,делаю какие-нибудь действия и выхожу из прерывания.
Вы в прерывании для сброса прерывания вызываете функцию "PWM_ITStatusClear".
Мне кажется, не хватает ещё одной функции - "PWM_ITPendClear".
Их нужно вызывать вместе. Не уверен, правда, какую сначала, а какую потом.
спасибо, помогло. Очередность похоже не имеет значения.

BogatovNA
Сообщения: 6
Зарегистрирован: 31 мар 2021, 16:23
Предприятие: ООО НПП ЭКРА

Re: К1921ВК01Т (арм Cortex-M4F)

Сообщение BogatovNA » 16 июл 2021, 15:24

судя по документации, при возникновении прерывания ШИМ по событию порога срабатывания (CMPA/CMPB), нет отдельных флагов для этих событий? Т.е. для всех событий ШИМ, которые вызвали прерывание один общий флаг? В таком случае, как корректно определять причину прерываний (CMPA или CMPB)? сравнивать с текущим значением таймера?

Аватара пользователя
Disona
Сообщения: 65
Зарегистрирован: 06 дек 2016, 11:18
Предприятие: НПФ Вектор
Откуда: Москва
Contact:

Re: К1921ВК01Т (арм Cortex-M4F)

Сообщение Disona » 16 июл 2021, 15:33

BogatovNA писал(а):
16 июл 2021, 15:24
судя по документации, при возникновении прерывания ШИМ по событию порога срабатывания (CMPA/CMPB), нет отдельных флагов для этих событий? Т.е. для всех событий ШИМ, которые вызвали прерывание один общий флаг? В таком случае, как корректно определять причину прерываний (CMPA или CMPB)? сравнивать с текущим значением таймера?
Видимо, да. Но только нужно быть уверенным, что между событием и прерыванием не вклинилось другое, более приоритетное прерывание.
Также можно смотреть на TBSTS.bit.CTRDIR, если вы знаете, что у вас события происходят при разных направлениях счёта.

Впрочем, лучше дождаться ответа от НИИЭТ на этот вопрос.
С уважением, Дмитрий Шпак
ООО "НПФ Вектор"

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

Re: К1921ВК01Т (арм Cortex-M4F)

Сообщение Al-x » 21 июл 2021, 15:36

BogatovNA писал(а):
16 июл 2021, 15:24
судя по документации, при возникновении прерывания ШИМ по событию порога срабатывания (CMPA/CMPB), нет отдельных флагов для этих событий? Т.е. для всех событий ШИМ, которые вызвали прерывание один общий флаг? В таком случае, как корректно определять причину прерываний (CMPA или CMPB)? сравнивать с текущим значением таймера?
А как вы настраиваете ШИМ, чтобы он по обоим совпадениям выходил в прерывание?

Я так понял, что в регистре ETSEL можно выбрать один из источников в поле INTSEL для PWM_INT. А PWM_SOCA/B относятся к АЦП.

Ответить

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

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

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