Датчик тока "allegro" и его использование с Arducopter

Почему именно датчик “allegro”, его отличия от датчиков предлагаемых для Ardupilot

  • относительно дешевый (порядка 200р в элитане www.elitan.ru/price/index.php?seenform=y&find=+ACS…)
  • доступны чипы со шкалой на ±50 и ±100 ампер
  • высокая точность измерения, линеризованый выход
  • низкое внутреннее сопротивление (порядка 130 наноом)
  • гальваническая развязка (исключение импульсных помех, изоляция от силовой цепи)
  • возможность измерения и заряда и разряда (рекуперация энергии на самолете)
  • минимальная обвязка (rc-фильтр в цепи выхода)

Сенсор имеет гальваническую развязку от измеряемой цепи, но в отличие от классических датчиков тока показывает не только разряд батареи но и ее заряд (например рекуперация энергии на самолетах)
однако изза этого при нулевом значении тока на выходе ровно половина питающего напряжения (у классических датчиков автопилота 0) тоесть 2,5 вольта.

чтобы исправить это недоразумение необходимо изменить код прошивки

defines.h change

#define CURRENT_AMPS(x) ((x*(g.input_voltage/1024.0))-g.curr_amps_offset)*g.curr_amp_per_volt

parameters.pde add

// @Param: AMP_OFFSET
// @DisplayName: current sensor zero calibration
// @Description: in volts
GSCALAR(curr_amps_offset, “AMP_OFFSET”, CURR_AMPS_OFFSET),

parameters.h added

k_param_curr_amps_offset = 193,

AP_Float curr_amps_offset;

//#ifndef CURR_AMPS_OFFSET
# define CURR_AMPS_OFFSET 0.0
//#endif

готовый архив с измененными исходниками и HEX файл прошивки квадрокоптера для APM2 тут

обновлено 2.09.2014
Актуальные прошивки и самолета и коптера уже включили в себя этот код и поддерживают биполярные датчики тока с офсетом 2.5 вольта
вертолет:
copter.ardupilot.com/wiki/arducopter-parameters/#A…

самолет: plane.ardupilot.com/wiki/arduplane-parameters/#AMP…

так выглядит актуальная версия готового изделия:

  • 15234
Comments
Dokz

Здорово. Я б сказал, расчудесно! Будем повторять. А напряжение как сейчас измерять в платах 2.5 и 2.0? С APM 1.0 все понятно, а тут…

fidller

хе, традиционный вопрос - а готовое решения не продаете?

masonx

соединение опасное… лучше на проводке коротеньком. у меня такое соединение через пол года разошлось коптер об землю упал больно

alexeykozin

собственно одна микруха - и есть готовое решение если учесть что силовые разъемы у всех разные.
пара кондеров обвязки и резистор непроблема даже для новичка.
я поставил резистор 1,5 ком и кондер 0,1 но поразмыслив решил что логично ставить побольше от 1 до нескольких мкф
при желании чтобы все было на печатной плате - отрезается кусочек фольгированного текстолита и ножиком прорезается фольга.
сигнальный провод - звуковой шлейф от компа. он экранирован и уже обжат остается лишь переставить контакты и откусить четвертое гнездо(или переставить контакты в колодку от сервы).

датчик напряжения по схемам ардупилота - обычный делитель напряжения из двух резисторов, необходимо обеспечить номиналы таким образом чтобы на порт analog 0 напряжение не превышало 5 вольт. тоесть для 3s батареи порядка 1:3. например к резистору 2ком подключен плюс батареи, к другому его концу сигнальный провод порта “a0” (в апм2 и 2.5 рядом с датчиком тока, по диагонали от разъема жпс) резистор 1ком от этой точки на gnd. для усреднения измеряемой величины можно навесить конденсатор 1-4,7мкф в параллель резистору 1ком.

у такого, классического вольтметра два недостатка

  1. напряжение измеряется не побаночно, если у одной банки батареи осталось 3,0 вольта а у двух других по 3,6 то сумарно это 10,2 и казалось бы еще летать и летать, но фактически еще несколько секунд и просаженная батарея упадет в ноль. поэтому измерять надо побаночно и минимальный результат умножать на количество банок - это будет достоверное предостережение о разряде.
  2. у такого вольтметра нет гальванической развязки с силовой цепью и дублирующая земля к массе в точке измерения напряжения может привести к токовой петле со всеми неожиданными последствиями.
    Поэтому вольтметр буду тоже делать, но на отдельной маленькой ардуинке, она будет измерять побаночно, выдавать на выходе шим модуляцию, при разряде любой из банок до 3,2 шим сигнал будет 0% а при полном заряде 100%. шим легко пропустить через оптопару - их полно в старых бп - это обеспечит гальваническую развязку. перед аналоговым входом можно поставить RC фильтр преврашающий шим сигнал в напряжение.
    такой вольтметр будет лишен выше обозначенных недостатков

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

