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

[Rozwiązano] ESP32-C3: Konflikt PWM serwa SG90 i silnika przy 50Hz i 5000Hz

haslomiwygaslo 30 Gru 2024 15:59 1605 1
REKLAMA
  • #1 21369167
    haslomiwygaslo
    Poziom 6  
    Posty: 7
    Pomógł: 2
    Ocena: 2
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Dzień dobry, jestem w 2 klasie liceum i potrzebuje pomocy w rozwiązaniu problemu software'owego na ESP32-C3, związanego z PWM i timerami. Problem polega na tym, że gdy mam w programie zainicjalizowane PWM od serwa (50Hz) i 2×PWM do sterowania silnikiem (5000Hz) to serwo przestaje działać. Gdy tylko w programie usuwam inicjalizację i wszystkie komendy do wysyłania tych 2 PWM od silnika, serwo działa w 100%. W projekcie korzystam z 4 ADC(praktycznie stały odczyt), 3 PWM(1 do serwa i 2 do silnika), 1GPIO INPUT(przycisk), i i2c do oleda. Próbowałem zrobić osobny program i osobny układ na płytce stykowej z samym serwem i silnikiem i ku mojemu zdziwieniu serwo działa razem z silnikiem, sygnały PWM wysyłają się poprawnie do obu rzeczy. Następnie wzorując się na działającym prowizorycznym programie przekleiłem sposób inicjalizacji i wysyłąnia sygnałów PWM do kodu głównego w którym jest cała reszta komponentów i serwo przestaje działać. Próbowałem usunąć z kodu oleda, niepotrzebne funkcje tak aby sygnały nie zależały już od odczytów z ADC ale serwo zaczęło działać w momencie w którym usunąłem inicjalizację 2 PWM od silnika. Piny których używam są te same w działającym prowizorycznym programie jak i w niedziałającym programie głównym. Dzięki temu mogłem sprawdzić czy to nie jest kwestia hardware poprostu wgrywając działający program prowizoryczny i serwo z silnikiem działało. Każdy moduł (serwo i silnik) działa dobrze osobno (bez inicjalizacji i komend drugiego modułu). Gdy serwo nie działa czasami zaczyna poprostu dziwnie i nieprzewidywanie drgać lub ustawiać się w dość losowe pozycje. (Jestem pewny że program działa poprawnie i nie wysyła do serwa kilku dziwnych informacji na raz ani nic podobnego ponieważ robiłem test w którym miałem parę trybów ustawienia serwa w zależności od przycisku i wyświetlałem aktualny tryb na oledzie i wszystko działało dobrze) Kożystam z serwa SG90 które przyjmuje PWM 50Hz i wypełnienie tego PWM od 0.5ms do 2.5ms czyli od 0,025 do 0,12 w skali 0,0 - 1,0. Korzystam z biblioteki ESP32Servo.h i generuję PWM dla serwa za pomocą funkcji generującej PWM a nie funkcji sterującej serwem, ponieważ chce być pewny że wysyłane dane do serwa są prawidłowe. Załączam 2 programy, program główny w którym serwo z silnikiem nie działa i program prowizoryczny na którym testowałem z powodzeniem jednoczesne działanie serwa i silnika. A i jeszcze jedno, gdy serwo jest razem z silnikiem to przestaje dzialac tylko serwo, silnik dziala dobrze. Zasilam uklad z zasilacza laboratoryjnego. Ogolnie moduł miał śledzic światlo za pomoca 4 czujników swiatła ale to chyba nie ma znaczenia. Z góry bardzo dziękuję za wszelką pomoc.
    AI: Czy możesz podać fragmenty kodu, które używasz do inicjalizacji i sterowania PWM w głównym programie?
    #include <ESP32Servo.h> // inicjalizacja biblioteki
    ESP32PWM M1_PWM; // inicjalizacja pwm silnika 1
    ESP32PWM M2_PWM; // inicjalizacja pwm silnika 2
    ESP32PWM S1; // inicjalizacja pwm serwa

    void setup()
    {
    ESP32PWM::allocateTimer(0);
    ESP32PWM::allocateTimer(1);
    ESP32PWM::allocateTimer(2);
    ESP32PWM::allocateTimer(3);

    S1.attachPin(S_PWM, sfreq, 10);
    M1_PWM.attachPin(MOT_1, freq, 10);
    M2_PWM.attachPin(MOT_2, freq, 10);
    }
    S1.adjustFrequency(sfreq,0.12);//sterowwanie pwm serwa, wiem ze moglbym uzywac funcji xx.writeScaled(); ale ta była zawarta w programie przykładowym biblioteki a obie działają.
    M1_PWM.adjustFrequency(freq, 1.0); //sterowanie pwm1 silnika
    M2_PWM.adjustFrequency(freq, 1.0); //sterowanie pwm2 silnika
    //wydaje mi sie ze to wszystko
    AI: Jakie jest dokładne ustawienie zasilania dla serwa i silnika? Czy są zasilane z tego samego źródła, czy osobno?
    Są zasilane z tego samego źródła, na zasilaczu laboratoryjnym ustawiam 7,4V i ograniczenie prądowe na 500mA pobór maksymalny przy testach wynosił około 200mA. 7.4V zamieniane jest przez stabilizator liniowy L7805 (MAX 1,5A) na 5V i z tego stabilizatora zasilane jest serwo silnik i esp32c3, ktore posiada swoj wlasny stabilizator na 3,3v ktorym zasilana jest jego logika i oled.
    Załączniki:
    • ProgramTestowy.txt (926 Bajtów) Musisz być zalogowany, aby pobrać ten załącznik.
    • ProgramGlowny.txt (9.27 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • Pomocny post
    #2 21373142
    haslomiwygaslo
    Poziom 6  
    Posty: 7
    Pomógł: 2
    Ocena: 2
    Udało mi się rozwiązać problem, okazało się że chodziło o kolejność przypisywania pinów do zainicjalizowanych wczesniej PWM tzn:
    Tak nie działało:

    S1.attachPin(S_PWM, sfreq, 10); //SERVO

    M1_PWM.attachPin(MOT_1, freq, 10); //SILNIK
    M2_PWM.attachPin(MOT_2, freq, 10); //SILNIK

    Tak działa:

    M1_PWM.attachPin(MOT_1, freq, 10); //SILNIK
    M2_PWM.attachPin(MOT_2, freq, 10); //SILNIK

    S1.attachPin(S_PWM, sfreq, 10); //SERVO

    Nie wiem czemu tak jest, zakładam że jest jakiś błąd w bibliotece, mam nadzieję że komuś to pomoże.
REKLAMA