Jump to content

    

STM32f4 PWM проблема с первым импульсом

Recommended Posts

ArtDenis

adnega, как это есть рабочий код? Вот его последнее сообщение (жирным выделено мной):

Спасибо, идея инверсии понятна. У меня заработало. Но непонятки с моей изначальной инициализацией остались :( С управлением регистрами напрямую все равно этот импульс пролазит.

 

Share this post


Link to post
Share on other sites

Golikov

я так понял инвертировали ШИМ и все работает, а в старом варианте даже с прямым управлением регистрами пролазит импульс. Я так понимаю эти сообщения. Природа импульса как я понимаю в том что на время инициализации ШИМ как раз выдает 1, потом сбрасывается обновлением для принятия новых настроек, и работает штатно.

Share this post


Link to post
Share on other sites

adnega
я так понял инвертировали ШИМ и все работает, а в старом варианте даже с прямым управлением регистрами пролазит импульс. Я так понимаю эти сообщения.

Я тоже так понял.

 

Природа импульса как я понимаю в том что на время инициализации ШИМ как раз выдает 1, потом сбрасывается обновлением для принятия новых настроек, и работает штатно.

PWM1 устанавливается в единичку в момент update.

Если инициализация приводит к update, то на выходе будет единичка.

Меня больше волнует вопрос: кто сбрасывает вывод в ноль после формирования пачки импульсов? У меня получается стабильная единичка на выходе в конце.

Share this post


Link to post
Share on other sites

adnega
а как вы формируете _пачку_, в каком регистре тот счётчик ?

Я формирую пачку программно, счетчик в переменной и обрабатывается в прерывании таймера (update).

Можно сделать каскадное соединение таймеров, но для двух импульсов с приличной задержкой между ними - по-моему, перебор.

Share this post


Link to post
Share on other sites

VCucumber

я вам о том и говорю: формируете сами - чего ждёте от железа ?

если же второй таймер подключить, то там 146% начнёт работать как надо

у меня на это только один вопрос остался - обязательно ли первый таймер должен иметь вход брейк или можно как-то на внутренней коммутации или эвентах это замутить ?

 

Share this post


Link to post
Share on other sites

adnega
я вам о том и говорю: формируете сами - чего ждёте от железа ?

Я бы не торопился разделять железо и софт.

Нужно грамотно управлять и тем, и тем.

Вариантов решения много: самый простой аппаратный - вывод через SPI байта 01000010 с длительностью бита 10мкс.

Share this post


Link to post
Share on other sites

VCucumber

уверены, что заработает ? мега, например, страдала тем, что выводила дополнительную паузу между байтами, типа девятого бита

 

Share this post


Link to post
Share on other sites

adnega
уверены, что заработает ? мега, например, страдала тем, что выводила дополнительную паузу между байтами, типа девятого бита

Между байтами путь будет любая пауза. Битовый интервал формируется делителем и очень стабильно.

Share this post


Link to post
Share on other sites

VCucumber

меня любая пауза не устраивает, мне нужно заданное количество импульсов заданной частоты и заданной длительности

оне ведь даже регистр специальный для этого сделали

вот бы он ещё работал согласно своему названию

Edited by Огурцов

Share this post


Link to post
Share on other sites

EmbedElektrik

Вобщем господа я забил на эту проблему - тупо перевожу на время инициализации вывод в GPIO. Вобщем STM прекрасно выдает последовательность. На картинке серия из 6ти импульсов со скважностью 25 50 и 75% (попарно). Внизу импульсы гашения со второго канала таймера.

Если кто разберется как победить инициализацию - буду признателен.

post-39321-1436510931_thumb.png

Share this post


Link to post
Share on other sites

ArtDenis
Вобщем господа я забил на эту проблему - тупо перевожу на время инициализации вывод в GPIO

Так вам тут же написали - сразу после инициализации ШИМ выдаёт 1, поэтому импульс и вылазит до момента присвоения TIM2->CNT=15;

 

 

Можно вместо перевода в GPIO и TIM2->CNT=15 просто при инициализации задать длительность ШИМа в 0, а потом когда, он понадобится, выставить нужное значение.

Share this post


Link to post
Share on other sites

EmbedElektrik
Так вам тут же написали - сразу после инициализации ШИМ выдаёт 1, поэтому импульс и вылазит до момента присвоения TIM2->CNT=15;

 

 

Можно вместо перевода в GPIO и TIM2->CNT=15 просто при инициализации задать длительность ШИМа в 0, а потом когда, он понадобится, выставить нужное значение.

я уже сейчас не помню, потому что чего я только с таймером не делал, но при CNT=0 ширина первого импульса была больше чем должна быть. Вобщем, возможно позже вернусь к этому вопросу, а пока надо деньги зарабатывать :)

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.