Математические функции ардуино это

Arduino

Математические функции

Функция min(x, y)

Описание

Возвращает наименьшее из двух чисел, поддерживает все числовые типы данных.

Синтаксис
Параметры

x — первое число

y — второе число

Возвращаемое значение

Меньшее из двух чисел

Пример
Примечания

Следует избегать использования функций внутри функции, например min(a++, b); , так как из-за внутренней реализации она может вернуть неверный результат.

Функция max(x, y)

Описание

Возвращает наибольшее из двух чисел, поддерживает все числовые типы данных.

Синтаксис
Параметры

x — первое число

y — второе число

Возвращаемое значение

Наибольшее из двух чисел

Пример
Примечания

Следует избегать использования функций внутри функции, например max(a++, b); , так как из-за внутренней реализации она может вернуть неверный результат.

Функция abs()

Описание

Возвращает модуль число (абсолютное значение числа).

Синтаксис
Параметры
Возвращаемое значение

Вернет x , если x — положительное число или 0, иначе вернет -x

Пример
Примечания

Следует избегать использования функций внутри функции, например abs(a++); , так как из-за внутренней реализации она может вернуть неверный результат.

Функция constrain(x, a, b)

Описание

Функция проверяет, входит ли число x в диапазон [a..b]. Если x меньше, чем a , то функция вернет a , если x больше, чем b , то вернет b . Иначе вернет x . Поддерживает все числовые типы.

Синтаксис
Параметры

x — проверяемое число

a — нижняя граница диапазона

b — верхняя граница диапазона

Возвращаемое значение

Если x входит в диапазон [a..b], то возвращает x , если оно меньше нижней границы, то вернется a , если же оно больше верхней границы, то вернется b .

Пример
Примечания

Следует избегать использования функций внутри функции, например constrain(Serial.parseInt(), minimumValue, maximumValue); , так как из-за внутренней реализации она может вернуть неверный результат.

Функция map(value, fromLow, fromHigh, toLow, toHigh)

Описание

Функция пропорционально переносит число из одного диапазона в другой. Причем число не обязательно должно быть ограничено рамками первого интервала. Также верхняя граница интервала может быть меньше нижний границы.

Синтаксис

map(value, fromLow, fromHigh, toLow, toHigh)

Параметры

value — число, которое следует пропорциональное перенести из первого интервала во второй

fromLow — нижняя граница текущего интервала

fromHigh — верхняя граница текущего интервала

toLow — нижняя граница целевого интервала

toHigh — верхняя граница целевого интервала

Возвращаемое значение

Число, пропорционально перенесенное из одного интервала в другой

Пример
Примечания

Функция map() использует целочисленную математику, поэтому при необходимости использования в проекте вычислений с большей точностью, чем целые числа, не рекомендуется использовать данную функцию, а делать все вычисления следует вручную.

Функция pow(base, exponent)

Описание

Функция возвращает результат операции возведения числа в степень. И параметры, и результат — числа с плавающей точкой.

Источник

RoboCraft

рассмотрим специфичные математические функции Arduino

Описание:
Возвращает меньшее из двух чисел

Параметры:
x: первое число
y: второе число

Возвращаемое значение:
Меньшее число из двух

Примечание:
т.к. min(x, y) – это макрос – не стоит использовать функции внутри скобок, чтобы избежать неправильных результатов

Описание:
Возвращает большее из двух чисел

Параметры:
x: первое число
y: второе число

Возвращаемое значение:
Большее число из двух

Примечание:
т.к. max(x, y) – это макрос – не стоит использовать функции внутри скобок, чтобы избежать неправильных результатов

