Проект "MaxController"

Автор jeka, 23 Май 2010 в 23:54

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

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

i

Обычно я стараюсь свести формулу к делению на константу, равную ширине слова.
X=N*B/A,  пусть A=2^16/C (искать его можно по таблице A->C), тогда X=N*B*C/2^16, то есть перемножаем числа, а от 32-х разрядного результата берем только старшие 16 бит.
Всё честно.

zap

Цитата: jeka от 07 Авг. 2010 в 04:25
Задача: как быстро просчитать, сколько тиков откладывать на следующий интервал в B градусов, если предыдущий интервал в A градусов был пройден за N тиков. Т.е. X=N*(B/A).
Насколько я понимаю, A, B, C это константы, вычисляемые один раз во время калибровки (углы между датчиками Холла). Тогда можно без проблем и не спеша вычислить 2^16/A, 2^16/B, 2^16/C и положить их рядом с самими константами. Тогда всё сводится к двум умножениям, и никаких таблиц.

И ещё, имеет смысл подумать о предсказании следующего угла не линейной интерполяцией, а чем-нибудь более хитрым, с учётом предыдущей истории в 2, 3, 4 отсчётов.

Я когда-то разработал хитрый алгоритм деления двух чисел неограниченной длины в столбик с использованием ограниченного аппаратного деления 64 на 32 бита, но уже подзабыл детали. Если надо - вспомню. Можно поделить аргументы на группы по, скажем, 4 бита и делить в столбик (всего 4 итерации), а "аппаратное" деление делать по таблице для 4-битного деления (получится совсем маленькая).
С уважением,
Андрей

Поражаю масштабностью некопмпетентность (ц) из лички

nikvic

Цитата: jeka от 07 Авг. 2010 в 04:25
.. как быстро просчитать, сколько тиков откладывать на следующий интервал в B градусов, если предыдущий интервал в A градусов был пройден за N тиков. Т.е. X=N*(B/A).
Как быстро B поделить на A, если A и B имеют значения - около 600 (кол-во градусов *10), скажем, актуальный диапазон - от 500 до 700.
Процессор 16-битный, Можно использовать lookup таблицы до 8КБ размером, а также аппаратный умножитель 16bit*16bit=32bit.
Приближённое умножение\деление удобно делать через логарифмы-2 с составлением приближённой таблицы логарифмов.
Если в ней ограничиться ~8-ю значащими битами, то в таблиц - всего 127 байт. Именно, вычисляем (до программирования) логарифмы-2 чисел 129...255, дробную часть умножаем на 256 и округляем.
В 8КБ влезет без уплотнения таблица на 4096 значений, т.е. с 13-ю значащими битами. Но такая точность будет избыточна...
 Этой идее соответствует вариант представления (действительных) чисел парой (порядок, логарифм). Число "сдвигается" (запоминаем, куда и сколько!), пока старший бит не станет равным 128. Далее лезем в таблицу - вот и пара чисел. Аккуратно организуем сложение-вычитание!!!
Обратный переход - поиском места в монотонной талице дихотомией.

========== Вариант -
 Грех не воспользоваться умножением...
Вам нужно решить приближённо уравнение Ах=В*N. Создайте таблицу [2^K / A], умножайте В*N на элемент таблицы и сдвигайте результат. Если развиты байтовые операции, то просто берётся нужный байт.    

jeka

Спасибо за ответы.
Оптимальным в данном случае будет использовать алгоритм предложенный i как самый бустрый.
zap, раньше я хотел датчики холла калибровать в цикле калибровки. Сейчас цикл калибровки (точнее, плавной подстройки градусов по ходу обычного движения мотора) хочу сделать при обычном движении. Схема такая:
при движении фиксируем моменты времени, когда срабатывают датчики холла. Когда мотор сделал полный оборот, есть времена всех 6ти срабатываний датчиков холла. По временным интервалам рассчитываем углы. Рабочие углы подстраиваем, меняя на маленькую величину (скажем, на + или - 0.1 градус), срванивая их с рассчитанными. При этом следим за ускорением. Если есть ускорение/торможение, то подстройку углов пропускаем.
LiFe A123 40AH/78v, max-e, крошка 3 витка.
На форуме бываю нерегулярно, поэтому лучше звонить чем писать в личку. Телефон adaptto: +7 495 215 2878.

