Jump to content

САБ

Members
  • Content Count

    1424
  • Joined

  • Last visited

  • Days Won

    1

САБ last won the day on July 23 2012

САБ had the most liked content!

Community Reputation

419 Отличная

1 Follower

About САБ

  • Rank
    Гуру
  • Birthday 07/13/1973

Contact Methods

  • ICQ
    1581411
  • Skype
    dushevny

Дополнительная информация

  • Место в рейтинге
    341
  • Конфигурация компьютера
    ASUS A53S i3 2.3GHz/4GB/630GB notebook

Profile Information

  • Gender
    Male
  • Location
    Рига
  • Interests
    Разработка встраиваемых систем (embedded).

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. Стандартная схема включения - это как? Это когда на СКТ подаются два синуса, а с обмотки возбуждения снимается сигнал рассогласования и мотор крутится до минимизации сигнала рассогласования? Почему не получится поднять синусоиду? Процессор у вас вроде бы шустрый и загружен не сильно - оцифровывайте почаще и делайте ДПФ. На выходе получите амплитуду и фазу. Мне на ATmega88 это было недоступно, ваш процик и не заметит, наверное.
  2. У меня точно так же как и у вас на один конец синусной и косинусной обмоток подается половина питания (не знаю как у вас, у меня - с резистивного делителя). Я оцифровываю сигнал со вторых концов обмоток в моменты примерно 1/4 T и 3/4 T от начала периода. Допустим, с одной обмотки в первый момент считалось значение 700, во второй - значение 250, итого разница, т.е. размах сигнала на этой обмотке - 700-250 = 450. Со второй обмотки в первый момент считалось 100, во второй 920, разница между ними 100-920 = -820, а угол поворота СКВТ, соответственно, atan2(450, -820) = -28.75 градуса (если калькулятор не врет). Причем такой угол я получу и в случае, если я с первой обмотки считаю 600 и 150, а со второй - 0 и 820, т.е. если я на первые выводы подам не 1/2 питания, а 0.45 или 0.6 - лишь бы сигнал на втором конце обмотки при любом угле поворота не выходил за допустимые для АЦП пределы.
  3. Я генерю синус ШИМом, при питании 27В получается около 19 В 400 Гц. Двигателям хватает, хотя, конечно, от 36 В они бы крутились шустрее. Но основная мысль была не о синусе, а о двух измерениях и вычислении их разности, которая позволяет не учитывать напряжение на общей точке обмоток СКВТ/сельсина.
  4. Понятно. Я делал аналогично, но возбуждал синусом, который все равно генерится для двигателей. А выходы индикаторных обмоток подавал на АЦП через резистивные делители, чтобы привести амплитуду ко входному диапазону АЦП. Кроме того, я делаю оцифровку дважды за период - на максимуме и минимуме, затем вычитаю один результат из другого получая размах от минимума до максимума, независящий от абсолютной величины напряжения на общем выводе обмоток.
  5. Секрет фирмы или можете поделиться подробностями?
  6. Можно подробнее? А то может я на работе что-то неправильно делаю (мои устройства вин10 пропускает и даже драйвера сама ставит)?
  7. Слабо понимаю, что такое "изменение времени с ускорением", но если это ускорение времени - то и лампа будет мигать пропорционально быстрее. А как надо?
  8. Тогда задачу можно сильно упростить. Достаточно взять текущее время сима в секундах, умножить его на два и остаток от деления на два и будет результатом "горит-не горит". Осталось понять, как в Lua получить остаток от деления.
  9. А, у вас одна мигалка на все лампы. Тогда да. Вспоминаю, что у Ми-2 действительно одна мигалка на все лампы. В современных ЛА, подозреваю, каждая система может иметь свою мигалку, никак не синхронизированную с другими. У меня реализован именно такой вариант - каждая лампа может мигать со своим периодом и длительностью независимо от других. Используя один и тот же код. И все нужные для этого переменные хранятся внутри замыкания.
  10. Может кому пригодится - код обработки команд, написанный для Костиной (bm906) кабины Ми-2: --[[ устанавливает propety_ref в значение on_value в момент начала выполнения команды cmd_name и в значение off_value в момент окончания выполнения команды cmd_name --]] local function setup_command(off_value, on_value, cmd_name, property_ref, description) local function create_handler(off_value, on_value, property_ref) return function(phase) -- собственно обработчик команд -- пишем в property новое значение только если оно изменилось -- phase == 1 пока кнопка нажата if phase == 0 then -- phase == 0 в момент нажатия set(property_ref, on_value) elseif phase == 2 then -- phase == 2 в момент отпускания set(property_ref, off_value) end return 1 -- возможны другие обработчики этой команды end end -- ищем команду среди существующих, если не найдена - создаем, регистрируем обрабочик и указываем -- ему вызывать функцию, которую возвращает (создает) замыкание (closure) create_handler() registerCommandHandler(findCommand(cmd_name) or createCommand(cmd_name, description or ""), 0, create_handler(off_value, on_value, property_ref)) end -- setup_command(<значение отпущенной кнопки>, <значение нажатой кнопки>, <команда>, <датареф>, <необязательное описание датарефа>) setup_command(0, 1, "xap/akkumnaset", globalPropertyf("sim/custom/xap/switch_shina"), 'переключатель шины двойного питания "сеть на аккумулятор"') setup_command(1, 2, "xap/akkum", globalPropertyf("sim/custom/xap/switch_battery"), 'переключатель источника питания "наземное/аккумулятор"') setup_command(0, 1, "xap/gen1", globalPropertyf("sim/custom/xap/switch_generator_l"), 'выключатель левого генератора') setup_command(0, 1, "xap/gen2", globalPropertyf("sim/custom/xap/switch_generator_r"), 'выключатель правого генератора') setup_command(0, 1, "xap/ampermetr", globalPropertyf("sim/custom/xap/switch_amp"), 'переключатель амперметра "левый генератор/аккумулятор"') -- ......... -- setup_command(3, 0, "xap/DC_volt_check_left", globalPropertyi("sim/custom/xap/switch_amp_gen"), 'переключатель замера напряжения, положение "левый генератор"') setup_command(3, 1, "xap/DC_volt_check_bat", globalPropertyi("sim/custom/xap/switch_amp_gen"), 'переключатель замера напряжения, положение "аккумулятор"') setup_command(3, 2, "xap/DC_volt_check_right", globalPropertyi("sim/custom/xap/switch_amp_gen"), 'переключатель замера напряжения, положение "правый генератор"') страшно вспомнить, какая тарелка с макаронами из copy-paste тут была изначально (420 строк на 31 команду превратились в 109 строк на 77 команд).
  11. Дело не столько в универсальности, сколько в том, что если у вас сегодня одна мигалка - завтра их будет две, три, десять. Конечно, их можно размножать методом copy-paste, но к гадалке не ходи - хотя бы в одном месте вы забудете поле copy-paste поменять название переменной или потом решите поменять режим работы и поменяете его в 9 местах из 10 и будете долго искать, почему же одна лампа работает неадекватно. У меня же код один-единственный на все мигалки и его исправление влияет на все лампы одновременно. Да и работать с коротким кодом приятнее, чем с простынями копий.
  12. Вот писал давно из головы, могут быть опечатки: defineProperty("actual_time", globalPropertyf("sim/time/total_running_time_sec")) -- текущее время local function blink(property_ref, on_time, off_time) -- функция, создающая замыкание (closure) для мигалки -- локальные переменные конкретной мигалки local Property = createGlobalPropertyf(property_ref, 0, false, false) -- ссылка на датареф local Cycle_start_timestamp = get(actual_time) -- время начала цикла local Cycle_period = on_time + off_time -- период мигалки local Current_state = 0 -- текущее состояние -- собственно функция мигания, ее возвращает замыкание и именно она будет вызываться. return function(time_now) local Cycle_time = time_now - Cycle_start_timestamp if Cycle_time > Cycle_period then -- цикл закончился, начинаем новый Cycle_start_timestamp = Cycle_start_timestamp + Cycle_period Current_state = 1 set(Property, 1) elseif Cycle_time > on_time and Current_state ~= 0 then Current_state = 0 set(Property, 0) end end end -- создаем мигалки: local Beacon = blink("pnv/tr_light/beacon", 0.5, 0.5) -- 0.5 сек. горит, 0.5 сек. не горит local Strobe = blink("pnv/tr_light/srobe", 0.1, 0.7) -- 0.1 сек. горит, 0.7 сек. не горит function update() -- читаем текущее время один раз для всех мигалок local Now = get(actual_time) -- собственно мигаем Beacon(Now) Strobe(Now) end Как видно, все локальные переменные спрятаны внутри замыкания и можно легко добавить сколько угодно мигалок - на добавление каждой новой мигалки требуется дописать всего две строчки. Мигание привязано к текущему времени сима, которое не зависит от частоты кадров. Lua изучал по этой ссылке: Learn Lua in 15 Minutes
×
×
  • Create New...