Функция MAP расчет значении

Тема в разделе "Микроконтроллеры AVR", создана пользователем Yerabdi, 20 авг 2018.

  1. Yerabdi

    Yerabdi Гик

    Здравствуйте всем в ардуине иде есть готовая функция MAP .
    Преобразование аналогового значения в 8-битное число (от 0 до 255) */
    void setup() {}

    void loop()
    {
    int val = analogRead(0);
    val = map(val, 0, 1023, 0, 255);
    analogWrite(9, val);
    }
    Теперь как можно самому написать такую функцию в атмел студио
     
  2. Yerabdi

    Yerabdi Гик

    Спасибо всем нашел может кому то пригодится
    long map(long x, long in_min, long in_max, long out_min, long out_max)
    {
    return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
    }
     
  3. parovoZZ

    parovoZZ Гуру

    Аналоговое значение откуда берется? С АЦП?
     
  4. b707

    b707 Гуру

    разве только двоечникам :) это называется формула пропорции, класс примерно шестой средней школы :)
     
    Mitrandir нравится это.
  5. DIYMan

    DIYMan Guest

    Кстати сказать, я давно в непонятках - что мешало авторам Wiring сделать вот так:
    Код (C++):
    template <typename T>
    T map(T x, T in_min, T in_max, T out_min, T out_max)
    {
        return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
    }
    ? Тупая привязка к long - не алё, а так - можно юзать вообще любой тип, реализующий операции сложения, вычитания и умножения.

    Хотя нет, я знаю, что мешало: если бы они сделали так, то было бы куча вони, когда пытались бы применить вот так:
    Код (C++):
    long val = 123456;

    long result = map(val,0,100,0,10000);
    Очевидно, что вменяемый компилятор такую конструкцию без явного указания типов всех параметров - не пропустит, поэтому надо
    Код (C++):
    long val = 123456;

    long result = map(val,0l,100l,0l,10000l);
    что введёт в ступор авторов проЭктов из натыренных из этих ваших интернетов скечей :D:D:D
     
  6. b707

    b707 Гуру

    хм... а нафига вообще делать для этого отдельную функцию?
    Еще меня прикалывают авторы, у которых сначала map . а потом еще constrain на те же пределы - видимо, для надежности :)
     
  7. DIYMan

    DIYMan Guest

    Не, ну определённый смысл в наличии некоторого кол-ва функций - есть, стоит рассматривать это как некое API. Тот же digitalWrite - все юзают, это тоже API: на какой-нибудь плате, поддержка для которой реализована для Arduino IDE, digitalWrite может тупо по Serial отправлять строку "PIN=13,ON", например.

    Я понял, о чём намёк: такие вещи надо знать искаропки, что называется. Мой пост только о том, что - если уж делаешь, то сделай поуниверсальней, благо - средства языка позволяют ;) Но, чтобы не повышать порог вхождения - сделали в лоб.
     
  8. Yerabdi

    Yerabdi Гик

    Да с АЦП
     
  9. parovoZZ

    parovoZZ Гуру

    API - это не много другое. А дигиталрайт - это Фреймворк)))
     
  10. parovoZZ

    parovoZZ Гуру

    Арифметика используется до функции map?
     
  11. DIYMan

    DIYMan Guest

    Согласен. Но сути сказанного это не меняет.
     
  12. DetSimen

    DetSimen Guest

    если тебе надо 0-1023 в 0-255 переделать, просто сдвинь вправо на 2, быстрее будет.
     
    parovoZZ нравится это.
  13. parovoZZ

    parovoZZ Гуру

    Если после АЦП нет арифметики, то логичнее сразу с АЦП 8 бит забирать и не водить вилами по воде.
     
  14. Yerabdi

    Yerabdi Гик

    Вообще то мне нужно было с 0-100 в 0-48
     
  15. Mitrandir

    Mitrandir Гуру

    [​IMG]
     
    DetSimen и parovoZZ нравится это.
  16. parovoZZ

    parovoZZ Гуру

    тогда старшие 6 бит забирай с АЦП.