нуу мне всего лишь надо сделать этот генератор сигнала и всё. потом, такие дебри мне не пригодятся, обойдусь стандартной ардуиной если что-то нужно будет.
dosikus-у я благодарен человек дейтвительно добрый и терпеливый, да и все м я благодарен за подсказки, вот на днях опять засяду и попытаюсь доделать. сейчас и времени особо нет да и спать хочеться, пока разбирался с тем что я понял не мог поспать нормальтно (.
Наверно для "сферического новичка в вакууме" и правда сложно, но большинство приходит к контроллерам не из мясомолочного, а из других областей програмирования и интегрированные среды им знакомы.
А мне приятны в сложных средах и онлайн хелп и подсказки по аргументам и моментальный переход к объявлениям и определениям (это - самая любимая вещь!).
=================
Виноват - я оффтоп начал, нужно и заканчикать. Вкусовщина всё это. Реально и на Ардуино ИДЕ очень удобно писать мелкие задачи под СТМ32. А там ни подсказок, ни проектов, ни хелпа! ;)))) Да и загрузчик я никогда не использую - только СТ-линк. Вот спроси меня - почему я на Ардуино ИДЕ пишу мелочи? - Нихрена не отвечу. Сила привычки!
И я на арбуине пишу мелочи. В основном из за того, что меньше писать руками. Приходится всякие буферые массивы под сериал писать да и сам вывод чара прописывать. Дело хоть привычное, но на ардуине это всё за кадром. Но только шаг в сторону и легче в среде с отладчиком. Я не силён в сленге названия сред но мне казалось что stm attolic true studio продвигает? Там и под куб всё заточено и отладчик какой-никакой есть.
Читается как "1" на месте номер 4. Нужно помнитьт, что самое правое место - имеет номер 0.проверка: что такое (1<< 12)? - Единица на месте №12, то еасть 1 и 12 нолей: 0b0001000000000000.Для того, чтобы понимать, что обозначают те или иные биты исползуется симолическое обозначение:
например:
//писать не так
TIMER1_BASE->CCER=(1<<4)|(1<<0);
//а так
TIMER1_BASE->CCER=(1<<TIMER_CCER_CC2E_BIT)|(1<<TIMER_CCER_CC1E_BIT);
Тогда сразу видно, что в регистре устанавливаются биты разрешения первого и второго каналов.
вот выделил чутка времени, и я нашел эти таблицы в мануале, теперь понял как читать записи типа (TIMER1_BASE->CCER=(1<<4)|(1<<0) ) и теперь сам могу выбирать режимы!! Вот это хорошее было объяснение! Спасибо !!!! )))
Bits 7:0 DTG[7:0]: Dead-time generator setup
This bit-field defines the duration of the dead-time inserted between the complementary
outputs. DT correspond to this duration.
DTG[7:5]=0xx => DT=DTG[7:0]x tdtg with tdtg=tDTS.
DTG[7:5]=10x => DT=(64+DTG[5:0])xtdtg with Tdtg=2xtDTS.
DTG[7:5]=110 => DT=(32+DTG[4:0])xtdtg with Tdtg=8xtDTS.
DTG[7:5]=111 => DT=(32+DTG[4:0])xtdtg with Tdtg=16xtDTS.
Example if TDTS=125ns (8MHz), dead-time possible values are:
0 to 15875 ns by 125 ns steps,
16 us to 31750 ns by 250 ns steps,
32 us to 63us by 1 us steps,
64 us to 126 us by 2 us steps
Где биты 7:5 являются переключателем режимов множителя , а оставшиеся биты значением.
На скрине что я приводил, DeadTime было взято наобум только для демонстрации и ранялось 255...
я так понял просто так нельзя менять дедтайм ? например вот так :
if (enc1.isRight()){ // если был поворот
ded++;
TIMER1_BASE->BDTR |=ded ;
}
потому что меняет крайне не охотно, по началу по чуть чуть увеличивает потом ничего не меняется потом скачок увеличилось, опять ничего и потом резкий скачок увеличения.
я так понял просто так нельзя менять дедтайм ? например вот так :
if (enc1.isRight()){ // если был поворот
ded++;
TIMER1_BASE->BDTR |=ded ;
}
потому что меняет крайне не охотно, по началу по чуть чуть увеличивает потом ничего не меняется потом скачок увеличилось, опять ничего и потом резкий скачок увеличения.
Так и должно быть , вы внимательней изучите как формируется DeadTime.
А вы вообще понимаете зачем нужен DTG и DeadTime ?
я знаю зачем он нужен в схемах чтобы транзисторы 2- плеч не рванули при перечении сигналов, но в тоже время я знаю что в обычных схемх его можно регулировать то есть регулировать скважность сигнала.
но в тоже время я знаю что в обычных схемх его можно регулировать то есть регулировать скважность сигнала.
Вы путаете .
Это разные вещи - скважность это соотношение длины импульса к длине паузы одного канала.
DeadTime - это пауза между фронтами комплементарных выходов.
DeadTime расчитывается исходя из текущей частоты PWM и используемых компонентов, DeadTime не нуждается в широком диапазоне регулировки.
Скважность же меняется изменением значения в CCRx и может меняться в широком диапазоне - от 0 до ARR , при 0 в CCRx на выходе 0 при CCRx=ARR на выходе 1
ок,я понял что в этом МК это разные весчи, но теперь как то надо менять скважность. Но так как выходы комплиментарны и инвертированны. Длительность сразу меняется у обеих выходов в обратной зависимости. Значит надо все переделывать.
стоп, в данной реализации при изменении длительности 1-го канала с комплиментарным проиходит противоположное, можно ли задавать длительность комплиментрарного отдельно ? вот пока така картина http://prntscr.com/oofx83
мне очень неудобно опять вклиниваца в вашу высокоинтеллектуальную дискуссию, но вы очень удивитесь как меняюца значения TIMER1_BASE->BDTR в зависимости от ded. Примерно так
xsimax, если начать просто-напросто думать то ни чего сложного и нет.
Открываем хэдеры на LibMaple и заменяем.
К примеру
или
Вот только одно но.
Как можно изучать платформу если сами себе перекрываете доступ к шикарнейшим инструментам?
В Keil и SES есть отличные отладочные средства, а дебуггеру Ozone просто нет альтернативы...
нуу мне всего лишь надо сделать этот генератор сигнала и всё. потом, такие дебри мне не пригодятся, обойдусь стандартной ардуиной если что-то нужно будет.
......Открываем хэдеры на LibMaple и заменяем.......
Досикус! Зря я на тебя наезжал. Ты добрый ..и терепливый. ;))))
==============
Тока насчет платных сред не сбивай новичков с толку. ST свою бесплатную среду на основе Еклипс раздает, которая с Кубом женится и нормальный дебагер имеет, просто фротэнд к gdb.
Если есть открытая альтернатива, НИКОГДА не следует выбирать проприетарщину. ;))
xsimax, вам осталось работы на пол часа ...
wdrakula, если уж так претит проприетарщина , есть масса вариантов но клипсина в них ни как не попадает.
Я озвучиваю сие с оглядкой именно на новичков .
Но лично я советую SES и Ozone.
xsimax, вам осталось работы на пол часа ...
wdrakula, если уж так претит проприетарщина , есть масса вариантов но клипсина в них ни как не попадает.
Я озвучиваю сие с оглядкой именно на новичков .
Но лично я советую SES и Ozone.
То есть ты утверждаешь, что родной System workbech от ST, плох для контроллеров их производства? Свежо. смело, оригинально! ;)))
(признайся уж честно, что тебя просто Еклипс раздражает? ;))))) )
dosikus-у я благодарен человек дейтвительно добрый и терпеливый, да и все м я благодарен за подсказки, вот на днях опять засяду и попытаюсь доделать. сейчас и времени особо нет да и спать хочеться, пока разбирался с тем что я понял не мог поспать нормальтно (.
То есть ты утверждаешь, что родной System workbech от ST, плох для контроллеров их производства? Свежо. смело, оригинально! ;)))
(признайся уж честно, что тебя просто Еклипс раздражает? ;))))) )
Отнюдь, не я первый сие озвучил. Да и исхожу не только из своего опыта.
Именно , софт не самая сильная сторона ST , в отличии от железа.
А теперь на счет клипсины , лично мое мнение - монстроуозная , раздутая, и слишком универсальная хрень да к тому на жабе.
Для новичков годна лишь совместно с туториалами - ткни сюда,потыкай здесь.
Создать проект для них недостижимые высоты. Большинство тупо копируют чужие.
А если уж такая проприетарофилия, то тот же Geany + gcc ...
Наверно для "сферического новичка в вакууме" и правда сложно, но большинство приходит к контроллерам не из мясомолочного, а из других областей програмирования и интегрированные среды им знакомы.
А мне приятны в сложных средах и онлайн хелп и подсказки по аргументам и моментальный переход к объявлениям и определениям (это - самая любимая вещь!).
=================
Виноват - я оффтоп начал, нужно и заканчикать. Вкусовщина всё это. Реально и на Ардуино ИДЕ очень удобно писать мелкие задачи под СТМ32. А там ни подсказок, ни проектов, ни хелпа! ;)))) Да и загрузчик я никогда не использую - только СТ-линк. Вот спроси меня - почему я на Ардуино ИДЕ пишу мелочи? - Нихрена не отвечу. Сила привычки!
Ну навигация по коду не прерогатива клипсины , так же как и автодополнение.
Все это есть и в Keil и SES .
А вот дебаг в сборках на клипсине увы и ах, есть только gdb а это как говорится две большие разницы.
и таки да, оффтоп...
И я на арбуине пишу мелочи. В основном из за того, что меньше писать руками. Приходится всякие буферые массивы под сериал писать да и сам вывод чара прописывать. Дело хоть привычное, но на ардуине это всё за кадром. Но только шаг в сторону и легче в среде с отладчиком. Я не силён в сленге названия сред но мне казалось что stm attolic true studio продвигает? Там и под куб всё заточено и отладчик какой-никакой есть.
например:
Тогда сразу видно, что в регистре устанавливаются биты разрешения первого и второго каналов.
вот выделил чутка времени, и я нашел эти таблицы в мануале, теперь понял как читать записи типа (TIMER1_BASE->CCER=(1<<4)|(1<<0) ) и теперь сам могу выбирать режимы!! Вот это хорошее было объяснение! Спасибо !!!! )))
xsimax, а вот так вы можете наблюдать за действиями своей программы:
это я так понимаю Эклипс ? круто, в ардуине такого нет.
xsimax, это Ozone и Keil. Клипсине до них как до Китая...
А есть еще RTT Real Time Transfer
https://www.segger.com/products/debug-probes/j-link/technology/about-real-time-transfer/
И еще масса плюшек .
Например Ozone позволяет выводить значение переменных в графическом виде.
Ozone и Keil. Клипсине до них как до Китая...
Купил? ;))) Или "объем до 32К"? Так-то Кейл 3 тонны евро примерно... Штоп иллюзий не было.
Keil для F0 бесплатен.
SES и Ozone вообще бесплатны.
dosikus а как изменить дедтайм ? Нужна запись наверно типа такой TIMER1_BASE->BDTR.DTG = 12 но не подходит(ошибка)
Правильно будет
Где x значение DTG , в вашем случае 12;
А исходя из RM значение DTG вычисляется по :
Bits 7:0 DTG[7:0]: Dead-time generator setup
This bit-field defines the duration of the dead-time inserted between the complementary
outputs. DT correspond to this duration.
DTG[7:5]=0xx => DT=DTG[7:0]x tdtg with tdtg=tDTS.
DTG[7:5]=10x => DT=(64+DTG[5:0])xtdtg with Tdtg=2xtDTS.
DTG[7:5]=110 => DT=(32+DTG[4:0])xtdtg with Tdtg=8xtDTS.
DTG[7:5]=111 => DT=(32+DTG[4:0])xtdtg with Tdtg=16xtDTS.
Example if TDTS=125ns (8MHz), dead-time possible values are:
0 to 15875 ns by 125 ns steps,
16 us to 31750 ns by 250 ns steps,
32 us to 63us by 1 us steps,
64 us to 126 us by 2 us steps
Где биты 7:5 являются переключателем режимов множителя , а оставшиеся биты значением.
На скрине что я приводил, DeadTime было взято наобум только для демонстрации и ранялось 255...
странно ошибки нет но не реагирует. какие бы я значения не писал.
Попробуйте выставить 255 , при значение 12 будет слишком мало чтобы увидеть.
Если я не ошибаюсь при 8МГц , а при 72Мгц будет еще в 9 раз меньше .
что-то ни какой реакции(дедтайм не меняется), наверно я делаю что-то не то вот весь код на всяк случай.
Конечно не так.
TIMER1_BASE->BDTR |= TIMER_BDTR_MOE |255;
Ураа, наконец то!! Спасибо вам dosikus вам огромнейшее.
перерь попробую приделать энкодер и менять частоту и дедтайм.
Если будете менять частоту или скважность, не забудьте про биты ARPE и OCxPE они включают теневые буферы для соотвествующих регистров.
Ну все верно , DTG настроен на максимум :
64 us to 126 us by 2 us steps
при 8Мгц -126 us,при 72МГц -126/9 - 14us
я так понял просто так нельзя менять дедтайм ? например вот так :
потому что меняет крайне не охотно, по началу по чуть чуть увеличивает потом ничего не меняется потом скачок увеличилось, опять ничего и потом резкий скачок увеличения.
удивительно, правда? Прям, до слёз.
я так понял просто так нельзя менять дедтайм ? например вот так :
потому что меняет крайне не охотно, по началу по чуть чуть увеличивает потом ничего не меняется потом скачок увеличилось, опять ничего и потом резкий скачок увеличения.
Так и должно быть , вы внимательней изучите как формируется DeadTime.
А вы вообще понимаете зачем нужен DTG и DeadTime ?
я знаю зачем он нужен в схемах чтобы транзисторы 2- плеч не рванули при перечении сигналов, но в тоже время я знаю что в обычных схемх его можно регулировать то есть регулировать скважность сигнала.
но в тоже время я знаю что в обычных схемх его можно регулировать то есть регулировать скважность сигнала.
Вы путаете .
Это разные вещи - скважность это соотношение длины импульса к длине паузы одного канала.
DeadTime - это пауза между фронтами комплементарных выходов.
DeadTime расчитывается исходя из текущей частоты PWM и используемых компонентов, DeadTime не нуждается в широком диапазоне регулировки.
Скважность же меняется изменением значения в CCRx и может меняться в широком диапазоне - от 0 до ARR , при 0 в CCRx на выходе 0 при CCRx=ARR на выходе 1
ок,я понял что в этом МК это разные весчи, но теперь как то надо менять скважность. Но так как выходы комплиментарны и инвертированны. Длительность сразу меняется у обеих выходов в обратной зависимости. Значит надо все переделывать.
xsimax, это разные вещи не только для STM32 а для всех МК.
Скважность меняется у прямого и инверсного выхода одновременно .
Сейчас продемонстрирую.
да я понял, что меняеться одновременно, я уже проверил, но у первого канала прямая зависимость а у второго обратная. значит этот вариант не катит.
Это не первый и второй канал , это один канал и его комплементарные выходы.
Тогда я не понимаю - что вы хотите получить в итоге.
Озвучивайте ...
я условно их назвал перыім и вторым.. Я хочу Пуш-пул с регулировкой по частоте и скважноти.
Del.
стоп, в данной реализации при изменении длительности 1-го канала с комплиментарным проиходит противоположное, можно ли задавать длительность комплиментрарного отдельно ? вот пока така картина http://prntscr.com/oofx83
мне очень неудобно опять вклиниваца в вашу высокоинтеллектуальную дискуссию, но вы очень удивитесь как меняюца значения TIMER1_BASE->BDTR в зависимости от ded. Примерно так
ded = 0 TIMER1_BASE->BDTR = 0
ded = 1 TIMER1_BASE->BDTR = 1
ded = 2 TIMER1_BASE->BDTR = 3
ded = 3 TIMER1_BASE->BDTR = 3
ded = 4 TIMER1_BASE->BDTR = 7
ded = 5 TIMER1_BASE->BDTR = 7
ded = 6 TIMER1_BASE->BDTR = 7
ded = 7 TIMER1_BASE->BDTR = 7
ded = 8 TIMER1_BASE->BDTR = 15
ded = 9 TIMER1_BASE->BDTR = 15
ded = 10 TIMER1_BASE->BDTR = 15
.
ded = 14 TIMER1_BASE->BDTR = 15
ded = 15 TIMER1_BASE->BDTR = 15
ded = 16 TIMER1_BASE->BDTR = 31
и т.д
и чойта они так "резко скачют"?
DetSimen я уже понял что регулировать дедтайм это тупик, проехали.
xsimax, я уже понял что вы хотите, однако это совсем не то что вы хотели в начале.
На одном канале push-pull не изобразить.
У меня где-то есть сия реализация , найду выложу.
DetSimen, они и будут резко скакать при таком изменение . Ибо там не линейная зависимость.
А тот код что вы привели вообще работать не будет.
А тот код что вы привели вообще работать не будет.
дак это код из #377, это не я его выдумал.
ладно. заварю себе
А тот код что вы привели вообще работать не будет.
дак это код из #377, это не я его выдумал.
Ваше ?
TIMER1_BASE->BDTR = 0
Эта строка первым же делом затрет бит MOE и никакого выхлопа не будет.
xsimax, здесь оба и пушпулл и комплементарный http://we.easyelectronics.ru/_YS_/complementary-pwm-i-push-pull-rezhimy-na-taymere-1-kontrollerov-stm32.html
вопросец: вот я часто вижу например такую запись регистра OC1M_2, я знаю за что отвечает регистр OC1M а что означает "_2" ?
раньше просто писал OC1M (без двойки) так как компилятор ругался на двойку, но тут решил уточнить.
OCxM - состоит из 3хбит , _x порядковый номер бита ...
это я знаю, меня интересует та цифра которая в конце ставится.
Тогда так...
OCxM - состоит из 3хбит , OCxM_y порядковый номер бита ...
аа понял. судя по этой таблице порядковый номер пишется сверху ? http://prntscr.com/oood9z