avatar_ArtDen

Переделка курка на менее резкий старт

Автор ArtDen, 19 Июль 2019 в 18:34

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

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

zelen50

Цитата: edw123 от 21 Июль 2019 в 20:45Главное алгоритм закодировать.  Паять - как хочется и из чего хочется, что есть под рукой. Можно из Пика, СТМ, Ардуино...
Самое простое это на ардуино. конкретно в данной ситуации - Digispark ATtiny85.
бывают люди совы, бывают люди жаворонки, а Я человек перепел, обычно через букву И

zelen50

Цитата: kor от 22 Июль 2019 в 09:53использовать еще сигналы оборотов и тока (например батарейного) с обоих моторов (задавать курком и поддерживать (программой) например отношение: мощность потребления мотором/обороты мотора (фактически это получается момент)).
 Не планируете ли вы такое, например на дешевой плате Ардуино?
[user]kor[/user], Вы сначала посмотрели бы сколько стоят датчики тока на 50 ампер, https://ru.aliexpress.com/item/32762700834.html?spm=a2g0o.cart.0.0.63833c00Fc4aBN
А после этого решали, нужны ли Вам такие траты.
бывают люди совы, бывают люди жаворонки, а Я человек перепел, обычно через букву И

kor

Цитата: zelen50 от 22 Июль 2019 в 10:40Вы сначала посмотрели бы сколько стоят датчики тока на 50 ампер
Для этого не обязательны  такие датчики тока, достаточно подходящих резистивных шунтов (например кусок провода константана или нескольких смд резисторов в параллель) в минусовом проводе питания каждого контроллера ( на подобии такого, как сделано в аккумуляторной бмс), и простой схемы на ОУ.

edw123

Цитата: zelen50 от 22 Июль 2019 в 10:40
[user]kor[/user], Вы сначала посмотрели бы сколько стоят датчики тока на 50 ампер,
А после этого решали, нужны ли Вам такие траты.
В контроллерах шунт и так есть.

zelen50

для всех желающих Ардуино программа для ручки газа.


//  программа для Digispark ATtiny85
//  Digispark ATtiny85 имеет всего 6 ног
//  P0 - PWM0 / AREF / MOSI / SDA
//  P1 - PWM1 / MISO
//  P2 - A1   / SKL  /  SCL
//  P3 - A3   / USB+
//  P4 - A4   / USB -
//  P5 - A0
//
//
//
//

static unsigned int Gaz; // Входное 10 битовое значение переменной ручки газа.
static unsigned int GazNorm; //  нормализованное значение переменной ручки газа приведённое к 8 битам для преобразования в ШИМ
int Out_pin1=0;          // пин подключения выхода на контроллер  1 (переднее колесо)
int Out_pin2=1;         // пин подключения выхода на контроллер 2   (заднее     колесо)
int brightness  = 0;     // яркость светодиода
int fadeAmount  = 3;     // шаг изменения яркости

/*
  // функция выводящая на печать в последовательный порт массив для построения arrPins45[255]
  for ( j=0; j <= 255; j++){
    scaledResult = fscale( 0, 255, 0, 255, j, -4.5);
   k++;
    if ( int(scaledResult) < 10  ) Serial.print(" ");
    if ( int(scaledResult) < 100 ) Serial.print(" ");
    Serial.print(scaledResult, 0);
    if ( j < 255 ) Serial.print(","); else Serial.println(" }");
    if ( k==16 ){
      k = 0;
      Serial.println(" ");
      };
   }
*/

