Создание собственной системы стабилизации

oleg70

Пока экспериментировал со своей платой стабилизации, заметил “интересный” момент: не все ESC хотят работать с 3.3v PWM…, даже хваленые типа “турнига плюс”… (??). Самое интересное, по принципиальной схеме, PWM подается на ногу прерывания Атмеги, т.е. работать должно легко и везде, но не тут то было… “гугление” этого вопроса внятных ответов не дало…
Кто нибуть сталкивался с этим ?

SergDoc

На плющах всю жизнь - всё прекрасно, вопрос на какой частоте и перешиты ли регули, с родной прошивкой работают нормально до 300 гц

oleg70
SergDoc:

плющах всю жизнь - всё прекрасно

У меня вот “плющ” 25А не прошитый и с нормальной (50Гц) частотой не работает… и не только он, буквально перебирал из запасов разные марки и на разный ампераж (выбор есть), нормально работают SuperSimple, получается что если делать коммерческий продукт, то преобразователь надо ставить на плату… (не понятно только почему, сигнал подается на дискретную ногу INT0, даже при 5в питании, 3.3в железно “единица”)

strizhmax

А на выходе точно PWM? Осцил или логический анализатор воткнуть и посмотреть.

SergDoc
oleg70:

даже при 5в питании, 3.3в железно “единица”)

Ну как бы давно летаем - никогда не было проблем…
Open Pilot (всех мастей), vr brain, Naze32, Multipilot, AeroQad, AutoQad, у меня пачка различных контроллеров, rual, Drinker, Siberian, Mahowik, VisAsta… ни у кого проблем не было… (PX4 и их производные не берём - там есть преобразователи уровня)
Ищите непропай или проблему в коде… предделители на таймеры правильно выставлены, а то я раз на 800Гц вместо 400Гц запустил 1-й и 8-й таймеры…

oleg70:

У меня вот “плющ” 25А не прошитый и с нормальной (50Гц) частотой не работает… и не только он

Так - а по потреблению 5В что? ибо я описывал глюки плющей при перегреве - где-то “ESC ликбез” что-ли нестабильно начинают работать, они на внутреннем rc генераторе…

Drinker
oleg70:

тогда можно было бы просто сделать “автокоррекцию” и вообще забыть про крутилки, но пока че то не могу…

Есть такой метод “релейный” автонастройки ПИД регулятора. Довольно прост, но все руки не дойдут до опробывания.

oleg70
SergDoc:

я описывал глюки плющей

Эксперимент ставил “чистый” - моя плата и китайский сервотестер, чатота/длительность/вольтаж все проверенно осциллографом… Как, а главное чем (?), ESC “чует” пониженный уровень не понятно… Если всеж следовать здравому смыслу, то дело скорей не в размахе ШИМ, а в его временнОм возникновении при старте…
Как говорится “ничего не понятно но результат налицо”, причем плющей таких у меня два одинаковых и одинаково не работающих…

SergDoc

Инициализацию таймеров - код можно?

oleg70
SergDoc:

Инициализацию таймеров - код можно?

Вот: (частота проца у меня 160 Мгц)