FAS_r7

Цитата: i от 07 Авг. 2010 в 13:07
Обычно я стараюсь свести формулу к делению на константу, равную ширине слова.
X=N*B/A,  пусть A=2^16/C (искать его можно по таблице A->C), тогда X=N*B*C/2^16, то есть перемножаем числа, а от 32-х разрядного результата берем только старшие 16 бит.
Всё честно.
Немного не догоняю.
Т.е. если диапазон возможных значений числа А = 200 (от 500 до 700), то и таблица будет на 200 чисел?
А столько тогда нужно бит на каждое значение С ?   ЗЫ если принять минимум А = 512, тогда на каждое значение С будет тратиться всего по 1 байту. так?   или я дико туплю? :ah:

nikvic

Цитата: FAS_r7 от 07 Авг. 2010 в 16:22
Цитата: i от 07 Авг. 2010 в 13:07
Обычно я стараюсь свести формулу к делению на константу, равную ширине слова.
X=N*B/A,  пусть A=2^16/C (искать его можно по таблице A->C), тогда X=N*B*C/2^16, то есть перемножаем числа, а от 32-х разрядного результата берем только старшие 16 бит.
Всё честно.
Т.е. если диапазон возможных значений числа А = 200 (от 500 до 700), то и таблица будет на 200 чисел?
А столько тогда нужно бит на каждое значение С ?   ЗЫ если принять минимум А = 512, тогда на каждое значение С будет тратиться всего по 1 байту. так?   или я дико туплю? :ah:
Да, длина таблицы равна количеству возможных делителей.
Битовая длина элемента таблицы выбирается из соображений точности и удобства.
   Похоже, туда целесообразно пихать 16-битовые числа - результат округления 2^24 (а не 2^16) на  числа диапазона. Сам диапазон естественно расширяется до (257...1024).

zap

Цитата: jeka от 07 Авг. 2010 в 14:08
zap, раньше я хотел датчики холла калибровать в цикле калибровки. Сейчас цикл калибровки (точнее, плавной подстройки градусов по ходу обычного движения мотора) хочу сделать при обычном движении.
Вы полагаете, датчики Холла будут шевелиться?

Мне кажется, лучше не усложнять себе жизнь и сделать какой-нибудь джампер на плате для включения калибровки. Откалибровал - и поехали. А то любая ошибка с калибровкой (непрерывной причём - ошибки непрерывно будут) приведёт к "чиханиям" мотора и прочим радостям.

Плюс, если калибровка таки относительно редко делается, всё равно не вижу почему бы не сделать полноценное деление и вычисление 1/x.
С уважением,
Андрей

Поражаю масштабностью некопмпетентность (ц) из лички

jeka

Шевелиться они не будут, но, но кривость датчиков в 5 градусов в моем колесе есть. Коли алгоритм подстройки положений датчиков холла несложный и мешать работе колеса не будет, то почему бы его не реализовать?
Кстати, тот механизм калибровки, когда медленно крутим мотор - кривой. Его можно использовать только для определения градусности (+-30град.) датчиков холла. Ибо магниты на слабых оборотах крутят мотор как яйцо у МТС, т.е. очень неравномерно. Для калибровки нужно сильно разогнать и из-за силы инерции он будет вращаться стабильно.

