|
STM32f4 PWM проблема с первым импульсом |
|
|
|
Jul 8 2015, 05:57
|

Частый гость
 
Группа: Свой
Сообщений: 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 начинает работать как и планировалось. Теоретически можно отрубить первый мусорный импульс, но это костыль. Хотелось бы понять почему я в трех соснах заблудился.
Эскизы прикрепленных изображений
|
|
|
|
|
 |
Ответов
|
Jul 9 2015, 10:03
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(Golikov A. @ Jul 9 2015, 12:45)  я так понял инвертировали ШИМ и все работает, а в старом варианте даже с прямым управлением регистрами пролазит импульс. Я так понимаю эти сообщения. Я тоже так понял. Цитата(Golikov A. @ Jul 9 2015, 12:45)  Природа импульса как я понимаю в том что на время инициализации ШИМ как раз выдает 1, потом сбрасывается обновлением для принятия новых настроек, и работает штатно. PWM1 устанавливается в единичку в момент update. Если инициализация приводит к update, то на выходе будет единичка. Меня больше волнует вопрос: кто сбрасывает вывод в ноль после формирования пачки импульсов? У меня получается стабильная единичка на выходе в конце.
|
|
|
|
Сообщений в этой теме
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 adnega CODE
#define PULSE_ACT (10)
#define PULSE_INACT (4... Jul 8 2015, 08:51 EmbedElektrik Цитата(adnega @ Jul 8 2015, 11:51) Я библ... Jul 8 2015, 10:50  adnega Цитата(EmbedElektrik @ Jul 8 2015, 13:50)... Jul 8 2015, 11:48   Огурцов 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       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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|