Описание:
Возвращает модуль (абсолютную величину) числа. (http://ru.wikipedia.org/wiki/Модуль_числа)

Параметры:
x: число

Возвращаемое значение:
x: если x больше или равен 0.
-x: если x меньше 0.

Примечание:
т.к. abs(x) – это макрос – не стоит использовать функции внутри скобок, чтобы избежать неправильных результатов

Описание:
Проверяет находится ли число x в диапазоне (a,b)

Параметры:
x: число для проверки
a: нижняя грань диапазона
b: верхняя грань диапазона

Возвращаемое значение:
x: если x лежит между a и b
a: если x меньше, чем a
b: если x больше, чем b

map(value, fromLow, fromHigh, toLow, toHigh)

Описание:
Отображает число из одного диапазона в другой.

Примечание:
Функция не проверяет – содержится ли число в необходимом диапазоне, поэтому можно вызвать функцию constrain() перед или после функции map().
Так же, «нижняя граница » диапазонов может быть больше или меньше, чем «верхняя граница», т.о. функция map() может быть использована, чтобы перевернуть диапазон чисел, например:

функция так же может оперировать с отрицательными числами:

Функция map() оперирует целыми числами, поэтому никаких десятичных значений не выдаётся. Дробные остатки отсекаются, а не округляются или усредняются.

Параметры:
value: число для отображения
fromLow: нижняя граница текущего диапазона числа value
fromHigh: верхняя граница текущего диапазона числа value
toLow: нижняя граница целевого диапазона
toHigh: верхняя граница целевого диапазона

Возвращаемое значение:
Целое число типа long

Описание:
Функция предназначена для возведения числа в заданную степень.

Параметры:
base: число(float)
exponent: степень(float)

Возвращаемое значение:
Результат возведения в степень (double)

Описание:
Вычисляет квадрат числа: число умноженное на себя.

Параметры:
x: число

Возвращаемое значение:
Квадрат числа

Описание:
Вычисляет квадратный корень числа.

Параметры:
x: число

Возвращаемое значение:
Квадратный корень числа, тип double

Описание:
Вычисляет синус угла (в радианах). Результат будет между -1 и 1.

Параметры:
rad: угол в радианах (float)

Возвращаемое значение:
Синус угла, тип double

Примечание:
Serial.print() и Serial.println() в версиях IDE до 0018 не поддерживали печати типа float.

Описание:
Вычисляет косинус угла (в радианах). Результат будет между -1 и 1.

Параметры:
rad: угол в радианах (float)

Возвращаемое значение:
Косинус угла, тип double

Примечание:
Serial.print() и Serial.println() в версиях IDE до 0018 не поддерживали печати типа float.

Описание:
Вычисляет тангенс угла (в радианах). Результат будет между плюс и минус бесконечностью 🙂

Параметры:
rad: угол в радианах (float)

Возвращаемое значение:
Тангенсс угла, тип double

Источник

Arduino – функции – математика

Математические функции в Arduino IDE облегчают выполнение сравнение и преобразование значений, полученных путем измерения или передачи данных. Разработчики Arduino IDE не советуют использовать инкремент и декремент в рамках математических функций, оправдывая это тем, что результат может быть не таким, как ожидалось … Лично мы не заметили неисправность этого синтаксиса.

Функция min()

Функция min() возвращает меньшее значение из двух указанных в качестве параметров. Пример использования функции min():
[slh lang=»php»] int x;
x=min(100,200); //результат x=100
x=min(a,b) // если a b, то x=b
[/slh] В первом случае переменная х будет иметь значение 100, во втором, в зависимости от значений переменных a и b, переменной x будет присвоено меньшее значение.

Функция max()

Аналогично функции min(), функция max() возвращает большее значение из двух указанных в качестве параметров. Пример использования функции max():
[slh lang=»php»] int x;
x=max(100,200); //результат x=200
x=max(a,b) // если a>b, то x=a, если a a и x b функция возвращает значение b. С помощью функции constrain() мы можем ограничить набор значений, полученных с аналогового входа для указанного интервала. Ниже пример использования функции constrain():
[slh lang=»php»] sensVal = constrain(sensVal, 10, 150);[/slh] //граница считанных значений 10…150

Функция map()

Функция map() позволяет пересчитать (масштабировать) значения из одного диапазона в другой. Это часто используется в ситуациях, когда мы хотим сделать пропорциональное управление. Например, на основе считанного входного напряжения мы контролируем сигнал ШИМ. Синтаксис функции map():
[slh lang=»php»]map(x,a1,a2,b1,b2);
[/slh]

  • x — это значение, которое должно быть пересчитано;
  • a1 и a2 — это граничные значения интервала, из которого следует пересчитать;
  • b1 и b2 — это предельные значения нового интервала.

Функция вернет значение от b1 до b2.
Ниже пример применения функции map():
[slh lang=»php»]#define analogPin A0;
#define digitalPin 9
void setup()
<
pinMode(analogPin,INPUT);
pinMode(digitalPin,OUTPUT);
>
void loop()
<
int val = analogRead(analogPin);
val = map(val, 0, 1023, 0, 255); //преобразование 10-битного числа в 8-битное
analogWrite(pwmPin, val);
>
[/slh]

В этом примере значение, считанное из 10-разрядного аналого-цифрового преобразователя, было преобразовано в 8-разрядное значение ШИМ.

Функция pow()

Функция pow() возвращает значение числа возведенного в степень. Синтаксис функции pow():
[slh lang=»php»]pow(x,y);[/slh] x — это число, возводимое в степень;
y — показатель степени (экспонента).
Примеры использования функции pow():
[slh lang=»php»] float x;
int a;
x = pow(2,3); //x=8.00
a = pow(2,3); //а=8
a = pow(3,2); //а=9
[/slh]

Функция sq()

Функция sq() позволяет вычислить квадрат заданного числа. Примеры использования функции sq():
[slh lang=»php»] int a=3;
int x;
x = sq(a); // x = 9
x = sq(2); // x = 4
[/slh]

Функция sqrt()

Функция sqrt() позволяет извлечь квадратный корень заданного числа. Примеры использования функции sqrt():
[slh lang=»php»] int a=16;
int x;
x = sqrt(a); // x = 4
x = sqrt(25); // x = 5
[/slh]

Функции sin(), cos(), tan()

Тригонометрические функции, содержащиеся в Arduino IDE, позволяют вычислить значения sin, cos, tg для угла, указанного в радианах. Вызов функции прост — каждая из этих функций требует в качестве параметра вызова значение угла в радианах.

Источник

Математические операции

Математика

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

  • = присваивание
  • + сложение
  • — вычитание
  • * умножение
  • / деление
  • % остаток от деления

Рассмотрим простой пример:

По поводу последних двух строчек из примера, когда переменная участвует в расчёте своего собственного значения: существуют также составные операторы, укорачивающие запись:

  • += составное сложение: a += 10 равносильно a = a + 10
  • -= составное вычитание: a -= 10 равносильно a = a — 10
  • *= составное умножение: a *= 10 равносильно a = a * 10
  • /= составное деление: a /= 10 равносильно a = a / 10
  • %= остаток от деления: a %= 10 равносильно a = a % 10

С их использованием можно сократить запись последних двух строчек из предыдущего примера:

Очень часто в программировании используется прибавление или вычитание единицы, для чего тоже есть короткая запись:

  • ++ (плюс плюс) инкремент: a++ равносильно a = a + 1
  • — (минус минус) декремент: a— равносильно a = a — 1

Порядок записи инкремента играет очень большую роль: пост-инкремент var++ возвращает значение переменной до выполнения инкремента. Операция пре-инкремента ++var возвращает значение уже изменённой переменной. Пример:

Как говорилось в предыдущем уроке – локальные переменные нужно инициализировать, иначе в математических операциях получится непредсказуемый результат.

Порядок вычислений

Порядок вычисления выражений подчиняется обычным математическим правилам: сначала выполняются действия в скобках, затем умножение и деление, и в конце – сложение и вычитание.

Скорость вычислений

Математические вычисления выполняются процессором некоторое время, оно зависит от типа данных и типа операции. Вот время выполнения (в микросекундах) не оптимизированных компилятором вычислений для Arduino Nano 16 МГц:

Тип данных Время выполнения, мкс
Сложение и вычитание Умножение Деление, остаток
int8_t 0.44 0.625 14.25
uint8_t 0.44 0.625 5.38
int16_t 0.89 1.375 14.25
uint16_t 0.89 1.375 13.12
int32_t 1.75 6.06 38.3
uint32_t 1.75 6.06 37.5
float 8.125 10 31.5
  • Нужно понимать, что не все во всех случаях математические операции занимают ровно столько времени, так как компилятор их оптимизирует. Можно помочь ему в этом, подробнее читайте в уроке по оптимизации кода.
  • Операции с float выполняются гораздо дольше целочисленных, потому что в AVR нет аппаратной поддержки чисел с плавающей точкой и она реализована программно как сложная библиотека. В некоторых микроконтроллерах есть FPU – специальный аппаратный блок для вычислений с float .
  • Операции целочисленного деления на AVR выполняются дольше по той же причине – они реализованы программно, а вот умножение и сложение с вычитанием МК делает аппаратно и очень быстро.

Целочисленное деление

При целочисленном делении результат не округляется по “математическим” правилам, дробная часть просто отсекается, фактически это округление вниз: и 9/10 и 1/10 дадут 0 . При использовании float само собой получится 0.9 и 0.1 . Если нужно целочисленное деление с округлением вверх, его можно реализовать так: вместо x / y записать (x + y — 1) / y . Рассмотренные выше примеры деления на 10 дадут результат 1 .

Для округления по обычным математическим правилам можно использовать функцию round() , но она довольно тяжёлая, так работает с float .

Переполнение переменной

Вспомним предыдущий урок о типах данных: что будет с переменной, если её значение выйдет из допустимого диапазона? Тут всё весьма просто: при переполнении в бОльшую сторону из нового значения вычитается максимальное значение переменной, и у неё остаётся только остаток. Для сравнения представим переменную как ведро. Будем считать, что при наливании воды и заполнении ведра мы скажем стоп, выльем из него всю воду, а затем дольём остаток. Вот так и с переменной, что останется – то останется. Если переполнение будет несколько раз – несколько раз опорожним наше “ведро” и всё равно оставим остаток. Ещё один хороший пример – кружка Пифагора.

При переполнении в обратную сторону (выливаем воду из ведра), будем считать, что ведро полностью заполнилось. Да, именно так =) Посмотрим пример:

