"Бортовой компьютер своими руками" или "Arduino для "чайника""

Автор Yaroslav, 16 Окт. 2017 в 19:30

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

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

Dmitry__

Цитата: mr.Dream от 21 Окт. 2017 в 15:09
Тут больше ошибка измерений будет от малой частоты пересчета, и ее нужно делать относительно большой, а не раз в секунду.
Дельта-сигма тем и хороша что она сама интегрирует данные, нет наложения спектров (алиасинг) , но конечно надо вкл. внутр. фильтр и включать непрерывный режим
Цитата: mr.Dream от 21 Окт. 2017 в 15:09
Допустим, на батарее я проезжаю 50км ровно.  Сильно ли изменит ситуацию, если я не доеду 200 метров из за 0,4% ошибки измерения ?
Если остановиться на часок, а потом поехать, то ошибка будет не 0.4%, a 400% :) Интегрирование ошибки...

mr.Dream

Цитата: Dmitry__ от 21 Окт. 2017 в 15:48
Если остановиться на часок, а потом поехать, то ошибка будет не 0.4%, a 400% :) Интегрирование ошибки...
что то вы сильно утрируете :) Если остановиться, то никакой ошибки и не будет. Если речь идет за разрядность ацп, то эта ошибка разве только на малых токах будет влиять (фонарь, скажем).  Но если нужно имеь прибор, способный мерить милиамперы слаботочного потребления на фоне 100А "рабочих", то да, ads11xx тут более приемлемо, проще и дешевле хорошого инструментального ОУ.  Для каждой цели - свое решение. Я исхожу из названия темы. Если бы была цель создать сразу полноценный суперпроцессиональный борткомпьютер - то и рекомендации были бы другими. Но человек хочет поучиться, попробовать. А хорошие идеи придут в процессе.
ВОт у меня была задача - мерить пиковый ток мотора, зная батарейный ток и скважность ШИМ, и по нему делать ограничение. А еще была задача грубо считать ампер*часы батареи, чтобы приблизительно знать остаток энергии в батарее.  Ардуина и лм358 был под рукой, с этого и деллал. от 1А до 50А показания совпадали с ваттметром тюрниджи, на меньшем токе был небольшой "подьем" показаний ближе к нулю, и вместо нуля было пару процентов, так как искуственно задрал смещение нуля, чтобы вывести в линейны режим, а в программе просто эту разницу компенсировал, кроме того - не считал ток меньше 200мА, так как не нужно было.

Dmitry__

Цитата: mr.Dream от 21 Окт. 2017 в 16:10
что то вы сильно утрируете :) Если остановиться, то никакой ошибки и не будет.
Не утрирую, учесть все моменты с накоплением интеграла очень сложно. Но всякая нелинейность делает из ваттметра кусок ненужной кЕтайской какашки, коих у меня предостаточно :)
Когда делал гироскоп с минимальным дрейфом на крутом мемс от аналогдевиц (ADIS16250), то у меня в программе были 64 битные аккумуляторы для перевода угловой скорости в абсолютные углы, и то все уплывало через 5 минут.
Может и получается и слишком "с запасом", но если начинать от встроенных возможностей микроконтроллера, а потом понять что нужен учет энергии, то весь проект можно будет выкинуть и начинать с нуля. Тем более внешние ацп как раз проще для новичка, правильно собирать аналоговую схему с ацп и схемами нормирования сигнала надо еще уметь, а тут просто кубики. ..

Yaroslav

#39
Слепил кусок кода, пока без ads1115.
В протеусе работает. Что скажете? Может нужно что изменить, или улучшить?
кусок кода
// Время обновления показаний
#define PERIOD  200

// Аналоговые входы
#define PIN_VOLT A0
#define PIN_AMP A1


const float VRef = 5.0149;                            // Опорное напряжение 5в
const float Divider = (100.0 + 5.1) / 5.1;            // Коэффициент делителя (R1 + R2) / R2.
const float Shunt = 1.7;                              // Сопротивление шунта.
float InVolt, Volt, InAmp, Amp, Div, Watt, WtP, WtH;

