MidnightDreamer писал(а):
LTagKirov писал(а):
Удалось ли побороть этот эффект ?
Нет, на этой простенькой аналоговой схеме это вряд ли получится, а усложнять не хочется ) В одиночном режиме на заряженном аккумуляторе проскакивает по два выстрела ) (на видео видно).
Пробовал делать тоже самое с контролем проседания напряжения АКБ с помощью АЦП в МК, и получается один в один такой-же глюк, правда раз в 5 реже. Причину вижу в том что напряжение за один выстрел - один раз "проседает" и два раза "подскакивает": первый момент "подскока" срыв зуба с поршня, а второй когда срабатывает встроенная механическая отсечка для одиночных выстрелов. Если просто игнорировать второй "подскок" , то непонятно как быть с автоматической очередью, получаем неопределённость если стреляем короткими очередями, три шарика вылетело а мигнули всего два раза
Сейчас делаю с задержкой, но при разряде АКБ всё время меняется скорострельность механизма и временные отрезки так просто не подобрать. Можно всё это побороть без задержек если делать не адаптивные пороги а фиксированные, но такое решение работает только от блока питания на столе, на разряжающемся АКБ всё опять перестаёт пищать/светить. Есть ещё вариант ставить питание МК в разрыв цепи мотора, тогда глюк автоматически исчезает(логику поведения описывать не буду, лень) - так сделано во всех китайских страйкбольных блоках контроля длинны очереди, но у нас-то лазертаг: выключать схему после того как отпустили курок ни разу не логично
PS. Отбор давления воздуха из ствола позволяет однозначно определить движение поршня, но здесь опять получаем операцию сверления ствола (0,5..1мм) где-то под цевьём и установки датчика, теряем всю прелесть быстрой интеграции - просто подключится к АКБ уже не получиться.
Код:
// Слежение за нагрузкой мотора, убрал 4января 2014
#define AKB_DW_TOL 100 // точность принятия решений по падению АКБ ~1.2В
#define AKB_UP_TOL 20 // подавление помех на АЦП при выключении ~0,2В
adc_in = ADC;
// считанное значение, обновляется N раз в секунду
// максимальная частота дискретизации примерно 250/13 = 19кгц
// Включили мотор, напряжение падает
if ((adc_in + AKB_DW_TOL) < adc_dwn ) {
adc_dwn = adc_in;
btMotor = 1; // сработал мотор
}
// При снятии нагрузки с АКБ (выключении мотора)
// поднимаем порог слежения до текущего напряжения
if (adc_in > (adc_dwn + AKB_UP_TOL)) {
adc_dwn = adc_in;
// флаг работы мотора можно очистить
// больше нигде этот флаг не изменяется
btMotor = 0; // мотор выключаем
} // или поршень спрыгнул с зуба