STM32F103 & Arduino IDE

dosikus
Offline
Зарегистрирован: 11.03.2017

xsimax,  если начать просто-напросто думать то ни чего сложного и нет.

Открываем хэдеры на LibMaple и заменяем.

К примеру 

 

AFIO->MAPR |=AFIO_MAPR_TIM1_REMAP_0;

AFIO_BASE->MAPR|=AFIO_MAPR_TIM1_REMAP_PARTIAL;

или 


#define  TIM_CCMR2_OC3M                      ((uint32_t)0x00000070U)            /*!<OC3M[2:0]  */
#define  TIM_CCMR2_OC3M_0                    ((uint32_t)0x00000010U)            /*!<Bit 0 */
#define  TIM_CCMR2_OC3M_1                    ((uint32_t)0x00000020U)            /*!<Bit 1 */
#define  TIM_CCMR2_OC3M_2                    ((uint32_t)0x00000040U)            /*!<Bit 2 */
 

TIMER1_BASE->CCMR1|=TIM_CCMR1_OC1M_2 |TIM_CCMR1_OC1M_1;

 

dosikus
Offline
Зарегистрирован: 11.03.2017

Вот только одно но.

Как можно изучать платформу если сами себе перекрываете доступ к шикарнейшим инструментам?

 В Keil и SES есть отличные отладочные средства, а дебуггеру Ozone просто нет альтернативы...

xsimax
Offline
Зарегистрирован: 29.07.2019

нуу мне всего лишь надо сделать этот генератор сигнала и всё.  потом,  такие дебри мне не пригодятся, обойдусь стандартной ардуиной если что-то нужно будет.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

dosikus пишет:

......Открываем хэдеры на LibMaple и заменяем.......

Досикус! Зря я на тебя наезжал. Ты добрый ..и терепливый. ;))))

==============

Тока насчет платных сред не сбивай новичков с толку. ST свою бесплатную среду на основе Еклипс раздает, которая с Кубом женится и нормальный дебагер имеет, просто фротэнд к gdb.

Если есть открытая альтернатива, НИКОГДА не следует выбирать проприетарщину. ;))

dosikus
Offline
Зарегистрирован: 11.03.2017

xsimax, вам осталось работы на пол часа ...

wdrakula, если уж так претит проприетарщина , есть масса вариантов но клипсина в них ни как не попадает.

    Я озвучиваю сие с оглядкой именно на новичков .

   Но лично я советую SES и Ozone.

   

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

dosikus пишет:

xsimax, вам осталось работы на пол часа ...

wdrakula, если уж так претит проприетарщина , есть масса вариантов но клипсина в них ни как не попадает.

    Я озвучиваю сие с оглядкой именно на новичков .

   Но лично я советую SES и Ozone.

   

То есть ты утверждаешь, что родной System workbech от ST, плох для контроллеров их производства? Свежо. смело, оригинально! ;)))

(признайся уж честно, что тебя просто Еклипс раздражает? ;))))) )

xsimax
Offline
Зарегистрирован: 29.07.2019

dosikus-у я благодарен человек дейтвительно добрый и терпеливый,  да и все м я благодарен за подсказки,  вот на днях опять засяду и попытаюсь доделать. сейчас и времени особо нет да и спать хочеться, пока разбирался с тем что я понял не мог поспать нормальтно (.

dosikus
Offline
Зарегистрирован: 11.03.2017

wdrakula пишет:

То есть ты утверждаешь, что родной System workbech от ST, плох для контроллеров их производства? Свежо. смело, оригинально! ;)))

(признайся уж честно, что тебя просто Еклипс раздражает? ;))))) )

 

Отнюдь, не я первый сие озвучил. Да и исхожу не только из своего опыта.

Именно , софт не самая сильная сторона ST , в отличии от железа.

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

Для новичков годна лишь совместно с туториалами - ткни сюда,потыкай здесь.

Создать проект для них недостижимые высоты. Большинство тупо копируют чужие.

