avatar_ReSoNaNCe

Как сделать эмуляцию ручки газа электровелосипеда на arduino

Автор ReSoNaNCe, 01 Дек. 2015 в 15:39

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

ReSoNaNCe

Здраствуйте! Я новичек в микроэлектронике, делал несколько мелочей на Ардуино. Сейчас у меня есть идея сделать душилку к своему 3.5Kw электровелосипеду. Так сказать легализироватся:) Чтобы по желанию я мог ехать на легальных мощностях, а по желанию вкачивать все киловатты.
Нет желания разбирать контроллер, и что-то сложное там паять.
Собираюсь делать таким образом:
Соединить ардуино с курком газа, и с контроллером. И давать контроллеру уменьшенные показания газа, если текущая мощность выходит за рамки установленного лимита.

Контроллер: Китайский 45А
Батарея: 72V 10Ah LiPo
Мотор: Crystalite 3540HS
Ручка газа: Курок с холлом

У моего контроллера есть выход на Cycle Analyst. Посмотрел что за разьем,
*Battery positive (or ignition wire if your controller has one)
*Battery negative (ground)
*Shunt negative
*Shunt positive
*Hall sensor signal
*Throttle signal wire

Получается я могу:
1) взять показания шунта и батарейного напряжения, вычислить теущую мощность, и если >250W задушить газ.
2) взять показания холла, вычислить скрость, если выходим за рамки 25kmh, задушить газ.

Вопрос как именно это делать?
Как заэмулировать курок? AnalogWrite или DigitalWrite? надо ли соединять с чем-то ground, сколько давать итд..
Как снять показания холла курка и скорости?
Как правильно посчитать амперы и вольты чтобы ничего не спалить при первом эксперементе?
Как правильно посчитать скорость?

Что-то я нашел в интернете, чтото вроде понял и сам, но хочется услышать ответ знающих людей:)
Заранее спасибо!
3.5kw setup: Giant NRS 2, Crystalyte HS3540, Noname 18fet 45A, LiPo 20s 10Ah, 80km/h

erazer

ЦитироватьВопрос как именно это делать?
Как заэмулировать курок? AnalogWrite или DigitalWrite? надо ли соединять с чем-то ground, сколько давать итд..
Как снять показания холла курка и скорости?
Как правильно посчитать амперы и вольты чтобы ничего не спалить при первом эксперементе?
Как правильно посчитать скорость?

эмулировать с помощью AnalogWrite значение может быть от 0 до 255 (0-5v соответственно), DigitalWrite не подойдет поскольку принимает 2 значения hi или lo.
с курком замерьте сколько выдает при 25км\ч, лучше всего прицепить ардуину с дисплейчиком и посмотреть значения в реальном времени.
для управления ручку придется ставить в разрыв через ардуину.
замерять напряжение через делитель чтобы на выходе было не более 5 вольт и пересчитывать.
с током также, стандартные шунты обычно 50 милливольт на 1 ампер.
со скоростью еще проще, смотрим количество импульсов на оборот колеса, замеряем длинну окружности, соответственно узнаем сколько проходит колесо за 1 имульс.

ReSoNaNCe

Спасибо!

А в разрыв чего именно ставить ардуину? Дата провода от курка?


Не подскажете что использовать в качестве делителя? у меня есть пачка совсем мелких (~5мм) резисторов разного номинала. Могу ли я их использовать, и какое сопротивление мне примерно нужно чтобы спустить 84в в 5в?

Про шунт я так понял в моем случае, максимальная разница потенциалов 2.25в? (45А * 50мВ / 1000)
Тоесть тут никаких делителей ненужно, просто на прямую подключить, AnalogRead, так и считать?
3.5kw setup: Giant NRS 2, Crystalyte HS3540, Noname 18fet 45A, LiPo 20s 10Ah, 80km/h

erazer

Цитата: ReSoNaNCe от 01 Дек. 2015 в 20:18
Спасибо!

А в разрыв чего именно ставить ардуину? Дата провода от курка?