// массив преобразований сигнала ручки газа.
const byte arrPins45[255] ={
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,
  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  2,  2,  2,  2,  2,  2,
  2,  2,  3,  3,  3,  3,  3,  3,  4,  4,  4,  4,  4,  5,  5,  5,
  5,  5,  6,  6,  6,  6,  7,  7,  7,  8,  8,  8,  8,  9,  9,  9,
10, 10, 10, 11, 11, 12, 12, 12, 13, 13, 14, 14, 14, 15, 15, 16,
16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 23, 23, 24, 24,
25, 26, 26, 27, 28, 28, 29, 30, 30, 31, 32, 33, 33, 34, 35, 36,
37, 37, 38, 39, 40, 41, 42, 42, 43, 44, 45, 46, 47, 48, 49, 50,
51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 62, 63, 64, 65, 66, 67,
69, 70, 71, 72, 73, 75, 76, 77, 79, 80, 81, 83, 84, 85, 87, 88,
90, 91, 93, 94, 96, 97, 99,100,102,103,105,106,108,110,111,113,
115,116,118,120,121,123,125,127,129,130,132,134,136,138,140,142,
144,146,148,150,152,154,156,158,160,162,164,166,168,170,173,175,
177,179,181,184,186,188,191,193,195,198,200,203,205,207,210,212,
215,217,220,223,225,228,230,233,236,238,241,244,247,249,252};

void setup() {
  // put your setup code here, to run once:
  // set the digital pin as output:
  pinMode(Out_pin1,  OUTPUT);
  pinMode(Out_pin2, OUTPUT);
 
}

void loop() {
  // put your main code here, to run repeatedly:

// Считываем с аналогового входа 4 раза подряд значение напряжения ручки газа и вычисляем среднее.
Gaz = unsigned int((analogRead(A1) + analogRead(A1) + analogRead(A1) + analogRead(A1))/4); // чтение с усреднением 4
// Gaz = analogRead(A1); // - простое чтение без усреднения
// преобразуем 10 битное входное напряжение в 8 битное, при преобразовании откидываем все значения напряжения ниже 150
// - это будет 4.8 милливольта * 150 = 0.7 Вольта
int GazNorm = map( Gaz, 150, 1023, 1, 255); //
analogWrite(Out_pin1, arrPins45[GazNorm]);    // устанавливаем значение выходного напряжение на выходе ШИМ1
// -  всё вывод сигнала ручки газа для переднего колеса окончен.
// тестовый вывод пилообразной линейной функции на шим выход  второго мотора.
analogWrite(Out_pin2, brightness);    // устанавливаем значение
    brightness = brightness + fadeAmount;   // прибавляем шаг изменения яркости, которая установится в следующем цикле
    if (brightness == 0 || brightness == 255) { // Условие достижения максимального или минимального значения
          fadeAmount = -fadeAmount ; // Меняем знак
        }
   delay(5);                  // ожидаем 5 МиллиСекунд
}

бывают люди совы, бывают люди жаворонки, а Я человек перепел, обычно через букву И

ArtDen

#23
Цитата: kor от 22 Июль 2019 в 08:43Добавить резистор и можно "расширить" 8битный шим почти в 2 раза. (8бит на мой взгляд хватит).
Лишний компонент, хотя как решение - вполне себе. В любом случае я уже переделал ШИМ на 10 бит

Добавлено 22 Июл 2019 в 11:28

Цитата: kor от 22 Июль 2019 в 09:53Вы делаете это для своего полноприводного самоката, у которого колеса разного типа, вам прямо напрашивается система, которая могла бы правильно дозировать и распределять мощность (момент) между колесами. Как говорит edv123, использовать еще сигналы оборотов и тока (например батарейного) с обоих моторов (задавать курком и поддерживать (программой) например отношение: мощность потребления мотором/обороты мотора (фактически это получается момент)).
Не планируете ли вы такое, например на дешевой плате Ардуино?
Слишком сложно для такой простой задачи. Не планирую.

Добавлено 22 Июл 2019 в 11:30

Цитата: zelen50 от 22 Июль 2019 в 11:20для всех желающих Ардуино программа для ручки газа.
Не вижу как учитывается напряжение 1.2 вольта, с которого начинается крутиться колесо. Ещё не учитывается напряжение питания, относительно которого измеряются значения на АЦП. У одного контроллера оно может быть 4 вольта, у другого - 5 вольт

kor

Цитата: edw123 от 22 Июль 2019 в 11:17В контроллерах шунт и так есть. 
Да, в крайнем случае можно и оттуда сигнал взять, хотя он там не совсем правильный (нет спадающей части тока) но программно математикой наверно можно как-то это учесть.

zelen50