void setup() {
  // Инициализация дисплея
  lcd.begin (16, 2);
  lcd.clear();
  lcd.print("V=");
  lcd.setCursor (9, 0);
  lcd.print("A=");
  lcd.setCursor (0, 1);
  lcd.print("W=");
  lcd.setCursor (9, 1);
  lcd.print("WH=");
}

void loop() {
  // Чтение из порта с усреднением
  unsigned long ReadTime = millis();
  int Count = 0;
  InVolt = 0;
  InAmp = 0;
  while ((millis() - ReadTime) < PERIOD) {
    analogReference(DEFAULT);
    InVolt += analogRead(PIN_VOLT);
    analogReference(INTERNAL);
    InAmp += analogRead(PIN_AMP);
    Count++;
  }
   InVolt = InVolt / Count;
   InAmp = InAmp / Count;

  // Обработка данных
  Volt = InVolt * Divider * VRef / 1023;
  Amp = (InAmp * 1.1 / 1023 / Shunt) * 1000;
  Watt = Volt * Amp;
  WtP += Watt;
  WtH = WtP /(1000 / PERIOD) / 3600;
 
  // Вывод данных
  lcd.setCursor (2, 0);
  lcd.print(Volt, 2);
  lcd.setCursor (11, 0);
  lcd.print(Amp, 2);
  lcd.setCursor (2, 1);
  lcd.print(Watt, 0);
  lcd.setCursor (12, 1);
  lcd.print(WtH,0);
}
Строю лигерад

Dmitry__

Лучше в будущем уходить от плавающей точки. Во-первых сразу прибавится или 2 или 4 кб. (не помню точно), а во-вторых обработка плав. точки для 8-ми битной аврки - ад и Израиль :)
А так: код как код, протеусу полностью верить не стоит, лучше все в железе проверять...


edw123

Цитата: Dmitry__ от 21 Окт. 2017 в 16:37...
Когда делал гироскоп с минимальным дрейфом на крутом мемс от аналогдевиц (ADIS16250), то у меня в программе были 64 битные аккумуляторы для перевода угловой скорости в абсолютные углы, и то все уплывало через 5 минут...
Круто, круто, особенно "для чайников". :-D Повышая точность там, где нет для этого никаких жизненно важных оснований (хотя бы исходя из природы измеряемого процесса) мы создаём лишние бесполезные сущности, не говоря о затратах денег, времени и возможной головной боли по лишнему анализу причин отклонений суперточной величины от очевидной. :exactly:
Не, батарейка часто кончается "за 100м до дома" :), но и бензин в 50л баке аналогично. Не в точности измерометра проблема.

Dmitry__

Ну если у тебя самокат имеет аккум 20ач, стоИт 10 часов и потребляет 1 ампер, а прибор видит 0 ампер. За 10 часов сьедается пол аккума 10ач, ферштейн? :)

edw123

Цитата: Dmitry__ от 21 Окт. 2017 в 22:23
Ну если у тебя самокат имеет аккум 20ач, стоИт 10 часов и потребляет 1 ампер, а прибор видит 0 ампер. За 10 часов сьедается пол аккума 10ач, ферштейн? :)
Йа, йа, но не настолько всё плохо в жизни. И куча более прагматичных ситуаций , когда всё будет в ажуре.

Dmitry__

Куда еще прагматичней? Это при ошибке 1% от полной шкалы 100 ампер - полный разряд аккума за сутки. А по прибору еще можно ехать 40 км :)
Нафиг нужен такой компьютер?

edw123

Цитата: Dmitry__ от 21 Окт. 2017 в 22:46
Куда еще прагматичней? Это при ошибке 1% от полной шкалы 100 ампер - полный разряд аккума за сутки. А по прибору еще можно ехать 40 км :)
Нафиг нужен такой компьютер?
При ошибке в 0.1% если самокат простоит 1000часов, то батарея окажется разряженной полностью. Неожиданно. :eek:
Да я и не уговариваю, просто размышляю над разумной степенью чайниковости...

mr.Dream

