| Форум РадиоКот https://radiokot.ru/forum/ |
|
| фазоимпульсное управление на таймерах STM32 https://radiokot.ru/forum/viewtopic.php?f=59&t=133128 |
Страница 1 из 4 |
| Автор: | RusikOk [ Пн июл 04, 2016 11:16:15 ] |
| Заголовок сообщения: | фазоимпульсное управление на таймерах STM32 |
здравствуйте! разбераюсь с таймерами. хочу сделать фазоимпульсное управление на симисторе. и не знаю как лучше это реализовать на STM32. 1) таймер буду сбрасывать при прерывании от детектора нуля через внешнее прерывание. вопрос есть ли аппаратная возможность сбросить счетчик таймера без программной прослойки? 2) если для включения симистора нужен импульс 20мкС то как его отработать таймером? на ум приходит только использование таймера в режиме ШИМ и при изменении задежки включения симистора пропорционально изменять два регистра Код: htim3.Init.Period = i; sConfigOC.Pulse = i+20; если кто знает более изящное решение то предложите |
|
| Автор: | Z_h_e [ Пн июл 04, 2016 11:30:13 ] |
| Заголовок сообщения: | Re: фазоимпульсное управление на таймерах STM32 |
Это можно сделать полностью аппаратно, на двух таймерах. Оба таймера настраиваете на однократную работу(типа режим одновибратора). Первый таймер запускается по изменению уровня на пине (детектор перехода через ноль). Досчитав до нужного числа (задержка времени), запускает второй таймер. Второй таймер считает до некого числа и сбрасывается. Пока второй таймер не равен нулю на выходном пине держится лог.1 (это тоже аппаратно все настраивается). Т.е. второй таймер задает ширину импульса на управляющий вывод симистора. Будет все само работать, без затрат программных ресурсов. |
|
| Автор: | vastani [ Пн июл 04, 2016 11:51:30 ] |
| Заголовок сообщения: | Re: фазоимпульсное управление на таймерах STM32 |
Неоптимально на мой взгляд. Существует прерывание пин-входа по смене состояния, вот его и надо юзать. Заводим на пин 100гц пусть даже далеко не "прямоугольник", а ограниченная всерху SIN. Тогда в районе перехода через ноль прерывание будет дважды срабатывать по некому уровню нас он собственно не интересует! Важно в момент сработки прерывания запоминать оба таймерные значения, тогда второе минус первое и делить на два, ЭТО ТОЧНОЕ ПОЗИЦИОНИРОВАНИЕ НОЛЯ! Если нужно суперточно и совсем без помех, то накапливаем таковые в буфере постоянно, а текущее полученное сравниваем со средним буферным значением, отбрасывая мусорные (допуск по времени подбираем экспериментально). Таким образом синхронизм обеспечен, а "ширину" импульса запуска и его "сдвиг" можно реализовать любым удобным тиком, хоть этого же самого таймера, особенно если он 16-ти разрядный. |
|
| Автор: | RusikOk [ Пн июл 04, 2016 11:52:27 ] |
| Заголовок сообщения: | Re: фазоимпульсное управление на таймерах STM32 |
Z_h_e писал(а): Это можно сделать полностью аппаратно красивое решение а пример кода можно. или хотябы примеры настройки таймеров в таком режиме
|
|
| Автор: | RusikOk [ Пн июл 04, 2016 11:57:24 ] |
| Заголовок сообщения: | Re: фазоимпульсное управление на таймерах STM32 |
vastani писал(а): можно реализовать любым удобным тиком, хоть этого же самого таймера так как же конкретно? пример есть? или описание
|
|
| Автор: | vastani [ Пн июл 04, 2016 12:14:07 ] |
| Заголовок сообщения: | Re: фазоимпульсное управление на таймерах STM32 |
Так все жеж просто, как само мяу! Поехали... 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) и переход таймерных значений через ноль - кумекаем математически самостоятельно. |
|
| Автор: | RusikOk [ Пн июл 04, 2016 12:32:53 ] |
| Заголовок сообщения: | Re: фазоимпульсное управление на таймерах STM32 |
vastani писал(а): Так все жеж просто, как само мяу! дошло. Вы и не планировали средствами таймера отрабатывать импульс для включения симистора. ИМХО считаю что аппаратно реализовать это будет правильнее. меньше кода в листинге - проще в нем навигация. кроме того Вы ж не думаете что контроллер будет только симистором рулить? у него будет чем заняться кроме того чтоб 100 раз в секунду перерывать свою работу для симистора.
|
|
| Автор: | Z_h_e [ Пн июл 04, 2016 12:32:53 ] |
| Заголовок сообщения: | Re: фазоимпульсное управление на таймерах STM32 |
Таймер 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;//сброс флага о перезагрузке таймера TIM2->CCMR1 |= TIM_CCMR1_CC1S_0;//Выбор активного входа. Записываем "01" в биты CC1S - связываем регистр TIM2_CCR1 со входом TI1 TIM2->CCMR1 |= (TIM_CCMR1_IC1F_0 | TIM_CCMR1_IC1F_1);//Выбор длительнотси действия фильтра - 8 тактов. IC1F = 0011. TIM2->CCER |= TIM_CCER_CC1P;//По спаду //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; //Шим. Высокий уровень когда счетчик меньше регистра сравнения. TIM4->CCER |= TIM_CCER_CC1E;// | TIM_CCER_CC1P;//Разрешаем сравнение //TIM4->CR1 |= TIM_CR1_CEN;//Запускаем счет таймера, #undef Timer3_ovl |
|
| Автор: | RusikOk [ Вт июл 05, 2016 17:52:19 ] |
| Заголовок сообщения: | Re: фазоимпульсное управление на таймерах STM32 |
Z_h_e писал(а): Таймер 2 задержка фазы, таймер 4 длина импульса а почему нельзя использовать один таймер
|
|
| Автор: | Z_h_e [ Вт июл 05, 2016 18:01:47 ] |
| Заголовок сообщения: | Re: фазоимпульсное управление на таймерах STM32 |
Может как-то можно. Я не придумал как. Это было мое первое знакомство с таймерами STM32, они сходу как-то не даются пониманию. Мой код то Вас не устроил, зря выковыривал из проекта? |
|
| Автор: | RusikOk [ Вт июл 05, 2016 18:12:58 ] |
| Заголовок сообщения: | Re: фазоимпульсное управление на таймерах STM32 |
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 |
|
| Автор: | Z_h_e [ Вт июл 05, 2016 18:21:00 ] |
| Заголовок сообщения: | Re: фазоимпульсное управление на таймерах STM32 |
RusikOk писал(а): для stm32f103 у него таймеры 2 и 4 на 36МГц шине. делители переправил но код все равно не запустился. У меня тот же самый контроллер.Цитата: не могу запустить Что именно Вы имеете ввиду?_____________ По поводу двух таймером. По-моему я пришел к выводу, что нельзя один и тот же таймер подключить одновременно ко входу и к выходу. Только или или. |
|
| Автор: | RusikOk [ Вт июл 05, 2016 18:28:53 ] |
| Заголовок сообщения: | Re: фазоимпульсное управление на таймерах STM32 |
тогда как вы можете записывать ему предделитель TIM2->PSC=71700-1; если таймер 1 разрядный и максимум у него 65000 (примерно) в вашем примере на вход импульсы подаю на выходе ничего не наблюдаю |
|
| Автор: | Z_h_e [ Вт июл 05, 2016 18:36:52 ] |
| Заголовок сообщения: | Re: фазоимпульсное управление на таймерах STM32 |
Вот я сейчас сижу и думаю как у меня оно работает ))). При том что по осциллографу было все хорошо и по факту тоже все хорошо. Сейчас буду пробовать изменять код. Скорее всего случайно пишется удачная младшая часть, вернее неудачная. Так бы заметил косяк. У меня заработало и я сразу забыл про эту часть кода. На выход еще надо подключить альтернативную функцию. Код: 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); |
|
| Автор: | Z_h_e [ Вт июл 05, 2016 20:31:06 ] |
| Заголовок сообщения: | Re: фазоимпульсное управление на таймерах STM32 |
Провел я внутреннее расследование у себя в голове, провел ряд эксперементов и вот что у меня получилось: -с какого-то перепугу я взял частоту шины 72МГц. -вычислил что расчетный коэфф. деления должен был быть 7200 -при эксперименте увидел что ничего не получается, "добавил" нолик и все заработало. Решил что ошибся на порядок и на этом успокоился. Не обратив внимание что такое число никак не влазит в 16бит. По факту коэфф. деления был 6183 Если установить коэфф. 3600, вроде так получается надо при частоте 36МГц, То таймер работает в два раза быстрее расчетов. Почему, пока не догоняю и оставлю этот вопрос на завтра или когда будет время. Теперь по поводу деления на 7200. С этим числом тоже не работает при малой мощности, ну это из-за времени запаздывания детектора нуля, по осциллу где-то 200-300 мкс. Убавляя коэфф. деления, опытным путем установил, что коэфф. деления нужен 6500. Установил 6400. Ну и маленькое резюме 6183 очень близкое к 6400, и если не измерять разницу чем то, то никак этого не видно. Вот это самые гадские ошибки, которые на кой-то ляд работают как надо. Почему ж таймер то так считает??? Надо будет подумать. |
|
| Автор: | RusikOk [ Ср июл 06, 2016 03:44:20 ] |
| Заголовок сообщения: | Re: фазоимпульсное управление на таймерах STM32 |
решил пойти с конца. настроил через куб режим ШИМ все работает. только ставишь галку ван пульс мод все. на этом генерация прекращается. может правда этот куб глючный что просто ппц. |
|
| Автор: | Z_h_e [ Ср июл 06, 2016 07:38:54 ] |
| Заголовок сообщения: | Re: фазоимпульсное управление на таймерах STM32 |
RusikOk писал(а): только ставишь галку ван пульс мод все Ну таймер то надо чем то запускать. У меня запускается сигналом с нуль детектора.Вот читаю читаю. Пока не догоняю почему частота не бьется с расчетной. Наверное сейчас попробую экскременты эксперементы ставить. |
|
| Автор: | Z_h_e [ Ср июл 06, 2016 10:11:10 ] |
| Заголовок сообщения: | Re: фазоимпульсное управление на таймерах STM32 |
Сбили Вы меня, уважаемый RusikOk. Все нормально у меня в коде, ну за исключением лишнего нуля . Ладно не было времени разбираться, а то бы в какие-нибудь дебри залез. При чем здесь вообще частота шины и тактовая частота счетчика? Это разные вещи, он же не частоту шины считает. |
|
| Автор: | dosikus [ Ср июл 06, 2016 10:36:51 ] |
| Заголовок сообщения: | Re: фазоимпульсное управление на таймерах STM32 |
Z_h_e писал(а): Если установить коэфф. 3600, вроде так получается надо при частоте 36МГц, То таймер работает в два раза быстрее расчетов. Почему, пока не догоняю и оставлю этот вопрос на завтра или когда будет время. .... Почему ж таймер то так считает??? Надо будет подумать. Надо не только думать но и читать уметь...
|
|
| Автор: | RusikOk [ Ср июл 06, 2016 11:13:37 ] |
| Заголовок сообщения: | Re: фазоимпульсное управление на таймерах STM32 |
дело в том, что максимальная допустимая частота тактирования шины APB1 36МГц. если стоит больше то производитель не гарантирует стабильную работу. а предделитель таймера у вас вроди не используется значит равен 1. я так понял |
|
| Страница 1 из 4 | Часовой пояс: UTC + 3 часа |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|


