Baychi OpenLRS - дружелюбная ЛРС с широкими возможностями )
- увеличить нагрузку на мотор, установленный на стенде
…
грузить генератором (любой маленький эл двигатель на магнитах)
не представляю как ❓
если имеется в виду, присоединение к валу другого мотора в качестве генератора,
то совсем не вариант, моторчик в наличии только один, да и очень маленький )
сегодня попробую “притормаживать” с помощью ватки на конце зубочистки,
теоретически должно сработать.
Регулируемый источник питания нужен для настройки " батарейка садится а обороты держим"
А для нагрузки двигателя цепляем ему на вал такой же моторчик (или мощнее) в качестве генератора, к генератору цепляем выпрямитель (трёхфазный выпрямитель Ларионова) и к выпрямителю цепляем нужное количество лампочек. Количеством лампочек регулируем нагрузку на двигатель.
Регулируемый источник питания нужен для настройки " батарейка садится а обороты держим"
Ардуинке фиолетово, по какой причине начали падать/расти обороты мотора,
то ли это изменение напряжения, толи изменение нагрузки на мотор,
метод увеличения/снижения оборотов только один, увеличить/уменьшить длительность PWM на входе регулятора.
имею траблу,
на графике время в микросекундах одного оборота мотора,
его считает ардуинка на основании прерываний, семь прерываний на один оборот
на данный момент выставлены 2500 оборотов/минуту, ну или 24000 миллисекунд на один оборот
отклонения это это погрешность измерений
это данные о времени одного оборота мотора.
очевидно, что далеко не все переходы через магниты фиксируются. буду думать, как побороть
возможно схема преобразования не оптимальна, срез фильтра например не соответствует …
эти всплески “вниз” влияют на работу регулировки оборотов
в общем предстоит подумать над фильтром помех,
которые периодически проскакивают через операционный усилитель.
попробую поиграть с RC цепочкой.
честно говоря, совсем не ожидал такого течения событий ))
ну или 24000 миллисекунд
микросекунд
проанализировал данные о длительности импульсов с кросс платы на Ардуинку,
в итоге понял, что не в фильтре дело, начал писать “оконный” фильтр,
принцип простой, берется восемь (число может быть любым) последовательных значений,
восемь удобно, потому как на восемь делить просто, сдвиг на 3 разряда в право ),
вычисляется среднее арифметическое (то самое деление суммы на восемь)
и следующее значение сравнивается с результатом деления,
если отличие больше чем на Х процентов, по моим прикидка надо сделать 25 процентов,
(это как раз деление на 4, т.е. сдвиг на два разряда), то данное значение отбрасывается.
если значение попадает в диапазон ±25 процентов от среднего в массиве,
его сохраняем в массив последним, а первое значение в массиве выбывает.
очень надеюсь, что к выходным гувернер заработает
Мне на почту Сергей Андреев прислал еще один метод измерения оборотов.
Но связан он с достаточно серьезной доработкой мотора
Геннадий, доброго дня! давно не читал страничку форума про контроллер, тов заглянул. ребята возможно копают там слишком глубоко и не в том направлении. нужно много знать про мотор чтобы просто измерять обороты для последующей обработки, так как все будет изменяться от мотора к мотору. получается решение оч персонализированное.
наверное не буду оригинальным, сказав что Игорь Бургер, так сказать один из тех кто родоначальник и на практике давно эффективно использует такие девайсы, решает вопросы оч просто, поставив на планшайбу мотора и стационарное кольцо секцию из датчиков холла, получив таким образом энкодер, который тупо все считает, очень точно и прям сейчас. потом все логи и данные получаются у него записанными и их можно корректировать для следующих полетов. возможно это простое решение и по эффективности возможно лучшее
на сколько я понял, эта сборка стоит у него прямо в/на моторе
Все оказалось немножко сложнее, чем выглядит на первый взгляд.
Вариант “кольцевой буфер” с последовательной записью всех данных работает.
но из за попадания в буфер ошибочных данных, выпадают целые обороты мотора.
не сильно критично, но не приятно, это может составлять до 0,1 секунды.
если в буфер помещать только данные без ошибок, возникает коллизия
никак не получается обойти “неопределенное состояние”, это самое начало работы мотора,
когда мотор только начинает крутится, данные идут совсем хаотичные.
И при резком изменении оборотов, то же самое, гувернер вырубается.
Он тупо не понимает, какие данные верные, а какие с ошибкой.
А нам для гувернера, на сколько нужно считать обороты? Можно привязаться к каким либо другим параметрам, которые прямо или обратно пропорциональны оборотам? Например KV , известен, количество банок аккумулятора тоже. Напряжение на фазе при изменении нагрузки меняется, или всегда постоянно?
Что касается датчика холла расположенного среди других магнитов, внутри мотора, или рядом с ним, как то сомнительно. Надо датчик и магнит, по которому считаются обороты, выносить за пределы магнитного поля мотора… Или делать как на машине, на коленвалу, зубчатый шкив из магнитного сплава и по зубцам считать обороты
напряжение меняется, но не сильно.
там не столько меняется напряжение, сколько амплитуда и частота
на этих графиках видно. желтые это фазовые сигналы при разных оборотах
надо еще подумать, если пойму откуда лишние импульсы на выходе ОУ,
может получится с ними побороться без программных изысков
Лишние импульсы, могут быть корректировкой. Например регулятор считает, что нужный магнит должен прилететь на следующий зуб через 0,2секунды, а он из-за нагрузки , или перегазовки , прилетает , через 0,4 секунды, и чтобы провернеуть мотор дальше, отправляет дополнительный импульс, который выпадает из алгоритма.
Такое может быть? Или у меня фантазия разыгралась уже?))))
Скетч от простейшего регулятора на Атмеге, может чем поможет …
// Управление бесколлекторным двигателем постоянного тока без датчиков на ATmega48 #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include <avr/wdt.h>
// Фаза U(Верхнее плечо) #define UH_ON TCCR2A |= (1 << COM2A1); #define UH_OFF TCCR2A &= ~(1 << COM2A1);
// Фаза U(Нижнее плечо) #define UL_ON PORTB |= (1 << PB5); #define UL_OFF PORTB &= ~(1 << PB5);
// Фаза V(Верхнее плечо) #define VH_ON TCCR1A |= (1 << COM1B1); #define VH_OFF TCCR1A &= ~(1 << COM1B1);
// Фаза V(Нижнее плечо) #define VL_ON PORTB |= (1 << PB4); #define VL_OFF PORTB &= ~(1 << PB4);
// Фаза W(Верхнее плечо) #define WH_ON TCCR1A |= (1 << COM1A1); #define WH_OFF TCCR1A &= ~(1 << COM1A1);
// Фаза W(Нижнее плечо) #define WL_ON PORTB |= (1 << PB0); #define WL_OFF PORTB &= ~(1 << PB0);
#define PHASE_ALL_OFF UH_OFF;UL_OFF;VH_OFF;VL_OFF;WH_OFF;WL_OFF;
#define SENSE_U ADMUX = 0; // Вход обратной ЭДС фазы U #define SENSE_V ADMUX = 1; // Вход обратной ЭДС фазы V #define SENSE_W ADMUX = 2; // Вход обратной ЭДС фазы W
#define SENSE_UVW (ACSR&(1 << ACO)) // Выход компаратора
#define START_PWM 50 // Минимальный ШИМ при запуске
unsigned char position, speed; volatile unsigned char commutation_step = 0; volatile unsigned char rotor_run = 0; // Счетчик импульсов обратной ЭДС
// Крутим по часовой стрелке void commutation(char startup) { switch (commutation_step) { case (0): if(!SENSE_UVW || startup) { UH_ON; // На фазе U - ШИМ WH_OFF; // Фаза W отключена SENSE_W; // Активируем вход фазы W commutation_step = 1; // Следующий шаг TCNT0 = 0; // Обнуляем счетчик T1 } break;
case (1): if(SENSE_UVW || startup) { VL_OFF; // На фазе V - лог. 0 WL_ON; // На Фазе W - лог. 1 SENSE_V; // Активируем вход фазы V commutation_step = 2; TCNT0 = 0; // Обнуляем счетчик T1 } break; case (2): if(!SENSE_UVW || startup) { UH_OFF; // Фаза U отключена VH_ON; // На фазе V - ШИМ SENSE_U; // Активируем вход фазы U commutation_step = 3; TCNT0 = 0; // Обнуляем счетчик T1 } break; case (3): if(SENSE_UVW || startup) { UL_ON; // На фазе U - лог. 1 WL_OFF; // На Фаза W - лог. 0 SENSE_W; // Активируем вход фазы W commutation_step = 4; TCNT0 = 0; // Обнуляем счетчик T1 } break; case (4): if(!SENSE_UVW || startup) { VH_OFF; // Фаза V отключена WH_ON; // На фазе W - ШИМ SENSE_V; // Активируем вход фазы V commutation_step = 5; TCNT0 = 0; // Обнуляем счетчик T1 } break; case (5): if(SENSE_UVW || startup) { UL_OFF; // На фазе U - лог. 0 VL_ON; // На Фазе V - лог. 1 SENSE_U; // Активируем вход фазы U commutation_step = 0; TCNT0 = 0; // Обнуляем счетчик T1 } break; }
}
// Обработчик прерывания по компаратору. Детектор обратной ЭДС ISR(ANALOG_COMP_vect) { if(rotor_run == 200) commutation(0); rotor_run++; if(rotor_run > 200) { rotor_run = 200; wdt_reset(); } }
// Обработчик прерывания по переполнению Т0. Работа двигателя без сигналов обратной ЭДС ISR(TIMER0_OVF_vect) {
commutation(1); // Если сработало прерывание, есть пропуски импульсов обратной ЭДС rotor_run = 0; // Сбрасываем счетчик импульсов OCR1A = START_PWM; // ШИМ минимум OCR1B = START_PWM; OCR2A = START_PWM; }int main( void ) { //Watchdog on wdt_enable(WDTO_1S);
// Порты ввода/вывода DDRB = 0xFF; // Порт B - выход PORTB = 0x00;
// T0 - для старта и работы двигателя без сигналов обратной ЭДС TCCR0A = 0; TCCR0B = 0; TCCR0B |= (1 << CS02)|(1 << CS00); // Предделитель на 1024 TIMSK0 |= (1 << TOIE0); // Разрешаем прерывание по переполнению T0
// T1 и T2 ШИМ TCCR1A |= (1 << WGM10); // Режим Fast PWM, 8-bit TCCR1B |= (1 << CS10)|(1 << WGM12); // Без предделителя
TCCR2A |= (1 << COM2A1)| // Сброс вывода OC2A при совпадении (1 << WGM21)|(1 << WGM20); // Режим Fast PWM TCCR2B |= (1 << CS20); // Без предделителя
PHASE_ALL_OFF; // Выключаем все фазы
ADCSRB |= (1 << ACME); // Отрицательный вход компаратора подключаем к выходу мультиплексора АЦП DIDR1 |= (1 << AIN0D);
sei(); // Глобально разрешаем прерывания
while(1) { cli(); position = ADMUX; // Сохраняем позицию ротора в буфер ADMUX = (1 << MUX1)|(1 << MUX0); // Вход ADC3
ADCSRA |= (1 << ADEN) | (1 << ADPS1)|(1 << ADPS0); // Разрешаем АЦП, предделитель на 8 ADCSRA |= (1 << ADSC); // Запускаем преобразование АЦП while(ADCSRA & (1 << ADSC)){}; // Ждем окончания преобразования speed = ADC/4; ADCSRA = 0; // Выключаем АЦП ADCSRB = 0; ADCSRB |= (1 << ACME); // Отрицательный вход компаратора подключаем к выходу мультиплексора АЦП ADMUX = position; sei();if(speed > START_PWM) { ACSR |= (1 << ACIE); // Разрешаем прерывание от компаратора TIMSK0 |= (1 << TOIE0); // Разрешаем прерывание по переполнению T0
if(rotor_run == 200) { // Если импульсы обратной ЭДС присутствуют, крутим наполную OCR1A = speed; OCR1B = speed; // Изменяем ШИМ OCR2A = speed; } } else { PHASE_ALL_OFF; // Все фазы выключены ACSR &= ~(1 << ACIE); // Запрещаем прерывание от компаратора TIMSK0 &= ~(1 << TOIE0); // Запрещаем прерывание по переполнению T0 }
} }
Это маловероятно,
я совсем забыл, что в моей схеме ОУ работает без обратной связи, в режиме насыщения,
с Ку (коэф. усиления) стремящемся к бесконечности (в идеале)
А некоторые ОУ в таком режиме, при стечении обстоятельств в виде совпадения “сигналов на входах”
могут кратковременно “переворачивать” (инвертировать) сигнал на выходе.
как варианты
- забить и продолжить изыскания в области программной фильтрации ошибочных данных
- взять другую модель ОУ, не факт что поможет, ЕМНИП в больше или меньшей степени этому подвержены все ОУ
- добавить обратную связь, для уменьшения Ку, тогда придется сразу прикручивать и формирователь сигнала, потому как на выходе ОУ будет синусоида, что усложнит схему, но совсем не факт, что вылечит )
до весны еще далеко, а процесс на месте не стоит.
кучку деталек и кусок текстолита уже купил, так что новую плату сотворить не долго,
заодно дорисую место для установки модуля гироскопа
может чем поможет …
посмотрю, но без схемы …
посвятил пол дня поиску косяка, повторил схема на макетке
и пронаблюдал траблу на осциллографе.
точно такая картинка наблюдается и на прототипе.
такие всплески с еще большей амплитудой проскакивают,
в том числе и на ниспадающем фронте и вызывают срабатывание прерывания.
на макетке купировать удалось, скорее всего не на 100 процентов,
но процентов 85 помех не пропустить на вход МК удалось,
а это значит, что количество ошибочных данных уменьшится на порядок.
ну и вот, на выходе имеем первое приближение
Гувернер на базе Ардуино Нано.
Датчик оборотов пока собран на макетной плате.
Требуемые обороты в программе указываются в оборотах/минуту.
В программе установлено две полки оборотов, 2000 и 3000.
После старта гувернеру передается команда на установку оборотов 2000 об/минуту,
через пять секунд посылается новая команда - 3000 об/мин
и еще через пять секунд новая команда - 2000 об/минуту.
Все остальное делает программа.
2000 и 3000 проверял оптическим тахометром, все в пределах погрешности, заложенной в программе,
на данный момент это примерно 6 процентов, но что то мне подсказывает, что дельту можно убрать.
Сегодня поменяю конденсаторы на прототипе кросс платы и она должна заработать так же )
Собственно говоря, регулировка построена на изменении длительности сигнала PWM на входе регулятора,
на основании данных с датчика оборотов мотора, построенного на операционном усилителе.
Датчик фиксирует прохождение обмоток регулятора над магнитами.
Программа сравнивает текущие обороты мотора с требуемыми и в зависимости от результата сравнения
увеличивает или уменьшает длительность импульса сигнала PWM.
в общем прототип тоже работает,
осталось причесать программу и можно встраивать в таймер
рисую новую версию кросс-платы, появился вопрос.
может стоит на плате разместить кнопку управления и пару светодиод для индикации ?
пока на плате место есть
Пару диодов можно, а вот кнопку, которая со временем начнет звинеть, думаю не надо…
которая со временем начнет звинеть,
это маловероятное явление, звон возможен только в момент нажатия/отпускания,
кроме того, количество срабатываний на отказ у кнопок достаточно велико,
в том числе и у китайских.
у меня Уно уже лет десять работает, кнопку Reset топтал не меренное количество раз )
А зачем эта кнопка нужна на кросс плате? Есть штатная кнопка на ардуино. Так же кнопка нужна на корпусе модели, тем более если модель объемная и мотор под капотом.
И еще касательно прошивки, хорошо бы добавить возможность отключения кросс платы, отключения гироскопа, гувернера, акселерометра, чтобы можно было летать как в простом , так и в активном режиме, включая и отключая нужные датчики, по одному или все сразу.
Кстати на счет акселерометра, может имеет смысл, на кросс плате разместить место для него, вместо кнопки. Акселерометры периодически всплывают в продаже на али.
А вот гироскоп наверное имеет смысл размещать по центру тяжести модели. Хотя и не обязательно.
А зачем эта кнопка нужна на кросс плате? Есть штатная кнопка на ардуино.
штатная - RESET, от нее ни тепло ни холодно, да и закрыта она росс платой получается.
а нужна кнопка управления, старт-стоп ну и мало ли что еще.
отключения гироскопа, гувернера
режим без GYRO и GOVER будет, как и без одного из них,
но предстоит разобраться с логикой
Кстати на счет акселерометра
MPU6050 - это 3-х осевой гироскоп + 3-х осевой акселерометр
А вот гироскоп наверное имеет смысл размещать по центру тяжести модели.
нет никакого смысла, его задача угол тангажа измерять не более того
MPU6050 - это 3-х осевой гироскоп + 3-х осевой акселерометр
Вот тогда было бы не плохо эти функции разделить, при необходимости.
Не факт, что гироскоп в полете заработает правильно… Ибо его еще надо правильно по осям установить. Или в программе пофиг , по какой оси меняется угол?
Коллеги, подскажите пож-та. Хочу перейти c Turnigy/FrSky с телеметрийным модом на OpenLRS. Почитал дневники в первом посте, но сходу не нашел информацию:
- Есть ли поддержка телеметрии (аналогичной FrSky) в прошивке байчи, или это нужно к openLRSng?
- В чем ключевое различие между прошивкой байчи и openLRSng?
- Где купить нормальный 1W передатчик не слишком дорого (можно ли брать с HK и переделывать чтобы ВЧ модуль был на 5В? - есть ли где-то описание переделки?).
- Аналогично - где купить 1W приемник.
- Какие LPF фильтры лучше поставить на передатчик/приемник, чтобы исключить влияние 1.2G видео.
разархивируем архив в папку например 111
двойным кликом запускаем файл OpenTiny_Rx.ino
среда ардуино сама скажет что файл находится “не там” и предложит создать папку и скопировать туда файлы
если в новую папку скопируются не все файлы, ручками туда их докинуть
после этого всё должно работать нормально
Можно поподробнее? Я тоже прошил под Рмилек и фьзы правил как в этой теме советовали E-fuse - FD, Low=DE, High=DC. Так на удалении 500 метров могу ловить ФС
Фьюзы не трогал,пока не освоил,залил тупо готовый хекс под рмилек,причем в три приемника,и не один дальше 500 м не работает,антенны делал разные.Решил пока сделать ретранслятор из оранжа и тут засада,счас пытаюсь бутлоудер залить,так как на мониторе нет никакой инфы из оранжа ТХ,значит нет и прошивки…Папки правил,нижний прочерк стоит,как разберусь,напишу что было.Всем спасибо,особенно Шурику 😃
если в новую папку скопируются не все файлы
По-любому скопируются не все. Ардиуна копирует только .ino.
Заработало,все было просто-залил бут через меню ардуино 1.0.1 burn bootlоader что в меню tools.Заливал через переходник прямо одетый на мегу ( www.hobbyking.com/hobbyking/…/uh_viewItem.asp?idPr… ) ,затем этой прогой unlouder залил хекс oetx27hetx328 скачанный с гитхаба , все заработало.Смотрел меню что там настроено через меню в ардуино 1.0.1. (нажимать вкладку serial monitor или ctrl+shift+m) Дальше выскакивает меню ,если надо изменить первый параметр вводим 1,жмем энтер и вводим нужную нам цифру(например 100 ) и опять жмем энтер. Внизу около скорости (38400 надо поставить) есть окошко в нем надо поставить carriadg return. По умолчанию настройки правильные,можно летать. Всем спасибо.
и не один дальше 500 м
Это странно. Раньше на этой же проше я спокойно улетал на 5 километров практически с полным РССИ. А тут приемник взял другой такой же и беда 0_о
Ощущение что я летаю с оторванной антенной
Так как очень чуткий РССИ стал к положению самолета в воздухе.
Я грешу на передатчик,поставил 1200 мГц,и все приемники рядом были на коптере,счас поставил фильтр,но погода не дает разгуляться,пойду ногами измерять расстояния.Отпишусь.
Фьюзы не трогал,пока не освоил,залил тупо готовый хекс под рмилек,причем в три приемника,и не один дальше 500 м
Для правильной работы РФМ нужно настраивать коррекцию частоты. Это указывается во втором регистре у Байчи. У Рмлека не знаю.
В том то и проблема,что на этой прошивке все по стоку,ничего не строится,надо на страничку рмилека переходить с этими вопросами.Оранж на 100 мВт с прошивкой Александра у меня что то не хочет пробивать 1 км.Полезу настраивать коррекцию частоты.
У Рмлека не знаю.
У Рмилека есть автонастройка чатсоты (перемычка в 1 канал и ждем). Попробовал. Надо выйти в поле потестить. О результатах отпишусь)
В том то и проблема,что на этой прошивке все по стоку,ничего не строится
Кстати, да. Меня тут просили прошить оранж под рмилек, так он вообще почти не работал: 99% пакетов терял. Думаю из-за того, что у него аномально большая поправка частоты. Около 211 в байчевских единицах.
А прошивка рмилека это никак не учитывает.
В описании натсроек Рмилека оранжа есть пункт “автоподстройка частоты” под передатчик. Попробовал сделал. Еще не испытывал. Но факт что прошлый мой приемник оранж прошитый под Рмилек работал не хуже оригинального рмилека. И что значит поправка частоты? В Оригинальном приемнике Рмилек чип стоит точно такой же как в оранже. И настроек никаких нет и все замечательно работает.
И что значит поправка частоты?
Поправка емкости конденсатора при осциляторе. Даташит на RFM22B, регистр 09h.
Автоподстройка имеет свои пределы и если частота TX и RX сильно разбежались, может не сработать.
Я понимаю. Но как тогда реализовали это в оригинальном приемнике? Все работает без всяких ручных поправок. Либо при каждом включении Рмилик производит поправку частот. Если это так, то в последней прошивке под Рмилек добавили эту функцию, только делается она один раз после бинда.
Более точно может подсказать атвор прошивки.
Но как тогда реализовали это в оригинальном приемнике?
Как самое очевидное и простое решение - прошивать эту поправку при производстве, т.к. она индивидуальна для каждой RFMки.
Менял этот чип в оригинальном приемнике на другой заказанный с ебея. Разницы не заметил. Либо повезло что “совпало” либо другой алгоритм…
Естественно может совпасть.
Андрюх, у Байчи в приемнике коррекция автоматически подстраивается, в принципе можно в ручную и не настраивать.
Видно через терминал - пишет на сколько.
у Байчи в приемнике коррекция автоматически подстраивается
Пробовал. Нифига на автомате ничего толкового не вышло( Приходилось в ручную прописывать регистры.
Какие регистры? Там один регистр за это отвечает.
Если разбег не слишком сильный - работает отлично.
Так в том то и дело что приходилось считывать регистры каналов передатчика, и прописывать в ручную их в приемник. В автомате приемник с ужасным расбросом все находил.
Точно щас не скажу какие, так как прошивкой Баучи уже давно не пользуюсь.
Мы о совершенно разных регистрах говорим.
А вы поподробнее пожалуйста,нам интересно какие регистры и что с ними делать. Сейчас тестил пешком -оранж с Байши прошивкой 200 м по земле, с рмилек прошивкой 100м (модуль 100 мВт) ,родной рмилек устал идти (метров 500 точно).Приемник на земле лежал,передатчик на пузе. Совсем запутался…Буду дальше разбираться.
все ваши тесты полная хрень, в плане “ходил, метров 500…”
в прошивке от Байчи более чем достаточно средств для диагностики…
например параметр “А”, что он у вас кажет?
что говорит статистика по уровню и шумам?
я думаю сейчас будет встречный вопрос, “а что это?”
не поленитесь почитать мануалы…
Да,Вы правы,пока разобрался только с прошивкой , мануал прочел бегло,точно из-за этого и купил рмилек и не стал ставить эксперта с его количеством настроек(это супер,но голова все не вмещает) .А практика всегда нужна,да и ходить полезно 😃
ну оранж после моей прошивки работает сразу, настраивать ничего не надо
проверьте, что вы теряете?