реклама на сайте
подробности

 
 
> STM32f4 PWM проблема с первым импульсом
EmbedElektrik
сообщение Jul 8 2015, 05:57
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 121
Регистрация: 30-07-08
Из: Тверь, Россия
Пользователь №: 39 321



Задача получить серию импульсов строго заданной продолжительности и количества. Использую PWM. В приведенном коде я хочу получить два импульса по 10 мкс с паузой 40.
CODE

основной код
.................
tim_init();
TIM2->CNT=15;//предустановка счетчика в пределах низкой фазы
pulses_cnt=2;// количество импульсов
TIM_Cmd(TIM2,ENABLE); // запускаем счёт
}
//**************************************************************************
void TIM2_IRQHandler()
{
if(TIM_GetITStatus(TIM2, TIM_IT_CC3) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_CC3);
GPIO_ResetBits(GPIOE, GPIO_Pin_9);// сброс по COMPARE
pulses_cnt--;
if(pulses_cnt==0)TIM_Cmd(TIM2, DISABLE);
}
if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
GPIO_SetBits(GPIOE, GPIO_Pin_9); // фронт по UPDATE
}
}
//****************************************************************************

void tim_init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);

TIM_OCStructInit(&oc_init);
oc_init.TIM_OCMode = TIM_OCMode_PWM1; // работаем в режиме ШИМ ( PWM )
oc_init.TIM_OutputState = TIM_OutputState_Enable;
oc_init.TIM_Pulse = 10; //
oc_init.TIM_OCPolarity = TIM_OCPolarity_High; // положительная полярность
TIM_OC3Init(TIM2,&oc_init);
TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Disable);

TIM_TimeBaseStructInit(&base_timer);
base_timer.TIM_Prescaler = 84 - 1; // делитель частоты
base_timer.TIM_Period = 50-1; // период
base_timer.TIM_CounterMode = TIM_CounterMode_Up; // счёт вверх
TIM_TimeBaseInit(TIM2, &base_timer);
TIM_ITConfig(TIM2, TIM_IT_CC3 | TIM_IT_Update, ENABLE);
TIM_ARRPreloadConfig(TIM2,DISABLE);

TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
NVIC_EnableIRQ(TIM2_IRQn);
}

В итоге получаю следующую картинку.
Красный - мой вывод PWM, с двумя требуемыми импульсами, но перед ними влезает какой-то мелкий пик природу появления которого я не могу понять. Желтым цветом вывожу прерывания таймера - нарастающий фронт соответсвует событию таймера UPDATE, спадающий - COMPARE. Видно, что при первом прерывании update PWM как и требуется поднимается в 1, но почему-то тут же падает в 0 через странные 1.6 мкс и взводится опять через 35 мкс. После вывод PWM начинает работать как и планировалось. Теоретически можно отрубить первый мусорный импульс, но это костыль. Хотелось бы понять почему я в трех соснах заблудился.


Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
adnega
сообщение Jul 8 2015, 08:51
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



CODE

#define PULSE_ACT (10)
#define PULSE_INACT (40)
#define PULSE_NUM (2)

volatile int puls = 0;

//-----------------------------------------------------------------------------
// void TIM2_IRQHandler(void)
//-----------------------------------------------------------------------------
void TIM2_IRQHandler(void)
{
if(TIM2->SR & (1 << TIM_SR_UIF))
{
TIM2->SR = ~(1 << TIM_SR_UIF);
if(puls) puls--;
else
{
set_pin(LED_ACTIVE_PIN, 0);
TIM2->CR1 = 0;
}
}
}

//-----------------------------------------------------------------------------
// void ufunc_demo(void *p)
//-----------------------------------------------------------------------------
void ufunc_demo(void *p)
{
NVIC->ISER[0] = (1 << NVIC_ISER0_TIM2);

TIM2->PSC = FPLL / 2 / 1000000 - 1;
TIM2->ARR = PULSE_ACT + PULSE_INACT - 1;
TIM2->CCR1 = TIM2->ARR + 1 - PULSE_ACT;
TIM2->CCMR1 = (OC_MODE_PWM2 << TIM_CCMR1_OC1M);
TIM2->EGR = (1 << TIM_EGR_UG);
TIM2->CCER = (1 << TIM_CCER_CC1E);
TIM2->DIER = (1 << TIM_DIER_UIE);
TIM2->CNT = TIM2->CCR1;
puls = PULSE_NUM - 1;
TIM2->CR1 = (1 << TIM_CR1_CEN);

set_pin(LED_ACTIVE_PIN, 1);
}