Особенность больших вычислений

Для сложения и вычитания по умолчанию используется ячейка 4 байта ( long ), но для умножения и деления – 2 байта ( int ). Если при умножении или делении в текущем действии результат превысит 32768 – ячейка переполнится и мы получим некорректный результат. Для исправления ситуации нужно привести тип переменной к long перед вычислением, что заставит МК выделить дополнительную память. Например a = (long)b * c;

Для цифр существуют модификаторы, делающие то же самое:

  • U или u – перевод в uint16_t (от 0 до 65’535). Пример: 36000u
  • L или l – перевод в int32_t (-2 147 483 648… 2 147 483 647). Пример: 325646L
  • UL или ul – перевод в uint32_t (от 0 до 4 294 967 295). Пример: 361341ul

Посмотрим, как это работает на практике:

Особенности float

Помимо медленных вычислений, поддержка работы с float занимает много памяти, т.к. реализована в виде “библиотеки”. Использование математических операций с float однократно добавляет примерно 1.5 кБ в память программы.

С вычислениями есть такая особенность: если в выражении нет float чисел, то вычисления будут иметь целый результат (дробная часть отсекается). Для получения правильного результата нужно писать преобразование (float) перед действием, использовать float числа или float переменные. Также есть модификатор f , который можно применять только к цифрам float . Смысла в нём нет, но такую запись можно встретить. Смотрим:

