Плавная регулировка набора скорости бесщёточного мотора

надо брать из таблицы и считать ничего не придётся, по типу таблицы синусов

«Нарисуешь»?

Простите, что заставил вас опять вспоминать алгебру!

нет тебе прощения )))
Кстати, что у тебя за регулятор к этому мотору, открой инструкцию к нему и посмотри раздел калибровки, наверняка можно привести калибровки к стандартным значениям, а именно: минимальные обороты - 1000, максимальные обороты 2000, и тогда 1024 единиц с ацп хорошо согласуются с диапазоном регулятора, библиотека servo.h поддерживает не только градусы 0-180 но и прямую длительность импульса от 544 до 2400 (точнее надо глянуть. в ней)
И тогда растем в таблице до половины значений в два раза медленней, то-есть
0 - 1000, 1 - 1000, 2-1001, 3 -1001… и так до 500, а от 500 в два раза быстрее 500 - 1250, 501 - 1252, 502 - 1254 …идея понятна?
и ваапще, по велосипедам у нас тут @Green спец, это он нам тут ролики крутил, как ездит со скоростью 100км.ч


Вот такой Flyfun KV 160 opto

Вот всё, что мог найти на него:

Я далек в калибровках… Хотя сама инструкция где-то лежит. К нему купил программатор, но он много проблем не решил - есть установка мягкого старта, но очень слабая - рвет цепь всё равно…

В целом не очень сложная то задача. Могу дать рыбу -

  1. Определись с ускорением, то за какое время ты хочешь достигать максимальной скорости с 0. Например хочешь чтобы 0 до 100 разгон был за 60 секунд.
  2. Выяви динамику двигателя и какие “рывки” будут приемлемы, например 0.1 км/ч с места.
  3. Сделай апроксимацию - за какое время сделать “рывок”. Для моего примера 100км/ч / 0.1км/ч/с / 60с
  4. Приближайся к заданной рукояткой скорости постепенно “рывками”.
  5. НЕ ИСПОЛЬЗУЙ delay, используй только millis (ну или micros).
    Ну и главное - 100 км/ч, серьезно? Ограничь хотя бы 60.

И еще - надо решить вопрос торможения. Так чтобы тормозить и не мучительно долго и не улететь за руль. Есть ли “сцепление” или двигатель всегда “тянет”.

сделаешь плавный старт, потом всё равно захочешь кикдаун.

Да, ускорение тоже может быть параметром контроллируемым с рукоятки (другой), будет типа передачи.
Или как более простой вариант сделать передачи: 0-10, 10-30, 30-50, 50-60. Но все равно придется ускорение применять.

так у тебя всё есть оказывается )))

самое первое надо задать диапазон значений мин и макс воспринимаемых регулятором, по стандарту это 1000 и 2000 микросекунд, посмотри ролики по квардракоптерам, там есть регулировка регулятора, на аппаратуре выставляется максимум, подключается к регулятору питание, мотор пропищит, что вошёл в калибровку, как пропищал на аппаратуре рычаг переводится в минимум, мотор пропищит, что откалибровался, как-то так, ты получишь мотор откалиброванный по стандарту, а далее уже с карты вводятся остальные параметры, смотри в настройках есть параметр стопорить винты, у тебя он должен быть снят (НЕТ АКТИВНОГО ТОРМОЖЕНИЯ)
а потом уже писать скетч под параметры твоего лисапеда

Вернусь к своей теме отвечая на остальные вопросы.
Я не лихач, чтобы велосипедом бороться с местными мотоциклетами.
Мне нужно быстро и без проблем добираться до работы в часы пик (которых здесь предостаточно).
Тормоза я сделал (не жалуюсь)!
Разгон до 100 за 3,5 мне никогда не понадобится ! )))
Но по прямой хочется ехать быстрее чем 60 км/ч!
У меня это вторая сборка велосипеда. Первый (в рабочем состоянии) развивает до 63 км/ч. Правда с трудом!
В нем китайское мотор- колесо на 1 кВт.
Второй - чисто моё техническое решение! Он идёт накатом как обычный спортивный велосипед (предусмотрено конструкцией).
По этому, даже при блокировке двигателя при сбросе рукоятки газа (чего в параметрах я не ставил) он в любом случае будет катится с кинетически заданной скоростью! ))))))