Цитата: ArtDen от 22 Июль 2019 в 11:27Не вижу как учитывается напряжение 1.2 вольта, с которого начинается крутиться колесо
всё предельно просто - функция линейного преобразования -  map

int GazNorm = map( Gaz, 150, 1023, 1, 255); //

map(value, fromLow, fromHigh, toLow, toHigh)
Параметры
value: значение для переноса
fromLow: нижняя граница текущего диапазона
fromHigh: верхняя граница текущего диапазона
toLow: нижняя граница нового диапазона, в который переноситься значение
toHigh: верхняя граница нового диапазона
Функция пропорционально переносит значение (value) из текущего диапазона значений (fromLow .. fromHigh) в новый диапазон (toLow .. toHigh), заданный параметрами.
Функция map() оперирует целыми числами.
При пропорциональном переносе дробная часть не округляется по правилами, а просто отбрасывается.
бывают люди совы, бывают люди жаворонки, а Я человек перепел, обычно через букву И

edw123

Цитата: ArtDen от 22 Июль 2019 в 11:27
Не вижу как учитывается напряжение 1.2 вольта, с которого начинается крутиться колесо. Ещё не учитывается напряжение питания, относительно которого измеряются значения на АЦП. У одного контроллера оно может быть 4 вольта, у другого - 5 вольт
Вообще Вы точно замерили уровни? Стандартом является диапазон 0.8-4.2В.

"Слишком сложно для такой простой задачи. Не планирую." По сравнению с изготовлением и установкой "конвертора" написать ещё сотню строчек кода и ввести пару лишних проводков - копеечное дело. Зато плюшек будет - на рубли. Цикланалист, который это делает, стоит бешеных бабок (он конечно много что ещё делает).

ArtDen

Цитата: zelen50 от 22 Июль 2019 в 11:43всё предельно просто - функция линейного преобразования -  map

int GazNorm = map( Gaz, 150, 1023, 1, 255); //
Я имею ввиду, что до 1.2 вольта должна быть обычная линейная характеристика. После - уже нелинейная. Как это в этой программы для ардунино предусмотрено?

Добавлено 22 Июл 2019 в 11:47

Цитата: edw123 от 22 Июль 2019 в 11:43Вообще Вы точно замерили уровни? Стандартом является диапазон 0.8-4.2В.
Да, замерил. Ещё поспрашивал в теме про контроллер, чтобы народ тоже померил

Добавлено 22 Июль 2019 в 11:50

У меня получается так:
0.8 - 1.2 колесо не крутится
1.2 колесо начинает едва крутится
3.0 колесо перестаёт ускоряться при увеличении напряжения
3.0 - 3.6 колесо крутится так же как при 3.0

zelen50

Цитата: ArtDen от 22 Июль 2019 в 11:46Я имею ввиду, что до 1.2 вольта должна быть обычная линейная характеристика. После - уже нелинейная. Как это в этой программы для ардунино предусмотрено?
зачем такие сложности - будьте проще. В моём случае
характеристика ручки газа задаётся таблицей дешифрации - то есть массивом преобразований - arrPins45[255] где каждому значению входного напряжения соответствует выходное напряжение.
шаг преобразования (5 Вольт / 256 измерений) = 0,019 Вольта.
по поводу стандарта
сейчас например у меня стоит первые 28 шагов входного напряжения преобразуются в нулевое выходное напряжение - получается всё что до 28*0,019 = 0,54 Вольт + 0.7 вольт = 1,34 Вольт  входного напряжения преобразуется в ноль выходного напряжения.
бывают люди совы, бывают люди жаворонки, а Я человек перепел, обычно через букву И

ArtDen

zelen50, не особо понял, что означают напряжения 0,54, 0.7 и 1,34 Вольт
Задам вопрос попроще - что выдаст программа при входном напряжении 1.2 вольта?

ArtDen

zelen50, ещё на всякий случай. У вас напряжения замеряются в попугаях, а не вольтах, потому что напряжение питания контроллера не обязательно будет 5 вольт. У меня, например, оно получается 4.4 вольта. Поэтому в мою программу добавлен пересчёт в вольты (а точнее в милливолты) по эталонному источнику напряжения, который встроен в ATTiny

