Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

фазоимпульсное управление на таймерах STM32

Пн июл 04, 2016 11:16:15

здравствуйте! разбераюсь с таймерами. хочу сделать фазоимпульсное управление на симисторе. и не знаю как лучше это реализовать на STM32.

1) таймер буду сбрасывать при прерывании от детектора нуля через внешнее прерывание. вопрос есть ли аппаратная возможность сбросить счетчик таймера без программной прослойки?

2) если для включения симистора нужен импульс 20мкС то как его отработать таймером? на ум приходит только использование таймера в режиме ШИМ и при изменении задежки включения симистора пропорционально изменять два регистра
Код:
htim3.Init.Period = i;
sConfigOC.Pulse = i+20;


если кто знает более изящное решение то предложите

Re: фазоимпульсное управление на таймерах STM32

Пн июл 04, 2016 11:30:13

Это можно сделать полностью аппаратно, на двух таймерах. Оба таймера настраиваете на однократную работу(типа режим одновибратора). Первый таймер запускается по изменению уровня на пине (детектор перехода через ноль). Досчитав до нужного числа (задержка времени), запускает второй таймер. Второй таймер считает до некого числа и сбрасывается. Пока второй таймер не равен нулю на выходном пине держится лог.1 (это тоже аппаратно все настраивается). Т.е. второй таймер задает ширину импульса на управляющий вывод симистора.

Будет все само работать, без затрат программных ресурсов.

Re: фазоимпульсное управление на таймерах STM32

Пн июл 04, 2016 11:51:30

Неоптимально на мой взгляд.

Существует прерывание пин-входа по смене состояния, вот его и надо юзать.
Заводим на пин 100гц пусть даже далеко не "прямоугольник", а ограниченная всерху SIN.
Тогда в районе перехода через ноль прерывание будет дважды срабатывать по некому уровню нас он собственно не интересует!
Важно в момент сработки прерывания запоминать оба таймерные значения, тогда второе минус первое и делить на два, ЭТО ТОЧНОЕ ПОЗИЦИОНИРОВАНИЕ НОЛЯ!
Если нужно суперточно и совсем без помех, то накапливаем таковые в буфере постоянно, а текущее полученное сравниваем со средним буферным значением, отбрасывая мусорные (допуск по времени подбираем экспериментально).
Таким образом синхронизм обеспечен, а "ширину" импульса запуска и его "сдвиг" можно реализовать любым удобным тиком, хоть этого же самого таймера, особенно если он 16-ти разрядный.

Re: фазоимпульсное управление на таймерах STM32

Пн июл 04, 2016 11:52:27

Z_h_e писал(а):Это можно сделать полностью аппаратно
красивое решение а пример кода можно. или хотябы примеры настройки таймеров в таком режиме

Re: фазоимпульсное управление на таймерах STM32

Пн июл 04, 2016 11:57:24

vastani писал(а):можно реализовать любым удобным тиком, хоть этого же самого таймера
так как же конкретно? пример есть? или описание

Re: фазоимпульсное управление на таймерах STM32

Пн июл 04, 2016 12:14:07

Так все жеж просто, как само мяу! :)))
Поехали...
1. Пусть у нас есть некий 16-ти битный таймер работающий на приращение, а по 100гц имеем по прерыванию пина следующие
таймерные 16-ти битные значения:
160012, 160038, 880012, 880038, .....

2. тогда (160038 + 160012) / 2 - момент времени перехода через ноль номер РАЗ,
а (880038 + 880012) / 2 - это момент времени перехода через ноль номер ДВА
поскольку 100гц это период 10мс, то в нашем случае это будет в тиках таймера измеряться,
как значение ДВА минус значение РАЗ :))

3. Тики таймера выбираем в зависимости от требуемой точности и тактовой и даташит...... короче по ходу проектирования.
3.1. по сути тактовая для таймера дает расценку в ЕГО тиках эквивалент, чтобы понять такое 10мс для контроллера
3.2 значение "ДВА" - это всегда наше текущее от которого фазу (задержку) рулим для семистора

Надеюсь доступно изложил.
Вычислительных ресурсов то тут нифига не юзается по сути, примитивная вычислялка...
P.S.
то что (880012 - 160038) значительно больше чем (160038 - 160012) и переход таймерных значений через ноль - кумекаем математически самостоятельно.

Re: фазоимпульсное управление на таймерах STM32

Пн июл 04, 2016 12:32:53

vastani писал(а):Так все жеж просто, как само мяу! :)))
дошло. Вы и не планировали средствами таймера отрабатывать импульс для включения симистора. ИМХО считаю что аппаратно реализовать это будет правильнее. меньше кода в листинге - проще в нем навигация. кроме того Вы ж не думаете что контроллер будет только симистором рулить? у него будет чем заняться кроме того чтоб 100 раз в секунду перерывать свою работу для симистора.

Re: фазоимпульсное управление на таймерах STM32

Пн июл 04, 2016 12:32:53

Таймер 2 задержка фазы, таймер 4 длина импульса
Данный код проверен и работает. Частота ядра 72 МГц.
Не требует никаких програмных ресурсов, кроме момента изменения мощности. Боюсь посчитать сколько времени потратил, чтобы разобраться и запустить такую схему, день то точно. Пользуйтесь.

Re: фазоимпульсное управление на таймерах STM32

Вт июл 05, 2016 17:52:19

Z_h_e писал(а):Таймер 2 задержка фазы, таймер 4 длина импульса
а почему нельзя использовать один таймер

Re: фазоимпульсное управление на таймерах STM32

Вт июл 05, 2016 18:01:47

