Kod: C / C++
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.