При присваивании float числа целочисленному типу данных дробная часть отсекается. Если хотите математическое округление – его нужно использовать отдельно:

Следующий важный момент: из за особенности самой модели “чисел с плавающей точкой” – вычисления иногда производятся с небольшой погрешностью. Смотрите (значения выведены через порт):

Казалось бы, val2 должна стать ровно 0.1 после вычитания, но в 8-ом знаке вылезла погрешность! Будьте очень внимательны при сравнении float чисел, особенно со строгими операциями : результат может быть некорректным и нелогичным.

Список математических функций

Математических функций в Arduino довольно много, часть из них являются макросами, идущими в библиотеке Arduino.h, все остальные же наследуются из мощной C++ библиотеки math.h

Функция Описание
cos (x) Косинус (радианы)
sin (x) Синус (радианы)
tan (x) Тангенс (радианы)
fabs (x) Модуль для float чисел
fmod (x, y) Остаток деления x на у для float
modf (x, *iptr) Возвращает дробную часть, целую хранит по адресу iptr http://cppstudio.com/post/1137/
modff (x, *iptr) То же самое, но для float
sqrt (x) Корень квадратный
sqrtf (x) Корень квадратный для float чисел
cbrt (x) Кубический корень
hypot (x, y) Гипотенуза ( корень(x*x + y*y) )
square (x) Квадрат ( x*x )
floor (x) Округление до целого вниз
ceil (x) Округление до целого вверх
frexp (x, *pexp) http://cppstudio.com/post/1121/
ldexp (x, exp) x*2^exp http://cppstudio.com/post/1125/
exp (x) Экспонента (e^x)
cosh (x) Косинус гиперболический (радианы)
sinh (x) Синус гиперболический (радианы)
tanh (x) Тангенс гиперболический (радианы)
acos (x) Арккосинус (радианы)
asin (x) Арксинус (радианы)
atan (x) Арктангенс (радианы)
atan2 (y, x) Арктангенс (y / x) (позволяет найти квадрант, в котором находится точка)
log (x) Натуральный логарифм х ( ln(x) )
log10 (x) Десятичный логарифм x ( log_10 x)
pow (x, y) Степень ( x^y )
isnan (x) Проверка на nan (1 да, 0 нет)
isinf (x) Возвр. 1 если x +бесконечность, 0 если нет
isfinite (x) Возвращает ненулевое значение только в том случае, если аргумент имеет конечное значение
copysign (x, y) Возвращает x со знаком y (знак имеется в виду + -)
signbit (x) Возвращает ненулевое значение только в том случае, если _X имеет отрицательное значение
fdim (x, y) Возвращает разницу между x и y, если x больше y, в противном случае 0
fma (x, y, z) Возвращает x*y + z
fmax (x, y) Возвращает большее из чисел
fmin (x, y) Возвращает меньшее из чисел
trunc (x) Возвращает целую часть числа с дробной точкой
round (x) Математическое округление
lround (x) Математическое округление (для больших чисел)
lrint (x) Округляет указанное значение с плавающей запятой до ближайшего целого значения, используя текущий режим округления и направление
Функция Значение
min(a, b) Возвращает меньшее из чисел a и b
max(a, b) Возвращает большее из чисел
abs(x) Модуль числа
constrain(val, min, max) Ограничить диапазон числа val между min и max
map(val, min, max, newMin, newMax) Перевести диапазон числа val (от min до max ) в новый диапазон (от newMin до newMax ). val = map(analogRead(0), 0, 1023, 0, 100); – получить с аналогового входа значения 0-100 вместо 0-1023. Работает только с целыми числами!
round(x) Математическое округление
radians(deg) Перевод градусов в радианы
degrees(rad) Перевод радиан в градусы
sq(x) Квадрат числа
Константа Значение Описание
INT8_MAX 127 Макс. значение char, int8_t
UINT8_MAX 255 Макс. значение byte, uint8_t
INT16_MAX 32767 Макс. значение int, int16_t
UINT16_MAX 65535 Макс. значение unsigned int, uint16_t
INT32_MAX 2147483647 Макс. значение long, int32_t
UINT32_MAX 4294967295 Макс. значение unsigned long, uint32_t
M_E 2.718281828 Число e
M_LOG2E 1.442695041 log_2 e
M_LOG10E 0.434294482 log_10 e
M_LN2 0.693147181 log_e 2
M_LN10 2.302585093 log_e 10
M_PI 3.141592654 pi
M_PI_2 1.570796327 pi/2
M_PI_4 0.785398163 pi/4
M_1_PI 0.318309886 1/pi
M_2_PI 0.636619772 2/pi
M_2_SQRTPI 1.128379167 2/корень(pi)
M_SQRT2 1.414213562 корень(2)
M_SQRT1_2 0.707106781 1/корень(2)
NAN __builtin_nan(“”) nan
INFINITY __builtin_inf() infinity
PI 3.141592654 Пи
HALF_PI 1.570796326 пол Пи
TWO_PI 6.283185307 два Пи
EULER 2.718281828 Число Эйлера е
DEG_TO_RAD 0.01745329 Константа перевода град в рад
RAD_TO_DEG 57.2957786 Константа перевода рад в град

Видео

Источник

Adblock
detector