По поводу скоростей - заднее колесо Shimano со встроенной 3-х скоростной втулкой - переключатель на руле (левая ручка).

Вообще то мне нужен только плавный старт, чтобы щадить трансмиссию!
Сегодня перешью скетч - если заработает ВСЕМ ОГРОМНОЕ СПАСИБО за советы и отзывы!

Если НЕТ… То очень жаль.

ты в самом начале пути, вот еще кое-то на заметку:

  1. При оцифровывании показания АЦП скачут, значит их надо усреднять, прежде чем отправить на регулятор, какой способ усреднения надо подумать
  2. Тумблер по типу нейтральной передачи,тоже не помешает
  3. В нейтральном положении тумблера показания с ручки скорости выводить на дисплейчик, проверка ручки газа

Так и не нарисовал…
А я вот кое-чего накидал)))

#include <Servo.h>

Servo motor;
uint8_t mot_pin = 9;          // Пин подключения мотора
int     max_pwm = 1940;       // Максимальное значение ШИМ 2.3 мс
int     min_pwm = 980;        // Минимальное значени ШИМ 0.8 мс
uint8_t Speed;
                   
uint8_t table[] = {       // Таблица из 180 элементов
  0,0,1,1,2,2,3,3,4,4,5,5,5,6,6,6,6,7,7,7,7,8,8,8,8,8,9,9,9,9,10,10,10,11,11,12,12,13,13,14,15,15,15,15,15,16,16,16,16,16,17,17,17,18,18,18,19,19,20,20,21,21,21,22,22,23,23,23,24,24,25,25,26,26,27,27,28,29,30,31,32,32,33,33,34,34,35,35,36,37,38,38,39,39,40,40,41,42,43,44,45,45,46,46,47,47,48,48,49,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,65,66,67,68,69,70,72,74,76,78,80,82,84,86,88,89,90,92,94,96,98,99,101,103,105,107,108,110,113,114,116,118,120,123,125,127,128,130,133,135,137,138,140,143,146,149,150,153,155,158,163,165,169,173,177,180
};       

void setup() {
//  Serial.begin(9600);     // запуск последовательного порта
  motor.attach(mot_pin);  // инициализация мотора
  delay(1000);            // калибровка
  motor.writeMicroseconds(max_pwm);
  delay(2000);
  motor.writeMicroseconds(min_pwm);
  delay(4000);
}

void loop() {
  uint16_t tmp = analogRead(A1);
  tmp = map(tmp, 0, 1023, 0, 180);
  Speed = table[tmp];
  motor.write(Speed);
}

График рисовал от руки, что-то наподобие y= a^x, только начинается с нуля.

ну почему жеж, нарисую, но держать таблицу в ОЗУ (так у меня сделано) считаю неправильным, а PROGMEM у нано байтовый видимо…

#include <Servo.h>
Servo motor;

//Пин подключения мотора
int mot_pin = 9;

//Максимальное значение ШИМ 2.3 мс
int max_pwm = 1940;

//Минимальное значени ШИМ 0.8 мс
int min_pwm = 980;
int Speed;

