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

Zmiana zakresu pracy potencjometru drugim potencjometrem.

rzemyk90 28 Wrz 2017 18:42 1686 14
REKLAMA
  • #1 16726450
    rzemyk90
    Poziom 21  
    Posty: 460
    Pomógł: 25
    Ocena: 275
    Witam.

    Mam taki kod :

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


    Mam dwa potencjometry. Jednym steruje wartość pwm w zakresie 650,1000 , a drugim chciałbym sterować zakresem pierwszego potencjometru.
    Czyli coś takiego :

    Drugi potencjometr mam ustawiony na max, czyli na 1024 po ADC.
    Pierwszy działa proporcjonalnie w zakresie 650,1000 i odpowiednio 0,255

    Drugi potencjometr jest ustawiony na 50% czyli na 512.
    Pierwszy działa proporcjonalnie w zakresie 650, 875 i pwm 0,127.

    Drugi potencjometr na 20 %, czyli na 204 .
    Pierwszy działa w zakresie 650,720 i odpowiedno pwm 0,55

    Jest możliwość zrobienia czegoś takiego?
    [/code]
  • REKLAMA
  • #2 16726550
    pawlik118
    Poziom 34  
    Posty: 2422
    Pomógł: 202
    Ocena: 607
    Tak, jest to możliwe.
    przyjmijmy że pot1 = ADC1, pot2=ADC2
    Jak rozumiem, chcesz aby drugi potencjometr ustawiał zakres pracy pierwszego?

    Wystarczy pomnożyć wartość ADC1*ADC2/1024
  • REKLAMA
  • #3 16726572
    rzemyk90
    Poziom 21  
    Posty: 460
    Pomógł: 25
    Ocena: 275
    Ale to nie zadziała w ten sposób, bo to by działało tak jakbym dwa potencjometry szeregowo podłączył. Ten pierwszy potencjometr ma jeszcze niższy zakres działania 400,250, gdzie też to musi być regulowane z drugiego potencjometru.
  • REKLAMA
  • #4 16727463
    pawlik118
    Poziom 34  
    Posty: 2422
    Pomógł: 202
    Ocena: 607
    Poddaję się, nie potrafię zrozumieć co potrzebujesz.
  • #5 16727513
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Autor potrzebuje korepetycji z matematyki na poziomie wczesnego liceum - funkcja liniowa, wyrażenia algebraiczne, podstawy arytmetyki.
  • #6 16727608
    sawitar
    Poziom 18  
    Posty: 226
    Pomógł: 20
    Ocena: 19
    Nie jestem pewien czy do końca rozumiem o co chodzi autorowi no i informacjami nasz nie rozpieszcza, ale...
    Zakładając ze każdy potencjometr jest podłączony do osobnego kanału przetwornika oraz ze funkcja która odczytuje nastaw potencjometru nazywa sie odczytaj_nastaw_XXX to wychodzi mi taki kod:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #7 16727919
    rzemyk90
    Poziom 21  
    Posty: 460
    Pomógł: 25
    Ocena: 275
    Inaczej :

    Pierwszy potencjometr reguluje PWM od 0 do granicy, która jest ustawiona drugim potencjometrem.
    Drugi potencjometr ma przesuwać maksymalną granicę od 255 do 0, czyli np. jeśli potencjometr jest na połowie, to granica jest ustawiona od 0 do 127( przeskalowanie wartości 0,1024,0,255), w tym czasie pierwszy potencjometr reguluje pwm od 0 do 127.

    Tutaj prosty przykład :

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #8 16728041
    sawitar
    Poziom 18  
    Posty: 226
    Pomógł: 20
    Ocena: 19
    No i tak ci napisałem.
    Pamiętaj ze program wykonuje się instrukcja po instrukcji i musisz najpierw ustalić zakres wartości a dopiero potem aktualny nastaw.
    Tak jak w moim przykładzie. Zmień tylko #define na coś co pasuje do twojego projektu.
  • #9 16728078
    pawlik118
    Poziom 34  
    Posty: 2422
    Pomógł: 202
    Ocena: 607
    myślę że mój przykład też był prawidłowy, czyli PWM = ADC1*ADC2/1024 dla ustawienia adc 10bit, dla 8bit PWM=ADC1*ADC2/255

    gdy ADC1 = 255, ADC2=127 to PWM = 255*127/255 = 127

    hmm, mnożenie i dzielenie to chyba nawet wcześniej niż w liceum..
  • #10 16728166
    rzemyk90
    Poziom 21  
    Posty: 460
    Pomógł: 25
    Ocena: 275
    Zgadza się, ale podałem bardzo prosty przykład, na którym to zadziała(prosty przykład w celu zrozumienia ) W rzeczywistości program jest bardziej złożony.


    Na tym przykładzie to nie zda egzaminu, bo jeden potencjometr steruje dwoma wyjściami, 9 i 10 . Na każdym wyjściu są też inne wartości.

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


    pot2 musi skalować jednocześnie dwa kanały
  • REKLAMA
  • #11 16728234
    sawitar
    Poziom 18  
    Posty: 226
    Pomógł: 20
    Ocena: 19
    Nie widzę odczytu pot2 w twoim kodzie.
    Czy to ma być taki softwarowy PWM? (Jeśli tak, to nie będzie działał).
    Po co tyle zmiennych globalnych?

    Może przybliżysz nam co ten kod ma robić.

    p.s. Popracuj nad formatowaniem bo czytanie tego kodu to mordęga.
  • #12 16728260
    rzemyk90
    Poziom 21  
    Posty: 460
    Pomógł: 25
    Ocena: 275
    Odczytu pot2 nie ma bo trzeba dołożyć do programu. Robiłem już kilkanaście wariantów i nie działa.

    PWM oczywiście działa na innych przykładach, tutaj szybko sobie zmieniam zakres pracy, wypełnienie oraz częstotliwość tak jak chce.

    Kod steruje PWM , tak jak widać:)
  • Pomocny post
    #13 16728309
    sawitar
    Poziom 18  
    Posty: 226
    Pomógł: 20
    Ocena: 19
    W ten sposób możesz zrobić sterowanie jednym kanałem PWM, ale przy dwóch to nie będzie działało. Bo najpierwszy sterujesz jednym kanałem (a drugi w tym czasie czeka i nic sie nie dzieje) a następnie sterujesz drugim kanałem (a w tym czasie pierwszy czeka). Podczas gdy oba kanały powinny działać niezależnie od siebie.

    Najlepiej zrobić to na liczniku w HW, ale w SW tez się da.
    Poszukaj w guglach 'software PWM' ewentualnie moge ci coś skrobnąć w poniedziałek.
  • #14 16728321
    rzemyk90
    Poziom 21  
    Posty: 460
    Pomógł: 25
    Ocena: 275
    No i konkretna odpowiedz. Jeszcze mam taki pomysł:

    Zamiast tych wartości które chce zmienić, podstawić jeden z zakresow z pot1. Czyli :

    val1=1000;
    pot1, (650, val1,150,900)
    val1=map(pot2,0,1024,650,1000)

    Reszta się przeskaluje automatycznie.

    Zadziała to??
  • #15 16731016
    sawitar
    Poziom 18  
    Posty: 226
    Pomógł: 20
    Ocena: 19
    Architektura twojego programu stanowi fundamentalny problem dlaczego to nie zadziała. Sposób w jaki odczytujesz potencjometry nie ma żadnego znaczenia.

    Tutaj masz przykładowe rozwiązanie:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Nie jest to najbardziej optymalne rozwiązanie i na pewno nie pościłbym tego nigdzie na produkcji ale pokazuje sposób rozwiązania problemu.

    Aktualny nastaw jest zadawany pot2 z tym ze na PWM0 jest limitowany przez pot1, a PWM1 nie ma takiego limitu.

    p.s. nie wiem czy to się kompiluje bo pisałem z głowy

Podsumowanie tematu

✨ Użytkownik poszukuje sposobu na regulację zakresu pracy jednego potencjometru (pot1) za pomocą drugiego potencjometru (pot2). Pot1 ma zakres PWM od 650 do 1000, a pot2 ma ustalać ten zakres. W odpowiedziach zaproponowano różne metody, w tym wykorzystanie funkcji map do przeskalowania wartości odczytanych z potencjometrów. Wskazano również na problemy z architekturą programu, które mogą uniemożliwić prawidłowe działanie, oraz zasugerowano użycie sprzętowego PWM dla lepszej wydajności. Użytkownik rozważał różne podejścia do przeskalowania wartości PWM w zależności od ustawień pot2.
Wygenerowane przez model językowy.
REKLAMA