Easyelectronics.ru

Электроника для всех
Текущее время: 18 окт 2019, 06:32

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 22 ] 
Автор Сообщение
 Заголовок сообщения: Провалы при изменении частоты ШИМ
СообщениеДобавлено: 05 апр 2019, 14:42 
Заглядывает иногда

Зарегистрирован: 11 мар 2018, 01:03
Сообщения: 44
МК stm32f103c8t6

МК генерирует импульсы на ноге PA6. Задача менять частоту импульсов в зависимости от переменной sp.

Код работает. Но: при переходе на новое значение SP, чаще при переходе 100 -> 80 импульсы на выходе пропадают. И через ~2 секунды возобновляются уже на новой частоте.

SP меняется не постоянно, а 1 раз в 50 мсек +\-

Почему так происходит?

Код писан давно и на SPL...

Код:
while(1){
    TIM3->ARR = 20000 / sp;
}

void timer_Init(void){
   RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
   RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
   RCC->APB1ENR |= RCC_APB2ENR_AFIOEN;
   GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
   GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_6;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(GPIOA, &GPIO_InitStructure);
   TIM_BaseInitStructure.TIM_Prescaler = 1600-1;
   TIM_BaseInitStructure.TIM_Period    = 0;
   TIM_BaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
   TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
   TIM_TimeBaseInit(TIM3, &TIM_BaseInitStructure);
   
   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
   TIM_OCInitStructure.TIM_Pulse = 1000;
   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
   TIM_OC1Init(TIM3, &TIM_OCInitStructure);

   TIM_Cmd(TIM3, ENABLE);
   TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
}


Последний раз редактировалось Neuss 05 апр 2019, 15:17, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Провалы при изменении частоты ШИМ
СообщениеДобавлено: 05 апр 2019, 14:51 
Старожил

Зарегистрирован: 06 июн 2018, 22:30
Сообщения: 416
Откуда: Киев
Что-то мне подсказывает что это плохая идея
Код:
while(1){
    TIM3->ARR = 20000 / sp;
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Провалы при изменении частоты ШИМ
СообщениеДобавлено: 05 апр 2019, 14:56 
Заглядывает иногда

Зарегистрирован: 11 мар 2018, 01:03
Сообщения: 44
MasterElectric писал(а):
Что-то мне подсказывает что это плохая идея
Код:
while(1){
    TIM3->ARR = 20000 / sp;
}


Как тогда сделать частоту изменяемой?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Провалы при изменении частоты ШИМ
СообщениеДобавлено: 05 апр 2019, 14:59 
Старожил

Зарегистрирован: 06 июн 2018, 22:30
Сообщения: 416
Откуда: Киев
Код:
TIM3->ARR = 20000 / sp;

туда где меняеться sp. Зачем в цикле непрырывно записывать регистр.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Провалы при изменении частоты ШИМ
СообщениеДобавлено: 05 апр 2019, 15:02 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2865
Или хотя бы включить буферизацию ARR регистра, чтобы он перезаписывался только при новом цикле таймера.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Провалы при изменении частоты ШИМ
СообщениеДобавлено: 05 апр 2019, 15:20 
Заглядывает иногда

Зарегистрирован: 11 мар 2018, 01:03
Сообщения: 44
Hold писал(а):
Или хотя бы включить буферизацию ARR регистра, чтобы он перезаписывался только при новом цикле таймера.

TIM3->CR1 |= TIM_CR1_ARPE;

оно?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Провалы при изменении частоты ШИМ
СообщениеДобавлено: 05 апр 2019, 15:38 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1016
Neuss писал(а):
оно?

Да. Таймер считает до ARR, но там проверка на равенство, если ARR проскочит, что периодически происходит когда его значение уменьшается, тогда таймер будет считать до самого конца, что может занимать довольно много времени.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Провалы при изменении частоты ШИМ
СообщениеДобавлено: 05 апр 2019, 16:27 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 6217
"TIM3->ARR = 20000 / sp;"
Забавно.
Что будет, когда sp станет больше 20000?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Провалы при изменении частоты ШИМ
СообщениеДобавлено: 05 апр 2019, 17:04 
Заглядывает иногда

Зарегистрирован: 11 мар 2018, 01:03
Сообщения: 44
u37 писал(а):
"TIM3->ARR = 20000 / sp;"
Забавно.
Что будет, когда sp станет больше 20000?

Этого никогда не будет из условий программы


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Провалы при изменении частоты ШИМ
СообщениеДобавлено: 05 апр 2019, 17:16 
Старожил
Аватара пользователя

Зарегистрирован: 14 июн 2015, 17:41
Сообщения: 2619
Откуда: Русь, Новороссийск
Всё равно делают проверку на полное исключение события.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Провалы при изменении частоты ШИМ
СообщениеДобавлено: 05 апр 2019, 18:25 
Старожил

Зарегистрирован: 13 июл 2016, 11:05
Сообщения: 417
Neuss писал(а):
u37 писал(а):
"TIM3->ARR = 20000 / sp;"
Забавно.
Что будет, когда sp станет больше 20000?

Этого никогда не будет из условий программы



:-)))
Сколько раз у себя ловил такие штуки. На разных МК.
"Ну эта переменная никогда не сможет принять это значение!!! Зуб даю!!!" (это я так думал).
А она меня не спрашивала...
Потому всё же стараюсь такие фатальные ситуации проверять.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Провалы при изменении частоты ШИМ
СообщениеДобавлено: 17 апр 2019, 16:23 
Заглядывает иногда