Не подскажете что использовать в качестве делителя? у меня есть пачка совсем мелких (~5мм) резисторов разного номинала. Могу ли я их использовать, и какое сопротивление мне примерно нужно чтобы спустить 84в в 5в?

Про шунт я так понял в моем случае, максимальная разница потенциалов 2.25в? (45А * 50мВ / 1000)
Тоесть тут никаких делителей ненужно, просто на прямую подключить, AnalogRead, так и считать?

http://cxem.net/calc/calc.php тут есть калькуляторы.
R1 200Ком можно больше, R2 на калькуляторе, примерно 11Ком получится. по мощности резисторов любые, токи там никакие. только мелкие номиналы не ставте нагреватель получится.
да ставить в разрыв данных и землю ардуины соединить с землей контроллера.
и откуда сама ардуина питатся будет.
с шунтом я бы для начала померил что он выдает под нагрузкой в 5-10а, неизвестно что туда наши братья китайцы поставили может там и 1v=1a.

ReSoNaNCe

Напряжение/расход замерил, газ считал, холлы считал, столкнулся с проблемой.

При попытке заэмулировать ручку газа, мотор работает с перебоями. каждую секунду-две, сам отпускает газ и дает снова. Это происходит даже если просто записать в пин среднее положение analogWrite(3,127);

В чем может быть дело? Может быть ШИМ? контроллеру не нравится что напряжение идет быстрыми пульсациями? Когда кручу  напрямую от ручки, колесо крутится гладко. Контакты в порядке, весь вечер провозился.
Попробывал конденсатор одной ногой на землю другой на данные, кажется 100mF 25v, но не помогло.
Есть какой-то способ полностью продублировать сигнал ручки? И почему такое еще может происходить, и как решить проблему?

Вобще получается очень даже, думаю потом выложу исходники и инструкцию:) получается вполне  себе борткомп за 5 долларов:)
3.5kw setup: Giant NRS 2, Crystalyte HS3540, Noname 18fet 45A, LiPo 20s 10Ah, 80km/h

erazer

да скорее всего контроллеру шим не нравится, нужен rc фильтр на частоту шима.
100мкф очень много нужно около 1-2мкф точнее емкость зависит от частоты шим.
вот примерная схема фильтра
или попробуйте пустить сигнал через дроссель.

ReSoNaNCe

#6
Спасибо, более менее заработало без 100R, с ним всеравно дергалось. Подергивания правда всеравно есть, надеюсь со временем разобратся почему. Может осцилографом надо посмотреть какие именно там шумы. Может быть когда мотор начинает работать, наводки какие-то идут.

Так-же добавил алгоритмы сглаживания на входящие данные, все стало плавнее работать. Но вяло стал отзыватся на ручку газа.

Проблемка еще одна есть, - когда отключаю ручку от input пина, на нем скачут показания. тоесть read с пустого аналогового пина, возвращает не 0, как я ожидал, а 200 и больше. По этому при обрыве, или другой проблеме с проводкой, велосипед поедет сам и его будет не остановить :/ Может есть какие-то хитрости? через резистор с землей соединить? если да то какой номинал выбрать?

Для делителя напряжения сначало использовал мелкие резисторы 7500 и 500 ом. От 84 вольт они сразу грелись, а от 68 какоето время оставались холодными.  Потом почитал про делители, и взял резисторы по толще и номинал побольше. 15000 и 1000. Пока полет нормальный :) Это может питать саму ардуину? Или надо еще одну понижайку до ~8 вольт, и питать через power порт? Или действительно от ручки газа запитать..
3.5kw setup: Giant NRS 2, Crystalyte HS3540, Noname 18fet 45A, LiPo 20s 10Ah, 80km/h

erazer

ЦитироватьТак-же добавил алгоритмы сглаживания на входящие данные, все стало плавнее работать. Но вяло стал отзыватся на ручку газа.
задержку надеюсь не через delay реализовали.

ЦитироватьПроблемка еще одна есть, - когда отключаю ручку от input пина, на нем скачут показания. тоесть read с пустого аналогового пина, возвращает не 0, как я ожидал, а 200 и больше. По этому при обрыве, или другой проблеме с проводкой, велосипед поедет сам и его будет не остановить :/ Может есть какие-то хитрости? через резистор с землей соединить? если да то какой номинал выбрать
да подтянуть к земле резисторм 2-10Ком