А если уж такая проприетарофилия, то тот же Geany + gcc ...

 

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Наверно для "сферического новичка в вакууме" и правда сложно, но большинство приходит к контроллерам не из мясомолочного, а из других областей програмирования и интегрированные среды им знакомы.

А мне приятны в сложных средах и онлайн хелп и подсказки по аргументам и моментальный переход к объявлениям и определениям (это - самая любимая вещь!).

=================

Виноват - я оффтоп начал, нужно и заканчикать. Вкусовщина всё это. Реально и на Ардуино ИДЕ очень удобно писать мелкие задачи под СТМ32. А там ни подсказок, ни проектов, ни хелпа! ;)))) Да и загрузчик я никогда не использую - только  СТ-линк. Вот спроси меня - почему я на Ардуино ИДЕ пишу мелочи? - Нихрена не отвечу. Сила привычки!

dosikus
Offline
Зарегистрирован: 11.03.2017

Ну навигация по коду не прерогатива клипсины , так же как и автодополнение.

 Все это есть и в Keil и SES . 

А вот дебаг  в сборках на клипсине увы и ах, есть только gdb а это как говорится две большие разницы.

и таки да, оффтоп...

nik182
Offline
Зарегистрирован: 04.05.2015

И я на арбуине пишу мелочи. В основном из за того, что меньше писать руками. Приходится всякие буферые массивы под сериал писать да и сам вывод чара прописывать. Дело хоть привычное, но на ардуине это всё за кадром. Но только шаг в сторону и легче в среде с отладчиком. Я не силён в сленге названия сред но мне казалось что stm attolic true studio продвигает? Там и под куб всё заточено и отладчик какой-никакой есть.

xsimax
Offline
Зарегистрирован: 29.07.2019

wdrakula пишет:
Читается как "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) )   и теперь сам могу выбирать режимы!!  Вот это хорошее было объяснение! Спасибо !!!! )))

dosikus
Offline
Зарегистрирован: 11.03.2017

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

xsimax
Offline
Зарегистрирован: 29.07.2019

это я так понимаю Эклипс ? круто, в ардуине такого нет.

dosikus
Offline
Зарегистрирован: 11.03.2017

xsimax, это Ozone и Keil. Клипсине до них как до Китая...

А есть еще RTT Real Time Transfer

https://www.segger.com/products/debug-probes/j-link/technology/about-real-time-transfer/

И еще масса плюшек .

Например Ozone позволяет выводить значение переменных в графическом виде.

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

dosikus пишет:

 Ozone и Keil. Клипсине до них как до Китая...

Купил? ;))) Или "объем до 32К"? Так-то Кейл 3 тонны евро примерно... Штоп иллюзий не было.

dosikus
Offline
Зарегистрирован: 11.03.2017

Keil для F0 бесплатен.
SES и Ozone вообще бесплатны.

xsimax
Offline
Зарегистрирован: 29.07.2019

dosikus а как изменить дедтайм ? Нужна запись наверно типа такой  TIMER1_BASE->BDTR.DTG = 12  но   не подходит(ошибка)

 

dosikus
Offline
Зарегистрирован: 11.03.2017

Правильно будет 

TIMER1_BASE->BDTR |= x;

Где 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 t
dtg with tdtg=tDTS.
DTG[7:5]=10x => DT=(64+DTG[5:0])xt
dtg with Tdtg=2xtDTS.
DTG[7:5]=110 => DT=(32+DTG[4:0])xt
dtg with Tdtg=8xtDTS.
DTG[7:5]=111 => DT=(32+DTG[4:0])xt
dtg with Tdtg=16xtDTS.
Example if T
DTS=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...

xsimax
Offline
Зарегистрирован: 29.07.2019

странно ошибки нет но не реагирует. какие бы я значения не писал.

TIMER1_BASE->BDTR |= TIMER_BDTR_MOE |TIMER_BDTR_DTG; 
TIMER1_BASE->BDTR |= 12;

 

dosikus
Offline
Зарегистрирован: 11.03.2017

Попробуйте выставить 255 , при значение 12 будет слишком мало чтобы увидеть.

