logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak skalować zmienną w czystym C podobnie jak funkcją map w Arduino?

nik1197 06 Mar 2016 21:56 2247 6
REKLAMA
  • #1 15501256
    nik1197
    Poziom 9  
    Witam programując w Arduino spotkałem ciekawą funkcję: map. Która to skaluje nam jedną wartość zmiennej na drugą np. jakaś_zmienna = map(jakaś_zmienna,0,1023,0,100);
    czyli zmienna ta pierwotnie przyjmuje wartość od 0- 1023 a po użyciu tej funkcji od 0-100. Czy w czystym C też istnieje jakaś funkcja podobna do tej? albo jak uzyskać taki efekt. Chodzi mi o to że podłączając np fotorezystor do ADC, wartość będzie zmieniać się np. od 200-800 i chciałbym uzyskać efekt gdzie 200 to np 0% a 800 to 100% macie jakieś pomysły jak to uzyskać?
  • REKLAMA
  • REKLAMA
  • #3 15501288
    bgolab
    Poziom 22  
    W arduino reference jest napisane wprost jaka jest implemetacja - zakres jest proporcjonalnie przeskalowany do innego zakresu:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Dodano po 40 [sekundy]:

    https://www.arduino.cc/en/Reference/Map
  • REKLAMA
  • #4 15503077
    nik1197
    Poziom 9  
    Postępując z tym wzorem tj. mam dwa zakresy "a" i "b" oraz "c" i "d" i wzór y=(x-a)*(d-c)/(b-a)+c

    przykład
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    wartość ADC zmienia się od 0- 1023 natomiast zmienna wartosc powinna się zmieniać od 100- 200, lecz gdy kręcę potencjometrem zakres zmiennej wartosc zmienia się od 100- 163 a po przekroczeniu tego licznik zlicza od nowa od 100 do 134.
    Ktoś wie dlaczego tak się dzieje lub gdzie jest błąd?
    Dodam tylko że licząc na kartce wartosc y dla x=100 x=1000 oraz x=453 wyniki się zgadzały tj mieściły się w zakresie 100-200. Problem leży gdzieś w kodzie ponieważ zarówno arduino z serial portem jak i atmega z 7seg wyświetlaczem pokazywały tak samo.
  • Pomocny post
    #5 15503227
    BlueDraco
    Specjalista - Mikrokontrolery
    Jakie masz typy tych zmiennych? pom powinna mieć 32 bity - uint32_t albo unsigned long.
  • REKLAMA
  • Pomocny post
    #6 15503252
    bgolab
    Poziom 22  
    Wyglada na przekroczenie 16bitow przy mnozeniu - tak jak Kolega wyzej napisalprzejsc na 32 bity
  • #7 15503469
    nik1197
    Poziom 9  
    Zgadza się zamienienie uint16_t na uint32_t pomogło. nie pomyślałem o tym że pom * 100 przekroczy 16 bitową zmienną. Dzięki wielkie za pomoc.
REKLAMA