Я библиотеками не пользуюсь. Управляю напрямую регистрами. Названия битов соответствуют номеру бита, а не маске.
TIM2_CH1 - красная линия
LED_ACTIVE_PIN - желтая линия

Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
EmbedElektrik
сообщение Jul 8 2015, 10:50
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 121
Регистрация: 30-07-08
Из: Тверь, Россия
Пользователь №: 39 321



Цитата(adnega @ Jul 8 2015, 11:51) *
Я библиотеками не пользуюсь. Управляю напрямую регистрами. Названия битов соответствуют номеру бита, а не маске.
TIM2_CH1 - красная линия
LED_ACTIVE_PIN - желтая линия


Спасибо, идея инверсии понятна. У меня заработало. Но непонятки с моей изначальной инициализацией остались sad.gif С управлением регистрами напрямую все равно этот импульс пролазит.
Go to the top of the page
 
+Quote Post
adnega
сообщение Jul 8 2015, 11:48
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(EmbedElektrik @ Jul 8 2015, 13:50) *
Но непонятки с моей изначальной инициализацией остались sad.gif

Я не особо понимаю, что там с первым импульсом, меня больше волнует окончание последовательности:
PWM1 примечателен тем, что в момент UPDATE он устанавливает пин в лог. 1, т.е. в конце последовательности вывод установится в лог. 1.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- EmbedElektrik   STM32f4 PWM проблема с первым импульсом   Jul 8 2015, 05:57
- - Golikov A.   Что-то как-то через одно место, если честно. Зачем...   Jul 8 2015, 06:53
|- - scifi   Цитата(Golikov A. @ Jul 8 2015, 09:53) За...   Jul 8 2015, 07:04
||- - adnega   Цитата(scifi @ Jul 8 2015, 10:04) Действи...   Jul 8 2015, 07:26
|- - EmbedElektrik   Цитата(Golikov A. @ Jul 8 2015, 09:53) Чт...   Jul 8 2015, 07:59
|- - Огурцов   1. остановили таймер 2. отключили буферизацию 3. з...   Jul 8 2015, 12:21
- - ArtDenis   EmbedElektrik, на самом деле всё очень просто. Рег...   Jul 9 2015, 03:55
|- - adnega   Цитата(ArtDenis @ Jul 9 2015, 06:55) Реги...   Jul 9 2015, 05:15
|- - ArtDenis   Цитата(adnega @ Jul 9 2015, 10:15) В сооб...   Jul 9 2015, 06:13
|- - adnega   Цитата(ArtDenis @ Jul 9 2015, 09:13) Личн...   Jul 9 2015, 08:24
|- - ArtDenis   Цитата(adnega @ Jul 9 2015, 13:24) Хоть н...   Jul 9 2015, 09:28
|- - adnega   Цитата(ArtDenis @ Jul 9 2015, 12:28) PPS:...   Jul 9 2015, 09:38
- - ArtDenis   adnega, как это есть рабочий код? Вот его последне...   Jul 9 2015, 09:40
- - Golikov A.   я так понял инвертировали ШИМ и все работает, а в ...   Jul 9 2015, 09:45
|- - adnega   Цитата(Golikov A. @ Jul 9 2015, 12:45) я ...   Jul 9 2015, 10:03
|- - Огурцов   а как вы формируете _пачку_, в каком регистре тот ...   Jul 9 2015, 12:34
|- - adnega   Цитата(Огурцов @ Jul 9 2015, 15:34) а как...   Jul 9 2015, 12:45
|- - Огурцов   я вам о том и говорю: формируете сами - чего ждёте...   Jul 9 2015, 13:23
|- - adnega   Цитата(Огурцов @ Jul 9 2015, 16:23) я вам...   Jul 9 2015, 16:33
|- - Огурцов   уверены, что заработает ? мега, например, страдала...   Jul 9 2015, 16:36
|- - adnega   Цитата(Огурцов @ Jul 9 2015, 19:36) увере...   Jul 9 2015, 16:41
|- - Огурцов   меня любая пауза не устраивает, мне нужно заданное...   Jul 9 2015, 18:29
- - EmbedElektrik   Вобщем господа я забил на эту проблему - тупо пере...   Jul 10 2015, 06:49
|- - ArtDenis   Цитата(EmbedElektrik @ Jul 10 2015, 11:49...   Jul 10 2015, 09:25
|- - EmbedElektrik   Цитата(ArtDenis @ Jul 10 2015, 12:25) Так...   Jul 10 2015, 10:14
- - Golikov A.   я так понимаю что именно как вы и победили. самый...   Jul 10 2015, 07:16


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 04:38
Рейтинг@Mail.ru


Страница сгенерированна за 0.01425 секунд с 7
ELECTRONIX ©2004-2016