Сейчас сделал новый алгоритм, наконец исходники стали понятные и более-менее читабельные.
Сделал дискретный разгон, и от 5 км/ч включается синус. Наконец-то преодолел глюки с дребезгом датчиков холла и переходами от синуса к дискретному управлению. Теперь крутится отлично, даже при резких изменениях скорости.
Играюсь с опережением. Эксперементами проверил, что опережение практически прямопропорционально скорости. Исключение - низкие обороты. Там опережение чуть быстрее увеличивается, но незначительно (в 1.1 раза). С ростом амплитуды с 6 до 48v угол увеличивается на 15 градусов. Тестировал на люаньском колесе.
LiFe A123 40AH/78v, max-e, крошка 3 витка.
На форуме бываю нерегулярно, поэтому лучше звонить чем писать в личку. Телефон adaptto: +7 495 215 2878.

nikvic

Цитата: jeka от 08 Авг. 2010 в 19:43
кривость датчиков в 5 градусов в моем колесе есть. Коли алгоритм подстройки положений датчиков холла несложный и мешать работе колеса не будет, то почему бы его не реализовать?
Cтоп - в чём заключется кривость?
Датчик срабатывает при прохождении каждого магнита, и дело может быть не в расположении датчиков, а в нерегулярном расположении магнитов или их неодинаковости.

Будете запоминать особенности каждого срабатывания (3* число магнитов)??????

jeka

Магниты расположены значительно лучше. А вот датчики - криво. Стабильно на каждой группе полюсов примерно одни и те же данные.

p.s. В любом случае, усреднение даст картину наилучшего положения среди всех магнитов. Магниты в силу конструктивной особенности не впихнешь криво. А датчики расположены очень близко друг к другу и небольшое смещение датчика дает большой разброс.
LiFe A123 40AH/78v, max-e, крошка 3 витка.
На форуме бываю нерегулярно, поэтому лучше звонить чем писать в личку. Телефон adaptto: +7 495 215 2878.

nikvic

Цитата: jeka от 08 Авг. 2010 в 23:29
Магниты расположены значительно лучше. А вот датчики - криво. Стабильно на каждой группе полюсов примерно одни и те же данные.

p.s. В любом случае, усреднение даст картину наилучшего положения среди всех магнитов. Магниты в силу конструктивной особенности не впихнешь криво. А датчики расположены очень близко друг к другу и небольшое смещение датчика дает большой разброс.
Меня поразили 5 градусов.
Сколько у Вас магнитов? Что значит "для каждой группы полюсов"? Может, для каждого датчика?

jeka

Это значит что на колесе я делал несколько замеров. Когда колесо разогналось, останавливаю программу отладчиком и смотрю результат последнего замера. Поэтому замер попадает на случайную группу магнитов. От замера к замеру данные почти не менялись. Под группой полюсов я понимаю у мотора отношение числа электрических оборотов к одному физическому. Количество магнитов не считал, но на люане скорее всего 3-5 групп по 3 шт.
LiFe A123 40AH/78v, max-e, крошка 3 витка.
На форуме бываю нерегулярно, поэтому лучше звонить чем писать в личку. Телефон adaptto: +7 495 215 2878.

nikvic

Цитата: jeka от 09 Авг. 2010 в 14:48
Это значит что на колесе я делал несколько замеров. Когда колесо разогналось, останавливаю программу отладчиком и смотрю результат последнего замера. Поэтому замер попадает на случайную группу магнитов. От замера к замеру данные почти не менялись. Под группой полюсов я понимаю у мотора отношение числа электрических оборотов к одному физическому. Количество магнитов не считал, но на люане скорее всего 3-5 групп по 3 шт.
Плохо называть число группой...
Количество магнитов всегда чётно. Электрические обороты равны половине числа магнитов ("число пар полюсов"), помноженной на  физические обороты.
За электрический оборот каждый датчик срабатывает 2 раза. На моторах с РПМ ~3000, что я видел, 4 пары полюсов, на тех, что ~300,  10-30 пар.

Кажется, понял, что Вы имели ввиду. Пусть, например, у мотора 11 пар полюсов, и магниты расположены "прилично" и боль-мень одинаковы. Запишем подряд моменты срабатывания всех датчиков и возмём промежутки. Получим последовательность, близкую к периодической с периодом 66, а сам период состоит из "втасованных" с шагом 1 трёх кусков длиной 22. И эти куски чуть сдвинуты друг относительно друга...