Если я не ошибаюсь при 8МГц , а при 72Мгц будет еще в 9 раз меньше .

DTG[7:5]=0xx => DT=DTG[7:0]x tdtg with tdtg=tDTS.
0 to 15875 ns by 125 ns steps,

 

 

 

xsimax
Offline
Зарегистрирован: 29.07.2019

что-то ни какой реакции(дедтайм не меняется), наверно я делаю что-то не то вот весь код на всяк случай.

void setup() {
pinMode(PA8,PWM); 
pinMode(PB13,PWM); 
TIMER1_BASE->PSC=72-1;
TIMER1_BASE->ARR=30-1;
TIMER1_BASE->CCR1=15 ;
TIMER1_BASE->CCMR1|=TIMER_CCMR1_OC1M|TIMER_CCMR1_OC2M ;
TIMER1_BASE->CCER |= TIMER_CCER_CC1E|TIMER_CCER_CC1NE;
TIMER1_BASE->BDTR |= TIMER_BDTR_MOE |TIMER_BDTR_DTG; 
TIMER1_BASE->BDTR |= 255;
TIMER1_BASE->CR1=1;
}
void loop() {}

 

dosikus
Offline
Зарегистрирован: 11.03.2017

Конечно не так.

TIMER1_BASE->BDTR |= TIMER_BDTR_MOE |255;

xsimax
Offline
Зарегистрирован: 29.07.2019

Ураа, наконец то!! Спасибо вам dosikus вам огромнейшее.

перерь попробую приделать энкодер и менять частоту и дедтайм.

dosikus
Offline
Зарегистрирован: 11.03.2017

Если будете менять частоту или скважность, не забудьте про биты ARPE и OCxPE они включают теневые буферы для соотвествующих регистров.

dosikus
Offline
Зарегистрирован: 11.03.2017

Ну все верно , DTG настроен на максимум :

64 us to 126 us by 2 us steps

при 8Мгц -126 us,при 72МГц -126/9 - 14us 

 

 

xsimax
Offline
Зарегистрирован: 29.07.2019

я так понял просто так нельзя менять дедтайм ? например вот так :

  if  (enc1.isRight()){  // если был поворот
    
  ded++;
 TIMER1_BASE->BDTR |=ded ;
}

потому что меняет крайне не охотно, по началу по чуть чуть увеличивает потом ничего не меняется потом скачок увеличилось,  опять ничего и потом резкий скачок увеличения.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

xsimax пишет:

 

  ded++;
 TIMER1_BASE->BDTR |=ded ;

удивительно, правда?  Прям, до слёз. 

 

dosikus
Offline
Зарегистрирован: 11.03.2017

xsimax пишет:

я так понял просто так нельзя менять дедтайм ? например вот так :

  if  (enc1.isRight()){  // если был поворот
    
  ded++;
 TIMER1_BASE->BDTR |=ded ;
}

потому что меняет крайне не охотно, по началу по чуть чуть увеличивает потом ничего не меняется потом скачок увеличилось,  опять ничего и потом резкий скачок увеличения.

 

Так и должно быть , вы внимательней изучите как формируется DeadTime.

А вы вообще понимаете зачем нужен DTG и DeadTime ?

xsimax
Offline
Зарегистрирован: 29.07.2019

я знаю зачем он нужен в схемах чтобы транзисторы 2- плеч не рванули при перечении сигналов, но в  тоже время я знаю что в обычных схемх его можно регулировать то есть регулировать скважность сигнала.

dosikus
Offline
Зарегистрирован: 11.03.2017

xsimax пишет:

 но в  тоже время я знаю что в обычных схемх его можно регулировать то есть регулировать скважность сигнала.

Вы путаете .

Это разные вещи - скважность это соотношение длины импульса к длине паузы одного канала.

DeadTime - это пауза между фронтами комплементарных выходов.

DeadTime расчитывается исходя из текущей частоты PWM и используемых компонентов, DeadTime не нуждается в широком диапазоне регулировки.

