Перейти к содержанию
    

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

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Изменено пользователем Огурцов

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

post-39321-1436510931_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я так понимаю что именно как вы и победили.

самый первый вывод ШИМ из-за буферных регистров всегда кривоватый ИМХО...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...