здравствуйте! разбераюсь с таймерами. хочу сделать фазоимпульсное управление на симисторе. и не знаю как лучше это реализовать на STM32.
1) таймер буду сбрасывать при прерывании от детектора нуля через внешнее прерывание. вопрос есть ли аппаратная возможность сбросить счетчик таймера без программной прослойки?
2) если для включения симистора нужен импульс 20мкС то как его отработать таймером? на ум приходит только использование таймера в режиме ШИМ и при изменении задежки включения симистора пропорционально изменять два регистра
Код:
htim3.Init.Period = i; sConfigOC.Pulse = i+20;
если кто знает более изящное решение то предложите
Заголовок сообщения: Re: фазоимпульсное управление на таймерах STM32
Добавлено: Пн июл 04, 2016 11:30:13
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2694 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
Это можно сделать полностью аппаратно, на двух таймерах. Оба таймера настраиваете на однократную работу(типа режим одновибратора). Первый таймер запускается по изменению уровня на пине (детектор перехода через ноль). Досчитав до нужного числа (задержка времени), запускает второй таймер. Второй таймер считает до некого числа и сбрасывается. Пока второй таймер не равен нулю на выходном пине держится лог.1 (это тоже аппаратно все настраивается). Т.е. второй таймер задает ширину импульса на управляющий вывод симистора.
Будет все само работать, без затрат программных ресурсов.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Заголовок сообщения: Re: фазоимпульсное управление на таймерах STM32
Добавлено: Пн июл 04, 2016 11:51:30
Первый раз сказал Мяу!
Зарегистрирован: Чт май 05, 2011 15:35:36 Сообщений: 26
Рейтинг сообщения:0
Неоптимально на мой взгляд.
Существует прерывание пин-входа по смене состояния, вот его и надо юзать. Заводим на пин 100гц пусть даже далеко не "прямоугольник", а ограниченная всерху SIN. Тогда в районе перехода через ноль прерывание будет дважды срабатывать по некому уровню нас он собственно не интересует! Важно в момент сработки прерывания запоминать оба таймерные значения, тогда второе минус первое и делить на два, ЭТО ТОЧНОЕ ПОЗИЦИОНИРОВАНИЕ НОЛЯ! Если нужно суперточно и совсем без помех, то накапливаем таковые в буфере постоянно, а текущее полученное сравниваем со средним буферным значением, отбрасывая мусорные (допуск по времени подбираем экспериментально). Таким образом синхронизм обеспечен, а "ширину" импульса запуска и его "сдвиг" можно реализовать любым удобным тиком, хоть этого же самого таймера, особенно если он 16-ти разрядный.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Заголовок сообщения: Re: фазоимпульсное управление на таймерах STM32
Добавлено: Пн июл 04, 2016 12:14:07
Первый раз сказал Мяу!
Зарегистрирован: Чт май 05, 2011 15:35:36 Сообщений: 26
Рейтинг сообщения:0
Так все жеж просто, как само мяу! Поехали... 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) и переход таймерных значений через ноль - кумекаем математически самостоятельно.
дошло. Вы и не планировали средствами таймера отрабатывать импульс для включения симистора. ИМХО считаю что аппаратно реализовать это будет правильнее. меньше кода в листинге - проще в нем навигация. кроме того Вы ж не думаете что контроллер будет только симистором рулить? у него будет чем заняться кроме того чтоб 100 раз в секунду перерывать свою работу для симистора.
Заголовок сообщения: Re: фазоимпульсное управление на таймерах STM32
Добавлено: Пн июл 04, 2016 12:32:53
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2694 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
Таймер 2 задержка фазы, таймер 4 длина импульса Данный код проверен и работает. Частота ядра 72 МГц. Не требует никаких програмных ресурсов, кроме момента изменения мощности. Боюсь посчитать сколько времени потратил, чтобы разобраться и запустить такую схему, день то точно. Пользуйтесь.
Спойлер
Код:
TIM2->PSC=71700-1;//каждй импульс таймера 0,1 мс, но сделаем чуток быстрее, чтобы не налезло наследующую полуволну TIM2->CR1|=TIM_CR1_DIR;//считаем назад TIM2->CR1|=TIM_CR1_OPM;//режим одиночного импульса
TIM2->CNT=100; TIM2->ARR=100;//от скольки считать вниз
TIM2->CR1 |= TIM_CR1_CEN;//Запускаем счет таймера, видимо чтобы загрузить предделитель. а то с первого пуска как будето без него while (!(TIM2->SR & TIM_SR_UIF)); //ждем пока досчитает TIM2->SR&=~TIM_SR_UIF;//сброс флага о перезагрузке таймера
//Select the valid trigger input: write the TSbits to 101 in the TIMx_SMCR register //(TI1FP1 selected) TIM2->SMCR|=TIM_SMCR_TS_0 | TIM_SMCR_TS_2; //на слейв таймер идет сигнал TI1FP1 //Configure the slave mode controller in reset mode: write the SMS bits to 100 in the //TIMx_SMCR register. TIM2->SMCR|=TIM_SMCR_SMS_2|TIM_SMCR_SMS_1;// 110 запуск таймера без сброса
//Enable the captures: write the CC1E and CC2E bits to ‘1 in the TIMx_CCER register //TIM2->CCER |= TIM_CCER_CC1E;//Разрешен захват значения счетчика в регистр TIM2_CCR1 //TIM2->CCER |= TIM_CCER_CC2E;//Разрешен захват значения счетчика в регистр TIM2_CCR1
TIM2->CR2=TIM_CR2_MMS_1;//Формируем сигнал для подчиненного таймера при обновлении
//---------- //Настраиваем таймер4, он будет выдавать импульс определенной длины когда таймер 2 скажет
#define Timer4_ovl 60 // значение для перезагрузки таймера
TIM4->PSC=72-1;//предделитель один тик таймера 1 мкс TIM4->CR1|=TIM_CR1_DIR;//считаем назад TIM4->CR1|=TIM_CR1_OPM;//режим одиночного импульса
TIM4->CNT=Timer4_ovl; TIM4->ARR=Timer4_ovl;//от скольки считать вниз
TIM4->CR1 |= TIM_CR1_CEN;//Запускаем счет таймера, видимо чтобы загрузить предделитель. а то с первого пуска как будето без него while (!(TIM4->SR & TIM_SR_UIF)); //ждем пока досчитает TIM4->SR&=~TIM_SR_UIF;//сброс флага о перезагрузке таймера
TIM4->CCR1=Timer4_ovl-1; // регистр сравнения
TIM4->SMCR|=TIM_SMCR_TS_0 ; //на слейв таймер идет сигнал от таймера 2, то есть он его будет запускать TIM4->SMCR|=TIM_SMCR_SMS_2|TIM_SMCR_SMS_1;// 110 запуск таймера без сброса
TIM4->CCMR1|=TIM_CCMR1_OC1M_2 |TIM_CCMR1_OC1M_1; //Шим. Высокий уровень когда счетчик меньше регистра сравнения.
Заголовок сообщения: Re: фазоимпульсное управление на таймерах STM32
Добавлено: Вт июл 05, 2016 18:01:47
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2694 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
Может как-то можно. Я не придумал как. Это было мое первое знакомство с таймерами STM32, они сходу как-то не даются пониманию. Мой код то Вас не устроил, зря выковыривал из проекта?
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Мой код то Вас не устроил, зря выковыривал из проекта?
не могу запустить. пишу на EWARM + HAL для stm32f103 у него таймеры 2 и 4 на 36МГц шине. делители переправил но код все равно не запустился.
экспериментировал с таймером 2 если сделать чере прерывание то по входному сигналу вроди сбрасывается норм. как только деаю аппврвтный выход ничего не происодит. как отследить где ошибка хз.
Заголовок сообщения: Re: фазоимпульсное управление на таймерах STM32
Добавлено: Вт июл 05, 2016 18:21:00
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2694 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
RusikOk писал(а):
для stm32f103 у него таймеры 2 и 4 на 36МГц шине. делители переправил но код все равно не запустился.
У меня тот же самый контроллер.
Цитата:
не могу запустить
Что именно Вы имеете ввиду? _____________ По поводу двух таймером. По-моему я пришел к выводу, что нельзя один и тот же таймер подключить одновременно ко входу и к выходу. Только или или.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Заголовок сообщения: Re: фазоимпульсное управление на таймерах STM32
Добавлено: Вт июл 05, 2016 18:36:52
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2694 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
Вот я сейчас сижу и думаю как у меня оно работает ))). При том что по осциллографу было все хорошо и по факту тоже все хорошо. Сейчас буду пробовать изменять код. Скорее всего случайно пишется удачная младшая часть, вернее неудачная. Так бы заметил косяк. У меня заработало и я сразу забыл про эту часть кода.
На выход еще надо подключить альтернативную функцию.
Код:
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
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2694 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
Провел я внутреннее расследование у себя в голове, провел ряд эксперементов и вот что у меня получилось:
-с какого-то перепугу я взял частоту шины 72МГц. -вычислил что расчетный коэфф. деления должен был быть 7200 -при эксперименте увидел что ничего не получается, "добавил" нолик и все заработало. Решил что ошибся на порядок и на этом успокоился. Не обратив внимание что такое число никак не влазит в 16бит. По факту коэфф. деления был 6183
Если установить коэфф. 3600, вроде так получается надо при частоте 36МГц, То таймер работает в два раза быстрее расчетов. Почему, пока не догоняю и оставлю этот вопрос на завтра или когда будет время.
Теперь по поводу деления на 7200. С этим числом тоже не работает при малой мощности, ну это из-за времени запаздывания детектора нуля, по осциллу где-то 200-300 мкс. Убавляя коэфф. деления, опытным путем установил, что коэфф. деления нужен 6500. Установил 6400.
Ну и маленькое резюме 6183 очень близкое к 6400, и если не измерять разницу чем то, то никак этого не видно. Вот это самые гадские ошибки, которые на кой-то ляд работают как надо.
Почему ж таймер то так считает??? Надо будет подумать.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
решил пойти с конца. настроил через куб режим ШИМ все работает. только ставишь галку ван пульс мод все. на этом генерация прекращается. может правда этот куб глючный что просто ппц.
Заголовок сообщения: Re: фазоимпульсное управление на таймерах STM32
Добавлено: Ср июл 06, 2016 10:11:10
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2694 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
Сбили Вы меня, уважаемый RusikOk. Все нормально у меня в коде, ну за исключением лишнего нуля . Ладно не было времени разбираться, а то бы в какие-нибудь дебри залез. При чем здесь вообще частота шины и тактовая частота счетчика? Это разные вещи, он же не частоту шины считает.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Если установить коэфф. 3600, вроде так получается надо при частоте 36МГц, То таймер работает в два раза быстрее расчетов. Почему, пока не догоняю и оставлю этот вопрос на завтра или когда будет время. ....
Почему ж таймер то так считает??? Надо будет подумать.
дело в том, что максимальная допустимая частота тактирования шины APB1 36МГц. если стоит больше то производитель не гарантирует стабильную работу. а предделитель таймера у вас вроди не используется значит равен 1. я так понял
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 28
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения