Создание собственной системы стабилизации
drv_pwm.c - буду ковырять…
Найди вызов в майне pwmInit, найди в параметре ссылку на одну из структур
и убери из неё PWM5, PWM6
static const uint8_t multiPWM[] = {
PWM1 | TYPE_IW, // input #1
PWM2 | TYPE_IW,
PWM3 | TYPE_IW,
PWM4 | TYPE_IW,
// PWM5 | TYPE_IW, /// !!!!!!!!!!!!!!!!!!
//PWM6 | TYPE_IW, /// !!!!!!!!!!!!!!!!!!
PWM7 | TYPE_IW,
PWM8 | TYPE_IW, // input #8
PWM9 | TYPE_M, // motor #1 or servo #1 (swap to servo if needed)
PWM10 | TYPE_M, // motor #2 or servo #2 (swap to servo if needed)
PWM11 | TYPE_M, // motor #1 or #3
PWM12 | TYPE_M,
PWM13 | TYPE_M,
PWM14 | TYPE_M, // motor #4 or #6
0xFF
};
или просто закоментируй, ломать код не надо, всё структурами настраивается.
Вот здесь
// this is pretty hacky shit, but it will do for now. array of 4 config maps, [ multiPWM multiPPM airPWM airPPM ]
if (init->airplane)
i = 2; // switch to air hardware config
if (init->usePPM)
i++; // next index is for PPM
setup = hardwareMaps[i];
выбирается одна из структур
static const uint8_t *hardwareMaps[] = {
multiPWM,
multiPPM,
airPWM,
airPPM,
};
которые описаны выше,
static const uint8_t multiPPM[] = {
PWM1 | TYPE_IP, // PPM input
PWM9 | TYPE_M, // Swap to servo if needed
PWM10 | TYPE_M, // Swap to servo if needed
PWM11 | TYPE_M,
PWM12 | TYPE_M,
PWM13 | TYPE_M,
PWM14 | TYPE_M,
PWM5 | TYPE_M, // Swap to servo if needed
PWM6 | TYPE_M, // Swap to servo if needed
PWM7 | TYPE_M, // Swap to servo if needed
PWM8 | TYPE_M, // Swap to servo if needed
0xFF
};
static const uint8_t multiPWM[] = {
PWM1 | TYPE_IW, // input #1
PWM2 | TYPE_IW,
PWM3 | TYPE_IW,
PWM4 | TYPE_IW,
PWM5 | TYPE_IW,
PWM6 | TYPE_IW,
PWM7 | TYPE_IW,
PWM8 | TYPE_IW, // input #8
PWM9 | TYPE_M, // motor #1 or servo #1 (swap to servo if needed)
PWM10 | TYPE_M, // motor #2 or servo #2 (swap to servo if needed)
PWM11 | TYPE_M, // motor #1 or #3
PWM12 | TYPE_M,
PWM13 | TYPE_M,
PWM14 | TYPE_M, // motor #4 or #6
0xFF
};
static const uint8_t airPPM[] = {
PWM1 | TYPE_IP, // PPM input
PWM9 | TYPE_M, // motor #1
PWM10 | TYPE_M, // motor #2
PWM11 | TYPE_S, // servo #1
PWM12 | TYPE_S,
PWM13 | TYPE_S,
PWM14 | TYPE_S, // servo #4
PWM5 | TYPE_S, // servo #5
PWM6 | TYPE_S,
PWM7 | TYPE_S,
PWM8 | TYPE_S, // servo #8
0xFF
};
static const uint8_t airPWM[] = {
PWM1 | TYPE_IW, // input #1
PWM2 | TYPE_IW,
PWM3 | TYPE_IW,
PWM4 | TYPE_IW,
PWM5 | TYPE_IW,
PWM6 | TYPE_IW,
PWM7 | TYPE_IW,
PWM8 | TYPE_IW, // input #8
PWM9 | TYPE_M, // motor #1
PWM10 | TYPE_M, // motor #2
PWM11 | TYPE_S, // servo #1
PWM12 | TYPE_S,
PWM13 | TYPE_S,
PWM14 | TYPE_S, // servo #4
0xFF
};
можешь свою добавить и включить в hardwareMaps[]
Запустил на портах PB8, PB9 проверяю работоспособность остальных шимов…
серва точно работает 😃 моторы не стартонули не один:(
Вобщем надо, свистелку тобиш триггер пересадить на порт pa11
моторы не стартонули не один
ШИМа нет?
как раз то шим есть похоже моторы не назначаются…
Короче я сам дурак - последние прошивки Таймкопа ( там где он якобы отладил алт холд) НЕРАБОЧИЕ - армятся, но шимы не меняются…
откатил прошивку, движки сместились без проблем, но сонар не заработал 😦
Фух всё, работают и движки, и серва, и сонар PB8 - PB9 😃 , а вот по ходу альт холд придётся самому присобачивать, да и всё равно сонар в иму вклинивать надо… пошел я спать…
на картинке я специально сонар вверх вниз дёргал, где скачёк - пальцем закрыл…
Вот только интересный момент, у меня получается на одном таймере теперь висит и 50Гц шим и 400Гц - как-то нехорошо получаеццо…
у меня получается на одном таймере теперь висит и 50Гц шим и 400Гц - как-то нехорошо получаеццо…
Не очень, у всех каналов таймера будет герцовка как у последнего в структуре по ссылке в hardwareMaps[]
так вот я и хочу повесить trigger сонара на порт A-какой нибудь PA13 или PA14 - как правильно в драйвере записать GPIO ?
серва то работает, а она бы на 400Гц не потянула…
вот где переключается канал в 50Гц режим
if (init->useServos) {
// remap PWM9+10 as servos
if (port == PWM9 )//|| port == PWM10)
mask = TYPE_S;
}
и отсчёт моторов сдвигается - я закоментировал PWM 10 -порт PA11, отсчёт пошол с него и мотор на нём завёлся, возможно что теперь он не на 400Гц а на 50Гц.
На сколько начитался, можно на каналах использовать разную частоту, лиш бы основная частота таймера не менялась, а она постоянна независимо на какой частоте шим…
вот статейка шимы на одном таймере но с разной частотой по каналам… это я себя успокаиваю - будет погода подлетну посмотрю 😃
так вот я и хочу повесить trigger сонара на порт A-какой нибудь PA13 или PA14 - как правильно в драйвере записать GPIO ?
вылож файлы сонара .c и .h поправлю
я впринципе попробовал перекидывать - не вышло
case sonar_pwm56:
trigger_pin = GPIO_Pin_8; // здесь номер порта
echo_pin = GPIO_Pin_9; // PWM6 (PB9) - 5v tolerant
exti_line = EXTI_Line9;
exti_pin_source = GPIO_PinSource9;
exti_irqn = EXTI9_5_IRQn;
break;
-------------------------------------------------------------------------
// tp - trigger pin
GPIO_InitStructure.GPIO_Pin = trigger_pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure); // сам порт
я впринципе попробовал перекидывать - не вышло
// tp - trigger pin
GPIO_InitStructure.GPIO_Pin = trigger_pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); // сам порт
Порт забыл поменять…
Нет менял, это просто для примера, возможно он где-то задействован в программном (возможно для переключения в cli как в арду или переключение каких-то режимов), но я не нашел и даже упоминаний…
ааа вот оно чё
last_measurement = current_time;
distance_ptr = distance;
GPIO_SetBits(GPIOB, trigger_pin);
// The width of trig signal must be greater than 10us
delayMicroseconds(11);
GPIO_ResetBits(GPIOB, trigger_pin);
завтра перепишу, а то свой ноут выключил - взял сына (одолжили ноут попользоватся, так теперь сынишка с ним балуется) фильм посмотреть…
замерял линейкой сонар врёт на сантиметр…
На портах А не пошло…
это порты для отладки через St-Link , их надо где-то переназначить…
не надо голову дурить, у меня ещё порт B не кончился 12, 13, 14, 15 - тобиш SPI но я его как порядочная св не развёл придётся припаятся пямо к лапе…
В общем trigger переехал на PA11, моторы на 4-й таймер, серва на 1-м, всё завелось 😃
всё завелось
отлично, удержание высоты проверял?
Я ещё только пытаюсь алт холд Александра (Mahovik) воткнуть, т.к. не пошли прошивки последние, а потом уже вклинивать сонар в IMU буду, он сейчас только показывает высоту и всё, в расчётах не учавствует…
Ещё идея лезет, от прошлого проекта осталась платка под GPS (можно крепить поверх мелкой на стойках), пожертвовать двумя AUXами - на первом сделать LEVEL, LEVEL+Alt Hold, LEVEL+Alt Hold+Headfree - трёхпозиционник, на втором переключение GPS - удержание позиции и возврат домой, под GPS освободить второй UART…
Новый Алт Холд вклинил, в отличии от Таймкопа - моторы работают, набираюсь смелости и вперёд за сонаром…
Не знаю, толи мои кривые руки, толи особенности программирования ARM, алгоритм я полностью не осилил, сделал проверки на адекватность сонара непосредственнов IMU, так же Alt Hold теперь работает если активирован сонар (не важно есть он или нет его физически - главное чтоб задефайнен был - надеюсь пока), вобщем всё размазано по всему проекту, даже страшно показывать что есть на данный момент, сейчас разбираюсь с фильтрами на сонаре - надо они, ненадо? С ошибками тоже лопухнулся немного по сей причине пока переключение с барометра на сонар затягивается, ну это поправлю, по крайней мере в GUI уже что-то вменяемое показывает, беспокоит аксель, как бы фильтронуть его по ВЧ - желательно прямо сырые данные, а может и не надо. Вывел в Cli параметры для фильтров сонара - можно баловатся не перешивая (но пока я вообще фильтр отключил чтобы в гуи посмотреть что реально творится) главное сейчас не заленится и продолжить испытания, хотя для меня сейчас уже радость что во первых компилируется, а во вторых довольно вменяемые данные 😃
ну если добью огрехи, выложу этот страх божий на обозрение 😃