реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> вычисление корня, быстрое вычисление приближённого корня
haki
сообщение Jun 30 2013, 19:24
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 19-11-12
Из: Екб
Пользователь №: 74 468



ATMega8515. Не имеет FPU. ИМС во многом минималистична. Но если ей необходимо вычислять периоды шага для шагового двигателя, встаёт вопрос быстрого вычисления корня для формул разгона и торможения. Собственно сам вопрос заключается в том, как быстро вычислять корни используя лишь сложение, вычитание и умножение. При этом желательно оставаться в области целых чисел эмулирующих псевдо натуральные с фиксированной точкой для простоты.
Примерная формуля выглядит следующим образом: N = x*sqrt(y). это сильно упрощённая формула для наглядности.


--------------------
Go to the top of the page
 
+Quote Post
Maverick
сообщение Jun 30 2013, 19:34
Сообщение #2


я только учусь...
******

Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



Цитата(haki @ Jun 30 2013, 22:24) *
ATMega8515. Не имеет FPU. ИМС во многом минималистична. Но если ей необходимо вычислять периоды шага для шагового двигателя, встаёт вопрос быстрого вычисления корня для формул разгона и торможения. Собственно сам вопрос заключается в том, как быстро вычислять корни используя лишь сложение, вычитание и умножение. При этом желательно оставаться в области целых чисел эмулирующих псевдо натуральные с фиксированной точкой для простоты.
Примерная формуля выглядит следующим образом: N = x*sqrt(y). это сильно упрощённая формула для наглядности.

Уоррен "Алгоритмические трюки для программистов", там есть "аппаратный" алгоритм на Си:

Код
unsigned x, y;
unsigned sqrt(){
  y = 0;
  unsigned m = 1 << 30;    
  while( m ){
    unsigned b =  y | m;
    y >>= 1;
    if( x >= b ){
        x -= b;
        y |= m;
    }            
    m >>= 2;
  }    
}


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
kovigor
сообщение Jun 30 2013, 19:34
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(haki @ Jun 30 2013, 22:24) *
Примерная формуля выглядит следующим образом: N = x*sqrt(y). это сильно упрощённая формула для наглядности.

Можно использовать, например, табличный метод, или алгоритм "цифра за цифрой" (CORDIC).
А почему вы на Си не пишете ?
Go to the top of the page
 
+Quote Post
Maverick
сообщение Jun 30 2013, 19:35
Сообщение #4


я только учусь...
******

Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



Цитата(haki @ Jun 30 2013, 22:24) *
...необходимо вычислять периоды шага для шагового двигателя...

сходные задачи решаем...


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
haki
сообщение Jun 30 2013, 19:53
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 19-11-12
Из: Екб
Пользователь №: 74 468



Цитата(kovigor @ Jul 1 2013, 01:34) *
Можно использовать, например, табличный метод, или алгоритм "цифра за цифрой" (CORDIC).
А почему вы на Си не пишете ?


Я не говорил про язык, тут речь про алгоритм. Таблицы не уместны. Посмотрите сколько памяти у МК, еле хватает на переменные.


--------------------
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 30 2013, 21:09
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Попробуйте подойти к проблеме с другой стороны:
http://www.embedded.com/design/mcus-proces...es-in-real-time
И чтож за монстра вы строите, что вам не хватает памяти 8515 ни на таблицы, ни на переменные для одного шаговичка? Может в консерватории что-то не так?

исправил ссылку


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
-SANYCH-
сообщение Jul 1 2013, 09:32
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 289
Регистрация: 6-12-05
Пользователь №: 11 864



Вот еще примеры вычисления квадратного корня:
http://algolist.manual.ru/maths/count_fast/intsqrt.php
Go to the top of the page
 
+Quote Post
Tanya
сообщение Jul 1 2013, 10:01
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883



Цитата(haki @ Jun 30 2013, 23:53) *
Таблицы не уместны. Посмотрите сколько памяти у МК, еле хватает на переменные.

Мне вот как-то хватает. Это ведь не переменные, а постоянные. Масштабируемые.
Go to the top of the page
 
+Quote Post
Iptash
сообщение Jul 1 2013, 10:20
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 613
Регистрация: 2-09-08
Из: г.Набережные Челны
Пользователь №: 39 936



Без sqrt разве нельзя обойтись?. Я управление шаговиком сделал на младшей CPLD MAX II в микрошаговом режиме с разгоном/торможением, все очень
реально работало и еще место на кристале осталось.
Go to the top of the page
 
+Quote Post
Corvus
сообщение Jul 1 2013, 10:28
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 24-04-08
Из: Зеленоград
Пользователь №: 37 056



AVR 446 в помощь. Даже исходники есть.
http://www.atmel.com/images/doc8017.pdf
Go to the top of the page
 
+Quote Post
zöner
сообщение Jul 1 2013, 10:48
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 195
Регистрация: 16-02-12
Пользователь №: 70 299



может, как-нибудь преобразовать расчеты, и вместо корня вычислять квадрат ?
N2 = x* x * y

Сообщение отредактировал zöner - Jul 1 2013, 10:48
Go to the top of the page
 
+Quote Post
Александр77
сообщение Jul 9 2013, 19:01
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 608
Регистрация: 10-07-09
Из: Дубна, Московская область
Пользователь №: 51 111



Если достаточно найти целую часть, то можно воспользоваться методом из википедии
Цитата
Арифметическое извлечение квадратного корня

Для квадратов чисел верны следующие равенства:
1 = 1^2
1 + 3 = 2^2
1 + 3 + 5 = 3^2
\sum^n_{k=1}{(2k-1)}=n^2
и так далее.

То есть, узнать целую часть квадратного корня числа можно, вычитая из него все нечётные числа по порядку, пока остаток не станет меньше следующего вычитаемого числа или равен нулю, и посчитав количество выполненных действий. Например, так:

9-1=8
8-3=5
5-5=0

Выполнено 3 действия, квадратный корень числа 9 равен 3.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd June 2025 - 08:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.01447 секунд с 7
ELECTRONIX ©2004-2016