Скважность же меняется изменением значения в CCRx и может меняться в широком диапазоне - от 0 до ARR , при 0 в CCRx на выходе 0 при CCRx=ARR на выходе 1

xsimax
Offline
Зарегистрирован: 29.07.2019

ок,я понял что в этом МК это разные весчи, но  теперь как то надо менять скважность. Но так как  выходы комплиментарны и инвертированны. Длительность сразу меняется у обеих выходов в обратной зависимости. Значит надо все переделывать.

dosikus
Offline
Зарегистрирован: 11.03.2017

xsimax, это разные вещи не только для STM32 а для всех МК.

Скважность меняется у прямого и инверсного выхода одновременно .

Сейчас продемонстрирую.

xsimax
Offline
Зарегистрирован: 29.07.2019

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

dosikus
Offline
Зарегистрирован: 11.03.2017

Это не первый и второй канал , это один канал и его комплементарные выходы.

Тогда я не понимаю - что вы хотите получить в итоге.

Озвучивайте ...

xsimax
Offline
Зарегистрирован: 29.07.2019

я условно их назвал перыім и вторым..  Я хочу Пуш-пул с регулировкой по частоте и скважноти.

dosikus
Offline
Зарегистрирован: 11.03.2017

Del.

 

xsimax
Offline
Зарегистрирован: 29.07.2019

стоп, в данной реализации при изменении длительности 1-го канала с комплиментарным проиходит противоположное, можно ли задавать длительность комплиментрарного отдельно ? вот пока така картина http://prntscr.com/oofx83

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

xsimax пишет:

 

  ded++;
 TIMER1_BASE->BDTR |=ded ;

мне очень неудобно опять вклиниваца в вашу высокоинтеллектуальную дискуссию, но вы очень удивитесь как меняюца значения 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

и т.д 

и чойта они так "резко скачют"?

xsimax
Offline
Зарегистрирован: 29.07.2019

DetSimen я уже понял что регулировать дедтайм это тупик, проехали.

dosikus
Offline
Зарегистрирован: 11.03.2017

xsimax, я уже понял что вы хотите, однако это совсем не то что вы хотели в начале.

На одном канале push-pull не изобразить.

У меня где-то есть сия реализация , найду выложу.

 

DetSimen, они и будут резко скакать при таком изменение . Ибо там не линейная зависимость.

А тот код что вы привели вообще работать не будет.

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

dosikus пишет:

А тот код что вы привели вообще работать не будет.

дак это код из #377, это не я его выдумал. 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ладно. заварю себе 

dosikus
Offline
Зарегистрирован: 11.03.2017

DetSimen пишет:

dosikus пишет:

А тот код что вы привели вообще работать не будет.

дак это код из #377, это не я его выдумал. 

 

Ваше ?

TIMER1_BASE->BDTR = 0

Эта строка первым же делом затрет бит MOE и никакого выхлопа не будет.

 

dosikus
Offline
Зарегистрирован: 11.03.2017

xsimax,  здесь оба и пушпулл и комплементарный http://we.easyelectronics.ru/_YS_/complementary-pwm-i-push-pull-rezhimy-na-taymere-1-kontrollerov-stm32.html

xsimax
Offline
Зарегистрирован: 29.07.2019

вопросец: вот я часто вижу например такую запись регистра OC1M_2,   я знаю за что отвечает регистр OC1M а что означает "_2" ?

раньше просто писал OC1M (без двойки) так как компилятор ругался на двойку, но тут решил уточнить.

dosikus
Offline
Зарегистрирован: 11.03.2017

OCxM - состоит из 3хбит , _x порядковый номер бита ...

xsimax
Offline
Зарегистрирован: 29.07.2019

это я знаю, меня интересует та цифра которая в конце ставится.

dosikus
Offline
Зарегистрирован: 11.03.2017

Тогда так...

OCxM - состоит из 3хбит , OCxM_y порядковый номер бита ...

xsimax
Offline
Зарегистрирован: 29.07.2019

аа понял. судя по этой таблице порядковый номер пишется сверху ? http://prntscr.com/oood9z