игорь1

Для медленного старта есть ноги или педали на велосипеде -всё гениальное просто.

ArtDen

Цитата: игорь1 от 22 Июль 2019 в 13:11
Для медленного старта есть ноги или педали на велосипеде -всё гениальное просто.
Я пробовал. Отталкиваешься ногой, слегка нажимаешь на курок и самокат резко стремится поехать быстрее тебя. Всё закончилось тем, что я даже руль умудрился немного погнуть назад )) На видео он уже погнутый, кстати

zelen50

Цитата: ArtDen от 22 Июль 2019 в 12:39Задам вопрос попроще - что выдаст программа при входном напряжении 1.2 вольта?
До входного напряжения 1,34 Вольта на выходе ШИМ1 (нога P0 Digispark ATtiny85 ) будет нулевое напряжение.
смысл программы - в двойном преобразовании входного напряжения.
первое преобразование линейное функцией map
Смысл первого преобразования  - переход от 10 разрядов входного АЦП к 8 разрядам выходного ШИМ.
  При этом первые 150 значений 10-ти разрядного числа откидываются для повышения помехозащищённости
  системы:   map(analogRead(A1), 150, 1023, 1, 255);
  если откидывать не надо то пишите:  map(analogRead(A1), 1, 1023, 1, 255); -
второе преобразование нелинейное - табличное задано массивом arrPins45[255].
  что в массив arrPins45[255] в соответствующую ячейку занесёте - то и будет на выходе.
  если не понимаете что такое дешифратор - то по простому:
    в массиве arrPins45[255] содержится 255 значений.
    каждому элементу массива соответствует диапазон входного напряжения - 0,0195 вольта.
    первому элементу массива соответствует входное напряжение от 0 до 0,019 вольта,
    второму элементу массива - от 0,019 до 0,038 вольта
    третьему элементу массива - от 0,038 до 0,057 вольта
     .
     .
    256 значению        - от 4,98 до 4.996 вольта.

то есть если входное напряжение будет от 0 до 0,019 вольт то выходное напряжение будет равно значению элемента массива № 0 умноженному на 0,019 вольта.
если входное напряжение будет 1 вольт - то выберется 52-ой элемент массива (1 вольт/0,019 вольт на элемент = 52)  равный 1. И выходное напряжение будет 1* 0,019 = 0,019 Вольта.

бывают люди совы, бывают люди жаворонки, а Я человек перепел, обычно через букву И

zelen50

[user]ArtDen[/user], напряжение измеряется не в попугаях а в долях напряжения опорного источника питания - какой опорный источник питания задашь такой коэфф и будет.
В моём случае у Digispark ATtiny85 опорным является напряжение питания от стабилизатора платы 5 вольт +- 0.02 вольт.

Добавлено 22 Июль 2019 в 13:49

Цитата: kor от 22 Июль 2019 в 13:44поэтому привязка к "эталону" возможно не нужна или даже вредна.
просто курок нужно питать именно от источника питания платы ATtiny85 тогда гуляние питания никак не скажется на качестве преобразования.
бывают люди совы, бывают люди жаворонки, а Я человек перепел, обычно через букву И

ArtDen

Цитата: zelen50 от 22 Июль 2019 в 13:42До входного напряжения 1,34 Вольта на выходе ШИМ1 (нога P0 Digispark ATtiny85 ) будет нулевое напряжение.
А что будет на выходе, если подать чуть-чуть больше 1.34?

Добавлено 22 Июл 2019 в 14:47

Цитата: kor от 22 Июль 2019 в 13:44Выходное напряжение самого курка (датчика холла который в нем), тоже зависит от напряжения питания (в одном и том-же положении он будет выдавать разное напряжение при разном напряжении питания), поэтому привязка к "эталону" возможно не нужна или даже вредна.
Это очень странно потому что этого не должно быть ))

Добавлено 22 Июль 2019 в 14:48

Цитата: zelen50 от 22 Июль 2019 в 13:47просто курок нужно питать именно от источника питания платы ATtiny85 тогда гуляние питания никак не скажется на качестве преобразования.
А где этот источник питания attiny85 возьмётся внутри самоката?