ЦитироватьДля делителя напряжения сначало использовал мелкие резисторы 7500 и 500 ом. От 84 вольт они сразу грелись, а от 68 какоето время оставались холодными.  Потом почитал про делители, и взял резисторы по толще и номинал побольше. 15000 и 1000. Пока полет нормальный :) Это может питать саму ардуину? Или надо еще одну понижайку до ~8 вольт, и питать через power порт? Или действительно от ручки газа запитать..
лучше отдельная дисишка например на LM2596HV (до 60 входное) или если уже есть дисишка 12v можно от нее.

ReSoNaNCe

Все delay вобще убрал, кроме момента когда пользователь нажимает кнопки. Там с delay было проще сделать.

Задержку такой формулой:

int average_factor = 5;
sensor_value_1 = analogRead(battery_pin);
sensor_value_1 = (old_sensor_value_1 * (average_factor - 1) + sensor_value_1) / average_factor;
old_sensor_value_1 = sensor_value_1;


плюс - простота реализации без циклов итд.
минус - мы никогда не получим именно то значение которое пришло на пин. Получим лишь значение которое будет к нему стремится. На практике различие бывает на 5-7 единиц, и с нуля на 512 - поднимается около пол секунды до 450 и еще пол секунды+ до 512. от того и тормознутая реакция на ручку газа. Я привык что моментально. Над этим еще подумаю:) Если есть какие-то предложение, с удовольствием выслушаю:)

К земле подтяну :) Cпасибо, а-то реально страшно тестить в боевых условиях))

про питание - у меня фара на 8,4в, все время подключенна через родную 220в зарядку напрямую в батарею, и дополнительно имеет свой маленький аккум 2x18650. И УСБ так-же есть на велике. От чего-то из этого запитаю :)

3.5kw setup: Giant NRS 2, Crystalyte HS3540, Noname 18fet 45A, LiPo 20s 10Ah, 80km/h

erazer

попробуйте считать среднее арифметическое. вот пример.
определяем переменные.
int mean;  // здесь будем вычислять среднее арифметическое
long oldTime;  // с помощью этой переменной будем определять момент очередного обращения к АЦП

В loop() пишем:
if(millis()-oldTime>10) { // наступило время опрашивать АЦП?
oldTime = millis();     // приготовимся к следующему опросу
mean = mean*9/10+analogRead(PIN); // а теперь собственно опрос и подсчет среднего арифметического последних 10 результатов
}

Waldemar

#10
Слежу за вашей темой. Планирую подобного плана алгоритм юзать, правда немного с другой целью. Как успехи? Удалось рассчитать RC-фильтр? Я особо не разбираюсь, но в документации нашёл что частота ШИМ у Ардуино составляет 490Гц, это означает что вам нужен конденсатор на 1мкФ и резистор на 330ом, приблизительно. Победили ли запоздалую реакцию на ручке газа?

апдейт: мне тут знающие люди подсказали что для того чтобы сделать сигнал полностью линейным и исключить влияние ШИМа Вам необходимо использовать операционный усилитель. Вот как в этой схеме http://www.gammon.com.au/images/PWM_to_Analog3.png
Единственный минус, там надо подавать >7В питания на него. Как вариант можно использовать ОУ rail-to-rail, например AD822.
Что касается номиналов RC-фильтра, мои расчёты не верны, нужны номиналы как приводили Вам выше т.е. чтобы порог был несколько Герц.
Merida Sub 40 + Bafang SWXF5
Format 1214 + Keyde 36V170RPM, 52V12Ah
Scott E-Aspect 710
Scott E-Genius 720 Plus 2016

peat