Был у нас когда в городе то небольшой фотоклуб, сайт с фотогалереей, форум, организовывали встречи. Подавляющее большинство - начинающие фотографы и просто любители. Потом туда "пришли" свадебные бомбилы, и начали всем тереть, что мол композиция не та, свет не тот, цвет не тот, шумы, ГРИП, динамический диаазон, поза, контрастность, насыщенность, ракурс, детали, да все не то. Вот смотрите, мол, как надо! Показывали идеальные на их взгляд и фотоканонам снимки. Но все они были шаблонные, ничем не отличались от остальной серой массы. В результате большиснтво участников покинули клуб, так как начали считать себя неполноценными. Сайт загнил. Форум молчит. Про живые встречи и речи не идет.  А если бы все было по другому, никто не указывал "как надо", а если чуть не так - то уже брак? Возможно, и до сих пор клуб был бы жив. Как по мне, там много интересных личностей было, для которых фото - не профессия, и они не пытались сделать идеальный кадр, а для них это хобби, возможность себя реализовать творчески.
Аналогично и здесь. Если бы это было инженерное бюро и ставилась цель сделать прецезионный ваттметр... но топик создан для абсолютно другого. Ярослав, бери и делай - только сразу в железе. Практика - лучший учитель. Понимание того, что именно нужно, придет со временем.  А насчитает он 20 или 20,5 А*ч - это мелочи. Направление ветра на порядки больше "искажает" показания, нежели дрейф ОУ и дискретность АЦП :)

Dmitry__

Цитата: mr.Dream от 21 Окт. 2017 в 23:49
Был у нас когда в городе
Тем не менее, ТС больше понравился мой совет, а не грабли lm358... :)  :kidding:

Yaroslav

Что то математик с меня хреновый, время между импульсами вроде получил, но никак не могу перевести его в об/мин, туплю постоянно.
Кто знает как это сделать?
void setup() {
  attachInterrupt(0, impuls, RISING);    //внешние прерывания по фронту импульса на входе D2 и вызов функции "impuls"
}

void impuls(){
  tImpuls = micros() - tImpuls2;
  tImpuls2 = micros();
}

void loop() {
Speed = tImpuls ????;
}
Строю лигерад

mr.Dream

[user]Yaroslav[/user], частота = 1 / период :)
ну а далее переводить из секунд в часы, подставлять длину окружности. Но чтобы не было очень "странных" результатов, единицу заменить некоторой константой, чтобы не оперировать очень маленькими числами.

TRO

#50
[user]Yaroslav[/user], Взять минуту в тех же еденицах и поделить на время между импульсами.

Я когда делал свой ваттметр, ушел от секунд, и привязался к часам (ибо еденицы отсчета ваттчасы, амперчасы, километры в час). В итоге опрос и приращение накопительных счетчиков (избыточной разрядности) происходит 10 000 раз в час (через каждые 0,36 секунды). На экран все выводится путем перемещения запятой и отбрасыванием лишних десятичных знаков.

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

Wahoo 2012 29er, +собран складной двухосис на раме"Land Rover" 69er с эл. мотором, и и МОНОКОЛЕСО

FobOrgan

[user]Yaroslav[/user], когда будете считать пробег, то в ардуине нет типов данных больше 4 байт, так что если завести переменную пробега в миллиметрах и прибавляя к ней периметр колёса в мм общий пробег на типе unsigned long пойдёт на второй круг после примерно 4500км, что для электровела мало.
Так же и с float нужно аккуратно, если начнёте считать приращение разных тат Втч и Ач за какие то сотые-десятые секунды, то  могут получаться очень микроскопические значения, которые будут просто считаться нулём. Их нужно будет считать и суммировать отдельно пока не "вырастут" до удобоваримых и потом прибавлять к общему счётчику. Mr Dream именно это имел ввиду.
Езжу на 2хQ100/1200Вт/14Sx18Ач Li-ion уже 33300км за 9 лет

Yaroslav

С делением на очень маленькие значения уже сталкивался, понял что они за ноль считаются)
Строю лигерад

Yaroslav

Со скоростью вроде разобрался, вышло так:

  Speed = ((1000000 / tImpuls) / 23) * 1.73 * 60 / 1000;

Только что то мне не очень нравится эти микросекунды периода засекать потом этот пересчет. В МК не заливал но протеус знатно тормозит при 400 оборотах, это ж 9200 импульсов. Может тормоза из за эмуляции, может в ардуинке не будет тормозить? В общем завтра проверю на железе.
Строю лигерад