const int16_t speed_data[] = {
// Первая половина таблицы, ручка газа  0% - 50% скорость растёт с замедлением /2 
/* 0       1     2     3     4     5     6     7     8     9     10    11    12    13    14    15 */
/* 0 */   1000, 1000, 1001, 1001, 1002, 1002, 1003, 1003, 1004, 1004, 1005, 1005, 1006, 1006, 1007, 1007,
/* 1 */   1008, 1008, 1009, 1009, 1010, 1010, 1011, 1011, 1012, 1012, 1013, 1013, 1014, 1014, 1015, 1015,
/* 2 */   1016, 1016, 1017, 1017, 1018, 1018, 1019, 1019, 1020, 1020, 1021, 1021, 1022, 1022, 1023, 1023,
/* 3 */   1024, 1024, 1025, 1025, 1026, 1026, 1027, 1027, 1028, 1028, 1029, 1029, 1030, 1030, 1031, 1031,
/* 4 */   1032, 1032, 1033, 1033, 1034, 1034, 1035, 1035, 1036, 1036, 1037, 1037, 1038, 1038, 1039, 1039,
/* 5 */   1040, 1040, 1041, 1041, 1042, 1042, 1043, 1043, 1044, 1044, 1045, 1045, 1046, 1046, 1047, 1047,
/* 6 */   1048, 1048, 1049, 1049, 1050, 1050, 1051, 1051, 1052, 1052, 1053, 1053, 1054, 1054, 1055, 1055,
/* 7 */   1056, 1056, 1057, 1057, 1058, 1058, 1059, 1059, 1060, 1060, 1061, 1061, 1062, 1062, 1063, 1063,
/* 8 */   1064, 1064, 1065, 1065, 1066, 1066, 1067, 1067, 1068, 1068, 1069, 1069, 1070, 1070, 1071, 1071,
/* 9 */   1072, 1072, 1073, 1073, 1074, 1074, 1075, 1075, 1076, 1076, 1077, 1077, 1078, 1078, 1079, 1079,
/* 10 */  1080, 1080, 1081, 1081, 1082, 1082, 1083, 1083, 1084, 1084, 1085, 1085, 1086, 1086, 1087, 1087,
/* 11 */  1088, 1088, 1089, 1089, 1090, 1090, 1091, 1091, 1092, 1092, 1093, 1093, 1094, 1094, 1095, 1095,
/* 12 */  1096, 1096, 1097, 1097, 1098, 1098, 1099, 1099, 1100, 1100, 1101, 1101, 1102, 1102, 1103, 1103,
/* 13 */  1104, 1104, 1105, 1105, 1106, 1106, 1107, 1107, 1108, 1108, 1109, 1109, 1110, 1110, 1111, 1111,
/* 14 */  1112, 1112, 1113, 1113, 1114, 1114, 1115, 1115, 1116, 1116, 1117, 1117, 1118, 1118, 1119, 1119,
/* 15 */  1120, 1120, 1121, 1121, 1122, 1122, 1123, 1123, 1124, 1124, 1125, 1125, 1126, 1126, 1127, 1127,
/* 16 */  1128, 1128, 1129, 1129, 1130, 1130, 1131, 1131, 1132, 1132, 1133, 1133, 1134, 1134, 1135, 1135,
/* 17 */  1136, 1136, 1137, 1137, 1138, 1138, 1139, 1139, 1140, 1140, 1141, 1141, 1142, 1142, 1143, 1143,
/* 18 */  1144, 1144, 1145, 1145, 1146, 1146, 1147, 1147, 1148, 1148, 1149, 1149, 1150, 1150, 1151, 1151,
/* 19 */  1152, 1152, 1153, 1153, 1154, 1154, 1155, 1155, 1156, 1156, 1157, 1157, 1158, 1158, 1159, 1159,
/* 20 */  1160, 1160, 1161, 1161, 1162, 1162, 1163, 1163, 1164, 1164, 1165, 1165, 1166, 1166, 1167, 1167,
/* 21 */  1168, 1168, 1169, 1169, 1170, 1170, 1171, 1171, 1172, 1172, 1173, 1173, 1174, 1174, 1175, 1175,
/* 22 */  1176, 1176, 1177, 1177, 1178, 1178, 1179, 1179, 1180, 1180, 1181, 1181, 1182, 1182, 1183, 1183,
/* 23 */  1184, 1184, 1185, 1185, 1186, 1186, 1187, 1187, 1188, 1188, 1189, 1189, 1190, 1190, 1191, 1191,
/* 24 */  1192, 1192, 1193, 1193, 1194, 1194, 1195, 1195, 1196, 1196, 1197, 1197, 1198, 1198, 1199, 1199,
/* 25 */  1200, 1200, 1201, 1201, 1202, 1202, 1203, 1203, 1204, 1204, 1205, 1205, 1206, 1206, 1207, 1207,
/* 26 */  1208, 1208, 1209, 1209, 1210, 1210, 1211, 1211, 1212, 1212, 1213, 1213, 1214, 1214, 1215, 1215,
/* 27 */  1216, 1216, 1217, 1217, 1218, 1218, 1219, 1219, 1220, 1220, 1221, 1221, 1222, 1222, 1223, 1223,
/* 28 */  1224, 1224, 1225, 1225, 1226, 1226, 1227, 1227, 1228, 1228, 1229, 1229, 1230, 1230, 1231, 1231,
/* 29 */  1232, 1232, 1233, 1233, 1234, 1234, 1235, 1235, 1236, 1236, 1237, 1237, 1238, 1238, 1239, 1239,
/* 30 */  1240, 1240, 1241, 1241, 1242, 1242, 1243, 1243, 1244, 1244, 1245, 1245, 1246, 1246, 1247, 1247,
/* 31 */  1248, 1248, 1249, 1249, 1250, 1250, 1251, 1251, 1252, 1252, 1253, 1253, 1254, 1254, 1255, 1255,

// Середина таблицы, ручка газа 50% - 75% скорость возрастает х2
/*          0    1     2     3     4     5     6     7     8     9     10    11    12    13    14    15 */
/* 32 */  1256, 1258, 1260, 1262, 1264, 1266, 1268, 1270, 1272, 1274, 1276, 1278, 1280, 1282, 1284, 1286,
/* 33 */  1288, 1290, 1292, 1294, 1296, 1298, 1300, 1302, 1304, 1306, 1308, 1310, 1312, 1314, 1316, 1318,
/* 34 */  1320, 1322, 1324, 1326, 1328, 1330, 1332, 1334, 1336, 1338, 1340, 1342, 1344, 1346, 1348, 1350,
/* 35 */  1352, 1354, 1356, 1358, 1360, 1362, 1364, 1366, 1368, 1370, 1372, 1374, 1376, 1378, 1380, 1382,
/* 36 */  1384, 1386, 1388, 1390, 1392, 1394, 1396, 1398, 1400, 1402, 1404, 1406, 1408, 1410, 1412, 1414,
/* 37 */  1416, 1418, 1420, 1422, 1424, 1426, 1428, 1430, 1432, 1434, 1436, 1438, 1440, 1442, 1444, 1446,
/* 38 */  1448, 1450, 1452, 1454, 1456, 1458, 1460, 1462, 1464, 1466, 1468, 1470, 1472, 1474, 1476, 1478,
/* 39 */  1480, 1482, 1484, 1486, 1488, 1490, 1492, 1494, 1496, 1498, 1500, 1502, 1504, 1506, 1508, 1510,
/* 40 */  1512, 1514, 1516, 1518, 1520, 1522, 1524, 1526, 1528, 1530, 1532, 1534, 1536, 1538, 1540, 1542,
/* 41 */  1544, 1546, 1548, 1550, 1552, 1554, 1556, 1558, 1560, 1562, 1564, 1566, 1568, 1570, 1572, 1574,
/* 42 */  1576, 1578, 1580, 1582, 1584, 1586, 1588, 1590, 1592, 1594, 1596, 1598, 1600, 1602, 1604, 1606,
/* 43 */  1608, 1610, 1612, 1614, 1616, 1618, 1620, 1622, 1624, 1626, 1628, 1630, 1632, 1634, 1636, 1638,
/* 44 */  1640, 1642, 1644, 1646, 1648, 1650, 1652, 1654, 1656, 1658, 1660, 1662, 1664, 1666, 1668, 1670,
/* 45 */  1672, 1674, 1676, 1678, 1680, 1682, 1684, 1686, 1688, 1690, 1692, 1694, 1696, 1698, 1700, 1702,
/* 46 */  1704, 1706, 1708, 1710, 1712, 1714, 1716, 1718, 1720, 1722, 1724, 1726, 1728, 1730, 1732, 1734,
/* 47 */  1736, 1738, 1740, 1742, 1744, 1746, 1748, 1750, 1752, 1754, 1756, 1758, 1760, 1762, 1764, 1766,

// Окончание таблицы, ручка газа 75% - 100% скорость возрастает линейно
/*           0    1     2     3     4     5     6     7     8     9     10    11    12    13    14    15 */
/* 48 *   1767, 1768, 1769, 1770, 1771, 1772, 1773, 1774, 1775, 1776, 1777, 1778, 1779, 1780, 1781, 1782,
/* 49 *   1783, 1784, 1785, 1786, 1787, 1788, 1789, 1790, 1791, 1792, 1793, 1794, 1795, 1796, 1797, 1798,
/* 50 *   1799, 1800, 1801, 1802, 1803, 1804, 1805, 1806, 1807, 1808, 1809, 1810, 1811, 1812, 1813, 1814,
/* 51 *   1815, 1816, 1817, 1818, 1819, 1820, 1821, 1822, 1823, 1824, 1825, 1826, 1827, 1828, 1829, 1830,
/* 52 *   1831, 1832, 1833, 1834, 1835, 1836, 1837, 1838, 1839, 1840, 1841, 1842, 1843, 1844, 1845, 1846,
/* 53 *   1847, 1848, 1849, 1850, 1851, 1852, 1853, 1854, 1855, 1856, 1857, 1858, 1859, 1860, 1861, 1862,
/* 54 *   1863, 1864, 1865, 1866, 1867, 1868, 1869, 1870, 1871, 1872, 1873, 1874, 1875, 1876, 1877, 1878,
/* 55 *   1879, 1880, 1881, 1882, 1883, 1884, 1885, 1886, 1887, 1888, 1889, 1890, 1891, 1892, 1893, 1894,
/* 56 *   1895, 1896, 1897, 1898, 1899, 1900, 1901, 1902, 1903, 1904, 1905, 1906, 1907, 1908, 1909, 1910
/* 57 *   1911, 1912, 1913, 1914, 1915, 1916, 1917, 1918, 1919, 1920, 1921, 1922, 1923, 1924, 1925, 1926,
/* 58 *   1927, 1928, 1929, 1930, 1931, 1932, 1933, 1934, 1935, 1936, 1937, 1938, 1939, 1940, 1941, 1942,
/* 59 *   1943, 1944, 1945, 1946, 1947, 1948, 1949, 1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, 1958,
/* 60 *   1959, 1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1971, 1972, 1973, 1974,
/* 61 *   1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990,
/* 62 *   1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
/* 63 *   2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022 */
};

void setup() {
  // запуск последовательного порта
  Serial.begin(115200);
  // инициализация мотора
  motor.attach(mot_pin);
  // калибровка
  delay(1000);
  motor.writeMicroseconds(max_pwm);
  delay(2000);
  motor.writeMicroseconds(min_pwm);
  delay(4000);
}
void loop() {
  Speed =  (Speed * 9 + analogRead(A1)) / 10; 
 // Speed =  analogRead(A1); 
 // Speed = map(speed_data[Speed],  0,  1023, 0, 180);
 if(Speed >=750){
  motor.writeMicroseconds(Speed + 1000);
  Serial.println(Speed + 1000);
 }else{
  motor.writeMicroseconds(speed_data[Speed]);
  Serial.println(speed_data[Speed]);
 }
//  Serial.print(Speed);
//  Serial.print(" - ");
    delay(100);
}

Добрый день всем!
Спасибо за вашу серьезную работу!
Не думаю, что столь большая таблица не поместится в NANO.

Ну а теперь всё в моих руках!
Сейчас буду компелировать скетч.
(в запасе осталась только одна ардуинка - это уже хорошо!)

она поместится, то хранить в памяти ОЗУ константы плохая идея, надо перенести их во флэш, чуток позже покажу. как это можно реализовать