//PWM output SETUP ============================================================
//=============================================================================
//=============================================================================
//=============================================================================

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);

  // GPIOC Configuration:
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 ;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP ;
  GPIO_Init(GPIOC, &GPIO_InitStruct);

  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15 ;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP ;
  GPIO_Init(GPIOD, &GPIO_InitStruct);

  /* Connect TIM3 pins to AF2 */
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_TIM3);
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_TIM3);
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_TIM3);
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_TIM3);

    /* Connect TIM4 pins to AF2 */
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource12, GPIO_AF_TIM4);
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource13, GPIO_AF_TIM4);
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_TIM4);
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_TIM4);


  /* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = 15000;
TIM_TimeBaseStructure.TIM_Prescaler = 80;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

TIM_TimeBaseStructure.TIM_Period = 15000;
TIM_TimeBaseStructure.TIM_Prescaler = 80;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

// OUT TIM3========================================
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 1000;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM3, &TIM_OCInitStructure);

TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 1000;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC2Init(TIM3, &TIM_OCInitStructure);

TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 1000;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC3Init(TIM3, &TIM_OCInitStructure);

TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 1000;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC4Init(TIM3, &TIM_OCInitStructure);

TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);

// OUT TIM4========================================
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 1000;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM4, &TIM_OCInitStructure);

TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 1000;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC2Init(TIM4, &TIM_OCInitStructure);

TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 1000;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC3Init(TIM4, &TIM_OCInitStructure);

TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 1000;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC4Init(TIM4, &TIM_OCInitStructure);

TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);


    TIM_ARRPreloadConfig(TIM3, ENABLE);
    TIM_ARRPreloadConfig(TIM4, ENABLE);


    /* TIM3 enable counter */
    TIM_Cmd(TIM3, ENABLE);
    TIM_Cmd(TIM4, ENABLE);
oleg70
SergDoc:

TIM_OCPolarity_Low

Чет не пойму… , если Low, то “двигаться” (1<->2 мс) будет нижний фронт, а стандарт - верхний/положительный вроде…
и на осциллографе у меня именно верхний… Или это очепятка или я вообще нифига не понимаю… 😃

SergDoc

“прижимать” быстрее чем “подтягивать” вверх 😃
Олег попробуйте и отпишитесь - это точно работает…

oleg70
SergDoc:

это точно работает…

Ды у меня и так все работает (просто регули другие поставил и все), а на Гитхабе повнимательней посмотрел и понял что сам принцип вывода сигнала другой: там как то через прерывания ШИМ выводится на любую ногу проца (удобно), а у меня все проще: беру аппаратную ногу выхода таймера и все… результат тот же…

DVE

“Архитектура систем управления самолётом”
habrahabr.ru/post/145371/

Не знаю баян или нет, но показалось интересным, как делают системы в большой авиации. Кое что из идей можно было бы позаимствовать…

k0der

народ не подскажите хороший электронный гироскоп (не механика).на работе выстрелела задача схожая с сситемой стабилизации

15 days later
SergDoc

сюда пропали )))
я переезжаю всё ещё 😦 так что ничем не занимаюсь, надеюсь в сентябре подтянусь… чё я зря 9250 покупал))) только вот все деньги на хобби ушли на оформление кучи бумажек 😦

djdron

тоже времени нету, минут по 15 в день код пишу)))

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

oleg70
djdron:

Почти доделал регули с каном

Это че, самопал ? (круто), где почитать о проекте ? или тоже “коммерческий продукт” (?)…

djdron
oleg70:

Это че, самопал ? (круто), где почитать о проекте ? или тоже “коммерческий продукт” (?)…

В принципе самопал))). Времени нет описывать проект, будет время напишу о нем. а так если кратко:
размеры платы регуля 47х25 мм
питание 2 - 8s (7 - 35в)
ток 25-30А, если добавить транзисторов можно и больше 45 - 50А(место для них есть) , все упирается в нагрев)))
в тепло уходит 2 - 3% от средней мощности, если хорошо нагружать то нужен радиатор(будет на транзисторах стоять алюм. пластина 2 мм )
Есть защита от перегрева, защита по току(“плавное” ограничение и аварийное отключение), защита по напряжению.
Возможно подключение внешнего термодатчика для контроля температуры двигателя.
ШИМ 12кГц, 24кГц, 48кГц
Управление по CAN, I2C, PWM. UART для настройки и обновления прошивки.
“Восстанавливает синхру”.

Можно и коммерческим сделать))), надо только партию хотябы из 100 - 200 шт делать, чтобы цена дешевле была. А так первая цель сделать надежный и универсальный регуль.

strizhmax

Протокол общения по CAN/I2C “стандартный” или свой?