targetorsk

элетан к стати не плохой магазин но +200 рэ доставка получается 400рэ за датчик на ebay 450руб за два по 100A 😃
P.S. Если кто надумает брать в elitan.ru укажите в поле скидка 0000086467675380 и получите скидку 5%

alexeykozin

они еще 4% берут за формирование заказа, но если кому в москве надо, пишите мне, я часто у них детали заказываю - можно сэкономить на доставке
kozin@mail.ru

alexeykozin

две новости, обе хорошие.

  1. мне подсказал товарищ что аллегро выпускает как сенсоры с биполярным выходом - о котором идет речь так и униполярные - у них диапазон значений выхода от 0 до 5 вольт, а это значит перепрошивка практически не нужна

  2. разработчик ардукоптера Andrew Tridgell пообещал включить патч в следующий релиз новость отсюда

OlegIv

Где писать вот это?
//#ifndef CURR_AMPS_OFFSET
# define CURR_AMPS_OFFSET 0.0
//#endif

alexeykozin

если соответствующую строку написать так:
GSCALAR(curr_amps_offset, “AMP_OFFSET”, 0.0f),

то константу CURR_AMPS_OFFSET декларировать не нужно

OlegIv

Не получается выставить не целое число в таблице для параметра AMPS_OFFSET. В чем может быть проблема? Где можно почитать про калибровку датчиков напряжения батареи и тока? Прошу прощения за нубские вопросы.

alexeykozin

да в статье в принципе все подробно описано. разделитель целой и дробной части точка?
задается смещение в вольтах начальное значение для аллегро примерно 2.5 этим значением нужно достичь нулевых показаний при отсутствии тока через сенсор. а затем обеспечиваете стандарный ток через сенсор, например 10А контролируете точным амперметром, и параметром amp_per_volt достигаете чтобы показания в списке параметров были такими же как на амперметре (в списке параметров ток с сотыми долями а не округленно до целых как в главном экране)

OlegIv

Огромное спасибо, настроил! Разделитель был точкой, не записывался, с запятой получилось.

nikr

Повторил датчик и столкнулся с такой проблемой. параметр AMP_OFFSET, записанный через parameter list держится только до выключения питания. Правда у меня не родной контроллер, а crius aio pro v1.1
Записать константу как # define CURR_AMPS_OFFSET 2.487 ? Или есть другой путь, чтобы можно было настраивать?

nikr

вроде бы разобрался, в мегапирате 193 адрес занят под k_param_failsafe_battery_enabled.
Записал k_param_curr_amps_offset = 195 .

Игорь_Зен

Алексей, спустя некоторое время, какие номиналы оптимальны для C(f) и R(f)?

alexeykozin

резистор ставлю 3-5 ком, кондер 2-10 мкф, можно и сотню мкф поставить - врядли почувствуете вялость реакции датчика

kren-DEL
alexeykozin;bt95004

да в статье в принципе все подробно описано. разделитель целой и дробной части точка?
задается смещение в вольтах начальное значение для аллегро примерно 2.5 этим значением нужно достичь нулевых показаний при отсутствии тока через сенсор. а затем обеспечиваете стандарный ток через сенсор, например 10А контролируете точным амперметром, и параметром amp_per_volt достигаете чтобы показания в списке параметров были такими же как на амперметре (в списке параметров ток с сотыми долями а не округленно до целых как в главном экране)

Попробовал прикрутить сенсор - почему-то пришлось офсет задрать до 3.1, а ампер на вольт до 150, при пропускании тока 6А планер пишет -6А, т.е. инвертирует знак… как побороть, кроме как менять полярность/перепаивать. На сенсоре на выходе 2.5В

UPD. ХМ, при подаче нагрузки, в планере показывает, что увеличивается напряжение… мистика какая-то, питаю основную плату от юсб, надо будет снять все напряжения - но это только завтра, может где-то инвертировано оно у меня… или общей земли просто нету… надо собрать рабочий вариант, на стенде что-то не учтено…

VovanACBR

подскажите плиз. датчик сделал и поключил на А2. как теперь его прописать? вообще не понимаю куда писать эти комнанды.