Может как-то можно. Я не придумал как. Это было мое первое знакомство с таймерами STM32, они сходу как-то не даются пониманию. Мой код то Вас не устроил, зря выковыривал из проекта?

Re: фазоимпульсное управление на таймерах STM32

Вт июл 05, 2016 18:12:58

Z_h_e писал(а):Это было мое первое знакомство с таймерами STM32
аналогично
Z_h_e писал(а):они сходу как-то не даются пониманию
согасен на все 100%
Z_h_e писал(а):Мой код то Вас не устроил, зря выковыривал из проекта?
не могу запустить. пишу на EWARM + HAL для stm32f103 у него таймеры 2 и 4 на 36МГц шине. делители переправил но код все равно не запустился.

экспериментировал с таймером 2 если сделать чере прерывание то по входному сигналу вроди сбрасывается норм. как только деаю аппврвтный выход ничего не происодит. как отследить где ошибка хз.

тут вот написано, что возможность иеется но как запустить я пока не вкурил http://www.gaw.ru/html.cgi/txt/doc/micr ... _4_1_7.htm

Re: фазоимпульсное управление на таймерах STM32

Вт июл 05, 2016 18:21:00

RusikOk писал(а):для stm32f103 у него таймеры 2 и 4 на 36МГц шине. делители переправил но код все равно не запустился.
У меня тот же самый контроллер.
не могу запустить
Что именно Вы имеете ввиду?
_____________
По поводу двух таймером. По-моему я пришел к выводу, что нельзя один и тот же таймер подключить одновременно ко входу и к выходу. Только или или.

Re: фазоимпульсное управление на таймерах STM32

Вт июл 05, 2016 18:28:53

тогда как вы можете записывать ему предделитель
TIM2->PSC=71700-1;
если таймер 1 разрядный и максимум у него 65000 (примерно)

в вашем примере на вход импульсы подаю на выходе ничего не наблюдаю

Re: фазоимпульсное управление на таймерах STM32

Вт июл 05, 2016 18:36:52

Вот я сейчас сижу и думаю как у меня оно работает ))). При том что по осциллографу было все хорошо и по факту тоже все хорошо. Сейчас буду пробовать изменять код. Скорее всего случайно пишется удачная младшая часть, вернее неудачная. Так бы заметил косяк. У меня заработало и я сразу забыл про эту часть кода.

На выход еще надо подключить альтернативную функцию.
Код:
     GPIO_InitStructure.GPIO_Pin =GPIO_Pin_6;    //Порт B8 выход на симистор
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP ;// альтернативная функция
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
     GPIO_Init( GPIOB , &GPIO_InitStructure);

Re: фазоимпульсное управление на таймерах STM32

Вт июл 05, 2016 20:31:06

Провел я внутреннее расследование у себя в голове, провел ряд эксперементов и вот что у меня получилось:

-с какого-то перепугу я взял частоту шины 72МГц.
-вычислил что расчетный коэфф. деления должен был быть 7200
-при эксперименте увидел что ничего не получается, "добавил" нолик и все заработало. Решил что ошибся на порядок и на этом успокоился. Не обратив внимание что такое число никак не влазит в 16бит. По факту коэфф. деления был 6183

Если установить коэфф. 3600, вроде так получается надо при частоте 36МГц, То таймер работает в два раза быстрее расчетов. Почему, пока не догоняю и оставлю этот вопрос на завтра или когда будет время.

Теперь по поводу деления на 7200. С этим числом тоже не работает при малой мощности, ну это из-за времени запаздывания детектора нуля, по осциллу где-то 200-300 мкс. Убавляя коэфф. деления, опытным путем установил, что коэфф. деления нужен 6500. Установил 6400.

Ну и маленькое резюме 6183 очень близкое к 6400, и если не измерять разницу чем то, то никак этого не видно. Вот это самые гадские ошибки, которые на кой-то ляд работают как надо.

Почему ж таймер то так считает??? Надо будет подумать.

Re: фазоимпульсное управление на таймерах STM32

Ср июл 06, 2016 03:44:20

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

Re: фазоимпульсное управление на таймерах STM32

Ср июл 06, 2016 07:38:54

RusikOk писал(а):только ставишь галку ван пульс мод все
Ну таймер то надо чем то запускать. У меня запускается сигналом с нуль детектора.

Вот читаю читаю. Пока не догоняю почему частота не бьется с расчетной. Наверное сейчас попробую экскременты эксперементы ставить.

Re: фазоимпульсное управление на таймерах STM32

Ср июл 06, 2016 10:11:10

Сбили Вы меня, уважаемый RusikOk. Все нормально у меня в коде, ну за исключением лишнего нуля . Ладно не было времени разбираться, а то бы в какие-нибудь дебри залез. При чем здесь вообще частота шины и тактовая частота счетчика? Это разные вещи, он же не частоту шины считает.

Re: фазоимпульсное управление на таймерах STM32

Ср июл 06, 2016 10:36:51

Z_h_e писал(а):
Если установить коэфф. 3600, вроде так получается надо при частоте 36МГц, То таймер работает в два раза быстрее расчетов. Почему, пока не догоняю и оставлю этот вопрос на завтра или когда будет время.
....

Почему ж таймер то так считает??? Надо будет подумать.


Надо не только думать но и читать уметь...

Изображение

Re: фазоимпульсное управление на таймерах STM32

Ср июл 06, 2016 11:13:37

дело в том, что максимальная допустимая частота тактирования шины APB1 36МГц. если стоит больше то производитель не гарантирует стабильную работу. а предделитель таймера у вас вроди не используется значит равен 1. я так понял
Ответить