Зарегистрирован: 11 мар 2018, 01:03
Сообщения: 44
Попробовал... Да, в отладке все заработало. Теперь таймер не останавливается при изменении ARR.
НО! Он не запускается сам при запуске контроллера...
Но, если в отладке зайти в регистры TIM3 и вручную сбросить флаг ARPE, сразу стартует счетчик CNT и появляется ШИМ на выходе. Если влаг ARPE снова вернуть, то и провалов нет.

Пробовал дергать программно ARPE - не дает результата...
Код ниже:

Код:
uint16_t var = 0;
uint16_t timARR = 0;
uint16_t timCCR1 = 0;

int main(void)
{
   timer_Init();
   while(1){
      timARR = 20000 / var;
      timCCR1 = timARR / 2;
      TIM3->CNT = 0;
      TIM3->ARR = timARR;
      TIM3->CCR1 = timCCR1;
      delay_ms(50);
   }
}


void timer_Init(void){
   RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
   RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
   RCC->APB1ENR |= RCC_APB2ENR_AFIOEN;
   GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
   GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_6;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(GPIOA, &GPIO_InitStructure);

   TIM_BaseInitStructure.TIM_Prescaler = 1600-1;
   TIM_BaseInitStructure.TIM_Period    = 403;
   TIM_BaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
   TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
   TIM_TimeBaseInit(TIM3, &TIM_BaseInitStructure);
   
   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
   TIM_OCInitStructure.TIM_Pulse = 202;
   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
   TIM_OC1Init(TIM3, &TIM_OCInitStructure);
   TIM3->CR1 |= TIM_CR1_ARPE;
   TIM_Cmd(TIM3, ENABLE);
   TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Провалы при изменении частоты ШИМ
СообщениеДобавлено: 17 апр 2019, 16:37 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1016
На 0 то зачем делить?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Провалы при изменении частоты ШИМ
СообщениеДобавлено: 17 апр 2019, 16:41 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 3999
Откуда: КЧР, поселок Нижний Архыз
Ну так понятное дело: ты выставил флаг ARPE, но не сгенерировал событие UEV, чтобы искусственно содержимое ARR обновить!
Просто сгенерь это событие!
И таки проверяй, что ты в ARR пихаешь!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Провалы при изменении частоты ШИМ
СообщениеДобавлено: 17 апр 2019, 19:12 
Заглядывает иногда

Зарегистрирован: 11 мар 2018, 01:03
Сообщения: 44
Reflector писал(а):
На 0 то зачем делить?

Прошу прощения, код здесь не полный.
var обновляется в другом месте. Он не ноль.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Провалы при изменении частоты ШИМ
СообщениеДобавлено: 17 апр 2019, 19:17 
Заглядывает иногда

Зарегистрирован: 11 мар 2018, 01:03
Сообщения: 44
Eddy_Em писал(а):
Ну так понятное дело: ты выставил флаг ARPE, но не сгенерировал событие UEV, чтобы искусственно содержимое ARR обновить!
Просто сгенерь это событие!
И таки проверяй, что ты в ARR пихаешь!


А разве UEV не генерится автоматически когда CNT досчитал до предыдущего ARR?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Провалы при изменении частоты ШИМ
СообщениеДобавлено: 17 апр 2019, 19:33 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 3999
Откуда: КЧР, поселок Нижний Архыз
Ну а как он досчитает, если ARPE выставлен, и в ARR лежит нуль (т.е. таймер не работает)?
Либо сначала без ARPE выставить значение ARR, все запустить, а потом установить ARPE.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Провалы при изменении частоты ШИМ
СообщениеДобавлено: 17 апр 2019, 19:44 
Заглядывает иногда

Зарегистрирован: 11 мар 2018, 01:03
Сообщения: 44
Eddy_Em писал(а):
Ну а как он досчитает, если ARPE выставлен, и в ARR лежит нуль (т.е. таймер не работает)?
Либо сначала без ARPE выставить значение ARR, все запустить, а потом установить ARPE.

Спасибо! Так понятнее) Буду испытывать)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Провалы при изменении частоты ШИМ
СообщениеДобавлено: 18 апр 2019, 11:02 
Заглядывает иногда