kren-DEL
Vovan@CBR;bt102335

подскажите плиз. датчик сделал и поключил на А2. как теперь его прописать? вообще не понимаю куда писать эти комнанды.

Эти строки кода необходимо прописать в соотв. файлы в исходном коде прошивки, какая у вас прошивка?

VovanACBR

сейчас стоит 3,0,1-rc1

я вроде немного разобрался - надо править 3 файла
defines.h изменить
parameters.pde добавить
parameters.h добавить

также если я правльно понял надо в фале
APM_Config.h дописать # define CONFIG_APM_HARDWARE APM_HARDWARE_APM2

можете плиз подтвердить больше ничего делать не надо и я делаю то что надо

после этого скомпилить и залить в АМР

alexeykozin

сначала нужно попробовать скомпилировать исходный неизмененный код чтобы убедиться что библиотеки стоят ровно и компилятор нужной версии, потом править

VovanACBR

да
походу исходник не компилится
C:\ardupilot-master\libraries\AP_Param\AP_Param.cpp: In static member function ‘static bool AP_Param::scan(const AP_Param::Param_header*, uint16_t*)’:
C:\ardupilot-master\libraries\AP_Param\AP_Param.cpp:472: error: ‘__UINT16_MAX__’ was not declared in this scope

VovanACBR

итак эту ошибку победил. но после того как все обновил не компилится
вот

sensors.ino: In function ‘void read_battery()’:
sensors:123: error: ‘class Parameters’ has no member named ‘input_voltage’

что не хватает?

VovanACBR

это гдето тут?
было #define CURRENT_AMPS(x) (x->voltage_average()-CURR_AMPS_OFFSET)*g.curr_amp_per_volt
стало #define CURRENT_AMPS(x) ((x*(g.input_voltage/1024.0))-g.curr_amps_offset)*g.curr_amp_per_volt в файле parameters.h указано что данная переменная удалена
k_param_input_voltage, // deprecated - can be deleted

что сейчас использовать?

kren-DEL

не парьтесь, вот отредактированные файлы для прошивки 2.9 r300
их необходимо просто распаковать в папку ардукоптера

VovanACBR

дело в том что у меня 3,0,1-rc1
там поменяли переменные
надо прописать вот так
#define CURRENT_AMPS(x) (x->voltage_average()-g.curr_amps_offset)*g.curr_amp_per_volt

kren-DEL

можно воткнуть так: в файле parameters.h:

// 110: Telemetry control
        //
        k_param_gcs0 = 110,
        k_param_gcs3,
        k_param_sysid_this_mav,
        k_param_sysid_my_gcs,
        k_param_serial3_baud,
        k_param_telem_delay,
        k_param_curr_amps_offset, //!added

        //
        // 140: Sensor parameters
        //
 AP_Int8         battery_volt_pin;
    AP_Int8         battery_curr_pin;
    AP_Int8         rssi_pin;
    AP_Int8         throttle_accel_enabled;      // enable/disable accel based throttle controller
    AP_Int8         wp_yaw_behavior;            // controls how the autopilot controls yaw during missions
    AP_Float        curr_amps_offset; //!added

а остальное вроде всё есть

alexeykozin
Vovan@CBR;bt102594

эти файлы были к конкретной версии ардукоптера, со временем количество параметров возросло.

чтобы скопмилировать нужно прочитать мануал по компиляции в ардуино в википедии ардукоптера
там используется специфичный компилятор, нужно обязательно скопировать библиотечки от последней версии кода, задать в настройках HAL тип контроллера

VovanACBR

это файлы которые я правил под версию 3,0,1-рц1 (я их успешно залил и теперь есть в системе датчик тока). после того как потратил неделю на то чтобы понять что вообще править
прощу заметить - в последней версии названия переменных поменялись

alexeykozin

выложил готовый HEX файл Arducopter 3.0.1 rc1 для квадрокоптера c параметром регулировки офсета для биполярного датчика тока.
сам файл не тестировал
hobby.msdatabase.ru/project-updates/…/arducopter - во вложении внизу страницы

после загрузки обязательно setup reset в терминале. кто попробует - отпишитесь

100xanoff

Мне нужен 150-200А на большую окту…

Алексей, какой из этих датчиков взять? Биполярный или униполярный, при том что у меня регули с рекуперацией…
www.allegromicro.com/en/Products/…/ACS758.aspx

alexeykozin

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

alexeykozin

сделал свою ветку на житхабе, чтоб предложить код под этот датчик к включению в официальную прошивку,
все внес, отправил на рассмотрение мастеру… вобщем если одобрят - ненужно будет дописывать в каждой свежей прошивке

VovanACBR

да, я там сразу отметился. посмотрим внесут или нет

alexeykozin

рэнди обещал в следующем релизе освободить место за счет исключения оптического сенсора и внести поддержку аллегро

parahawk
alexeykozin;bt86460

две новости, обе хорошие.

  1. мне подсказал товарищ что аллегро выпускает как сенсоры с биполярным выходом - о котором идет речь так и униполярные - у них диапазон значений выхода от 0 до 5 вольт, а это значит перепрошивка практически не нужна

Подскажите ссылку на униполярные сенсоры в Элитане.

100xanoff

А вот как его заставить работать на PX4, там нужно +3.3v а не 5, можно конечно купить ACS759, но их только на заказ можно приобрести…
Или просто поставить 150А, он на 100А выше 3.3 и не поднимется?!

alexeykozin

все зависит от аппарата, средне- эффективный коптер в 2 кг весом висит на 20а при 3 банках, в пике 50а, чем больше банок тем меньше ток, куда вам 100-150А?
vis.asta, известный своими квадролетами способными провести в воздухе более двух часов ставит сенсоры тока корпусном исполнении sot-8
я заказываю в элитане, ижевск, шлют почтой около месяца

alexeykozin

униполярные отмечаются букой U после номинала по току
к примеру в поиск ACS758KCB-150U-PFF-T@ALLEGRO
простите, пропустил ваш вопрос

100xanoff
alexeykozin;bt112369

все зависит от аппарата, средне- эффективный коптер в 2 кг весом висит на 20а при 3 банках, в пике 50а, чем больше банок тем меньше ток, куда вам 100-150А?
vis.asta, известный своими квадролетами способными провести в воздухе более двух часов ставит сенсоры тока корпусном исполнении sot-8
я заказываю в элитане, ижевск, шлют почтой около месяца

Алексей, у меня окта на SUNNYSKY X4112S 400KV (максимум 20А), т.е. всего 160А
И квад тоже на SUNNYSKY X4112S 400KV (максимум 20А), т.е. всего 80А

Т.е. на кваде я могу поставить датчик на 150А, запистать от бека, а выход пустить на 3,3v вход PX4 ???

alexeykozin

вы максимальный ток считаете по предельным значениям регулей?
всего общий ток висения аппарата весом в 2 кг от трех банок порядка 20А , ну пусть 50А-60А в режиме максимальной тяги
если моторы 400 кв то наверное банок 5-6?
при 6 банках 4кг аппарат висит на этих же токах

alexeykozin

по идее можно сделать делитель 5 вольтового выхода до 3,3
всего два резистора)

100xanoff
alexeykozin;bt112405

вы максимальный ток считаете по предельным значениям регулей?
всего общий ток висения аппарата весом в 2 кг от трех банок порядка 20А , ну пусть 50А-60А в режиме максимальной тяги
если моторы 400 кв то наверное банок 5-6?
при 6 банках 4кг аппарат висит на этих же токах

Нет, я считаю по таблице тестов ВМГ.

Спасибо, наверное делитель самое простое решение…

% ручки газа, ток, тяга, обороты

100xanoff

Алексей, а делитель напряжения с 5 до 3.3 ставить после конденсаторов или можно до?

Вот так?

И зачем на схеме минусовой провод Ip?

alexeykozin

IP+ это плюс батареи
IP- это плюс нагрузки (регулятора оборотов)
датчики тока включаются в разрыв одной токоведущей жилы, преимущественно разрывают плюсовую

если делитель поставить после конденсатора то столь больших сопротивлениях возможны наводки на сигнальный провод,
лучше поставить до конденсатора, либо добавить еще один конденсатор небольшой емкости (0.1 мкф) после делителя

100xanoff

Спасибо.

Что-то громоздко получилось…)

Фотографии в альбоме «Коптер2» STOXANOFF на Яндекс.Фотках


innd
alexeykozin;bt102939

рэнди обещал в следующем релизе освободить место за счет исключения оптического сенсора и внести поддержку аллегро

судя всего дальше обещаний дело не пошло?

alexeykozin

Пошло, всежие прошивки поддерживают установку офсета сенсора тока в 2,5 вольта

innd

а через какой параметр? что-то я видимо плохо искал )

usup

а по питанию 0.1мкф обязательно ставить?