А чем не устраивает аналоговый ограничитель сигнала на обычном диоде ? Или на худой конец на компараторе ?
Выставили резистором  душилку и то и дело включаете резистор и выключаете тумблером. Или Переключаете тумблером между  прямвм сигналом до душилки и после.
Вся проблема в том что если софт глючнет или зависнет то есть шанс сорваться со светофора бесконтрльно на перерез потоку..или с обрыва куданить. То есть для безопасности  параллельно должна стоять схема контроля на еще одном микроконтроллере, если уж сигнал идет через контроллер.
Самое простое решение - пустить ШИМ с контроллера через конденсатор. Если контроллер ручки повиснет , то конденсатор не даст постоянной составляюще пройти на выход демодулятора ШИМ и через секунду на выходе  будет ноль.

MaF

Я б еще вывел на руль кнопку,под палец,чтоб в случае чего экстренно заглушить мотор.
Модератором может быть лишь человек с холодной головой, горячим сердцем и чистыми руками.
Если какого-то качества нет - начинаются проблемы.

peat

Пускать аналоговый сигнал через самопальную плату на контроллер на мощных конфигах оправдано в случае если нужно поменять кривую отклика. Например с кривой ручки газа на линейную или экспоненту. Тем более делать это без средст контроля работы чипа и защиты довольно опасно. По вышеописанной схеме , если контроллер виснет , его выход может встать в  двух состояний - или лог1 (полный газ) или лог0 (выкл мотора). Для защиты от такого косяка нужно ставить конденсатор , тогда если зависнет на  лог1 , то постоянная составляющая не пройдет на выход и мотор дергнется и через несколько десятых секунды выключится.
Еще бы не мешало включить сторожевой таймер в контроллер. В случае зависа , через пол секунды контроллер перезапускается.
Далее , контроллер нужно выбирать с аппаратным ШИМ. Если на выходе 400 герц то там программный ШИМ. 400 генрц это очень мало. Будет большое время зхадержки. 3-5 килогерц было бы оптимальным.

mr.Dream

#14
Аппаратный шим можно поднять до килогерц, прописав в сетап предделитель таймера
Если прописать
TCCR1B = TCCR1B & 0b11111000 | 0x02
Буедет ШИМ с частотой 4 КГц

FobOrgan

[user]ReSoNaNCe[/user], я когда думал на эту тему, то хотел использовать 16 бит таймер, например чтобы  считал до 1024, при этом ШИМ будет около 15кГц. На выходе RC фильтр, при такой частоте он будет маленький. И нагрузочный резистор значительно меньшим сопротивлением чем вход газа контроллера, но чтобы не просаживал напряжение сильно. Откалибровать всё это дело, но ещё дополнительно пином измерять напряжение на выходе, чтобы подгонять его под напряжение входа точнее. Т.е. делаем таблицу напряжения вход-выход, чтобы сразу грубо выставить чуть меньшее напряжение выхода при каком то входном. А потом плавненько подгоняем до точного значения. По идее при реализации с таймером весь этот цикл может обсчитываться раз 100 в сек, если микроконтроллер больше ничем не занят. Ну и форма ШИМа не будет портиться, а то вот вы сейчас вставите кусок кода посложнее куда-нибудь и он у вас станет по-другому работать.
Мне тоже хочется иметь красную кнопку для законности. Но пока я свой ваттметр изобретаю. С измерением ручки газа поигрался, но дальше пока не пошло.
Езжу на 2хQ100/1200Вт/14Sx18Ач Li-ion уже 33300км за 9 лет

electronic

Есть желание сделать простому китайскому контроллеру токовое управление на Arduino. Пока использовать данные с шунта батарейного тока, тем более, что у меня сигнал с него усиливается лм-кой. На сферах находил апппаратную реализацию такой задумки с положительным отзывом владельца. Вот его схема:

Вопрос: если я буду сравнивать сигнал с ручки газа и с шунта (конечно в нужной пропорции) и выдавать на цифровой выход (на вход контроллера) 0 или 1 правильно ли будет отрабатывать вся обратная связь через контроллер? Или нужно городить ЦАП и как-то плавно выводить сигнал?
Электромот V1 (с доработками: 9 кВт, 76 В, 70 км/ч)

i

думаю, что если контроллеру нужно на входе аналоговый сигнал, то его и нужно подавать, а не надеется на "авось пронесет".
простейший ЦАП=ШИМ+RC (НЧ фильтр)