jeka

Сегодня подключил полярис. Немного офигел. Там разброс еще больше. Когда кручу дискретным переключением углов на малом токе, рукой торможу колесо до нуля и рукой определяю усилие на каждом переключении. Разброс усилий на моментах перескока гораздо сильнее ощущаются чем в люане. На 1м - сильное падение момента, на 2м момент почти не падает, на 3м падает. 4- падение чуть меньше среднего, 5-6 более-менее среднее падение.
При вращении синусом на макс. оборотах люань потреблял 1А/48v (ровно столько, сколько и на штатном контроллере), полярис же съедает 4-5А. Это после калибровки угла опережения под минимальный ток. Попробую подстроить углы датчиков, посмотрим на результаты.
LiFe A123 40AH/78v, max-e, крошка 3 витка.
На форуме бываю нерегулярно, поэтому лучше звонить чем писать в личку. Телефон adaptto: +7 495 215 2878.

jeka

Разобрался.
Большое потребление было из-за масштабирования синуса на 180% при высоких оборотах. Зато мотор крутился под 75 км/ч от 45v ;)))
Сейчас полярис берет 2А на холостом ходу при 60 км/ч. Амплитуду ограничил до 100%.
Границы холлов под мотор немного ручками подправил методом тыка, потребление на ХХ еще на 20% упало.
LiFe A123 40AH/78v, max-e, крошка 3 витка.
На форуме бываю нерегулярно, поэтому лучше звонить чем писать в личку. Телефон adaptto: +7 495 215 2878.

Alex_Soroka

Цитата: jeka от 08 Авг. 2010 в 19:43
Играюсь с опережением. Эксперементами проверил, что опережение практически прямопропорционально скорости. Исключение - низкие обороты. Там опережение чуть быстрее увеличивается, но незначительно (в 1.1 раза). С ростом амплитуды с 6 до 48v угол увеличивается на 15 градусов. Тестировал на люаньском колесе.

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

andreym

Цитата: Alex_Soroka от 12 Авг. 2010 в 10:30
Цитата: jeka от 08 Авг. 2010 в 19:43
Играюсь с опережением. Эксперементами проверил, что опережение практически прямопропорционально скорости. Исключение - низкие обороты. Там опережение чуть быстрее увеличивается, но незначительно (в 1.1 раза). С ростом амплитуды с 6 до 48v угол увеличивается на 15 градусов. Тестировал на люаньском колесе.

:ay: от меня будет огромный респект - если вы опережение доделаете...
это реально необходимая вещь ! которая кстати, позволит поднять скорость на ровных участках.
не могу сказать с большой вероятностью, но по моему именно опережение и работает в моем контроллере когда выставляешь скорость 110 и 120процентов
ток при этом растет серьезно под  нагрузкой но максималка процентов на 10 увеличивается, скорость свободного вращения тоже порядка 10-15 процентов и как ни странно увеличивается разгонная динамика (проверили когда измеряли по GPS разгон до 50кмч:))

Alex_Soroka

Цитата: andreym от 12 Авг. 2010 в 11:57
Цитата: Alex_Soroka от 12 Авг. 2010 в 10:30
:ay: от меня будет огромный респект - если вы опережение доделаете...
это реально необходимая вещь ! которая кстати, позволит поднять скорость на ровных участках.
не могу сказать с большой вероятностью, но по моему именно опережение и работает в моем контроллере когда выставляешь скорость 110 и 120процентов
ток при этом растет серьезно под  нагрузкой но максималка процентов на 10 увеличивается, скорость свободного вращения тоже порядка 10-15 процентов и как ни странно увеличивается разгонная динамика (проверили когда измеряли по GPS разгон до 50кмч:))

по данным реальной работы Института Электродинамики(Киев), им удавалось скорость поднять в два раза(!) при равномерной и малой нагрузке. Так что у вас все впереди :) ...