Зарегистрирован: 11 мар 2018, 01:03
Сообщения: 44
Код:
TIM3->ARR = timARR;
TIM3->CCR1 = timARR / 2;   
TIM3->EGR |= TIM_EGR_UG;


Действительно, так заработало. Спасибо!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Провалы при изменении частоты ШИМ
СообщениеДобавлено: 20 апр 2019, 00:07 
Только пришел

Зарегистрирован: 11 апр 2019, 01:57
Сообщения: 23
У меня почти аналогичная ситуация, но наоборот.
При увеличении TIM1->CCR1, TIM1->CCR2, в некотором диапазоне ближе к значению TIM1->ARR (70-80%), скважность PWM уменьшается (осцилограф подтвердил это). После она снова стабилизируется.
Остальные каналы этого таймера работают как нужно.

Инициализация:
Код:
/*TIM1 initialization and start*/

   TIM1->PSC = 0; //Prescaler
   TIM1->ARR = PWM_PERIOD; //PWM period

   /*Initial PWM duty cycle*/
   TIM1->CCR1 = uw_PWMTargetWidth;
   TIM1->CCR2 = uw_PWMTargetWidth;
   TIM1->CCR3 = uw_PWMTargetWidth;
   TIM1->CCR4 = uw_PWMTargetWidth;

   /* Enable all channels, positive polarity */
   TIM1->CCER = TIM_CCER_CC4E | TIM_CCER_CC3E | TIM_CCER_CC2E | TIM_CCER_CC1E;

   /* Have no idea */
   TIM1->BDTR |= TIM_BDTR_MOE;

   TIM1->CCMR2 = TIM_CCMR2_OC4M_2 | TIM_CCMR2_OC4M_1 | TIM_CCMR2_OC3M_2
         | TIM_CCMR2_OC3M_1;
   TIM1->CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC2M_2
         | TIM_CCMR1_OC2M_1;

   /*Count Forward*/
   TIM1->CR1 &= ~TIM_CR1_DIR;

   /*Front, Fast PWM*/
   TIM1->CR1 &= ~TIM_CR1_CMS;

   /*Start timer*/
   TIM1->CR1 |= TIM_CR1_CEN;

   /*TIM1 initialization and start*/


Установка:
Код:
void SetPWMPulseWidth(uint32_t width) {

   TIM1->CCR1 = width;
   TIM1->CCR2 = width;
   TIM1->CCR3 = width;
   TIM1->CCR4 = width;
   TIM3->CCR1 = width;
   TIM3->CCR3 = width;
}


Тестирую:
Код:

for (uint16_t i = 0; i <= PWM_PERIOD; i ++) {
    SetPWMPulseWidth(i);
Delay(1);//ms delay
};


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Провалы при изменении частоты ШИМ
СообщениеДобавлено: 20 апр 2019, 00:14 
Только пришел

Зарегистрирован: 11 апр 2019, 01:57
Сообщения: 23
Да. При использовании HAL аналогичная ситуация.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Провалы при изменении частоты ШИМ
СообщениеДобавлено: 20 апр 2019, 04:07 
Заглядывает иногда

Зарегистрирован: 03 фев 2019, 06:33
Сообщения: 45
А как же бурст DMA http://mcu.goodboard.ru/viewtopic.php?id=31


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 22 ] 

Часовой пояс: UTC + 5 часов


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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB