xpytonx Napisano Październik 31, 2023 Udostępnij Napisano Październik 31, 2023 Witam. Jako iż znalazłem ciut czasu na zabawę w "programowanie" postanowiłem zrobić wykrywacz metali VLF Plan polegał na tym by się nauczyć czegoś nowego... Chciałem mieć możliwość zmiany częstotliwości PWM oraz jego wypełnienia, to się po części udało - nie potrafię zmienić częstotliwości w trakcie (dodanie jej do LOOP) Jakieś pomysły? Drugi problem to pomiar napięcia na wejściu analogowym - jest ono nie poprawne, zakładam że problemem jest wysoka częstotliwość sygnału (sinus o częstotliwości ok 5kHz i amplitudzie 0 - 3V. Po podpięciu napięcia zasilającego 3,3V wartość pokazana na serial monitorze jest poprawna. Układ jest dość prosty: dwie cewki w układzie DD jedna to cewka nadawcza która pracuje u mnie na częstotliwości rezonansowej 4780Hz z wypełnieniem 50% (wypełnienie i PWM chcę ustawiać już po uruchomieniu urządzenia - czyli w trakcie jego działania.) Druga cewka jest cewką odbiorczą - obie pracują w trybie balansu (Pierwsza cewka nadaje ciągle, jednak na drugiej nie ma sygnału lub jest minimalny (kilka mV) jednak gdy zbliżamy element metalowy w cewce odbiorczej wzbudza się sygnał i ma on coraz większą amplitudę zależną od odległości obiektu od cewek. Na późniejszym etapie chciałbym mieć możliwość pomiaru przesunięcia zbocza narastajacego PWM do zbocza narastającego na pinie analogowym (próba zrobienia dyskryminacji) Na oscyloskopie widać iż układ pracuje tak jak powinien jednak wartości są mocno przekłamane... #include <Arduino.h> #define L_Tx PA6 #define Pot PA0 #define L_Rx PA1 #define LED PC13 int freq = 4780; // Domyślna wartość częstotliwości int duty = 50; // Domyślna wartość współczynnika wypełnienia float L_Rx_volt = 0.00; HardwareTimer *MyTim; // Deklaracja obiektu HardwareTimer na poziomie globalnym unsigned long previousMillis = 0; unsigned long interval = 1000; // Interwał w ms do pomiaru napięcia i częstotliwości unsigned long freqPrintInterval = 1000; // Interwał w ms do wypisywania częstotliwości const int numSamples = 500; float L_Rx_volt_samples[numSamples]; int sampleIndex = 0; float L_Rx_volt_sum = 0.00; void setup() { // Konfiguracja pinu L_Tx jako wyjścia PWM pinMode(L_Tx, OUTPUT); pinMode(L_Rx, INPUT); pinMode(Pot, INPUT); pinMode(LED, OUTPUT); analogReadResolution(12); // Konfiguracja pinu L_Tx TIM_TypeDef *Instance = (TIM_TypeDef *)pinmap_peripheral(digitalPinToPinName(L_Tx), PinMap_PWM); uint32_t channel = STM_PIN_CHANNEL(pinmap_function(digitalPinToPinName(L_Tx), PinMap_PWM)); // Inicjalizacja obiektu HardwareTimer MyTim = new HardwareTimer(Instance); // Konfiguracja PWM z domyślną wartością freq i duty MyTim->setPWM(channel, L_Tx, freq, duty); // Inicjalizacja wejścia analogowego L_Rx Serial.begin(9600); } void loop() { unsigned long currentMillis = millis(); int PotValue = analogRead(Pot); //freq = map(PotValue, 0, 4095, 3000, 8000); int L_Rx_Value = analogRead(L_Rx); L_Rx_volt = (float)L_Rx_Value * (3.3 / 4095.0); // Zapis próbek do tablicy i obliczanie ich sumy L_Rx_volt_samples[sampleIndex] = L_Rx_volt; L_Rx_volt_sum += L_Rx_volt; sampleIndex++; // Po zebraniu 500 próbek, oblicz średnią i wypisz na serialport if (sampleIndex >= numSamples) { float averageL_Rx_volt = L_Rx_volt_sum / numSamples; if (averageL_Rx_volt < 0.05) { digitalWrite(LED, LOW); } else { digitalWrite(LED, HIGH); } Serial.print("Średnie napięcie: "); Serial.println(averageL_Rx_volt); // Oblicz częstotliwość sygnału unsigned long currentTime = micros(); unsigned long timeElapsed = currentTime - previousMillis; previousMillis = currentTime; freq = 1000000 / timeElapsed; // Zerowanie próbek i sumy sampleIndex = 0; L_Rx_volt_sum = 0.0; } // Wypisywanie częstotliwości co 5 sekund if (currentMillis % freqPrintInterval == 0) { Serial.print("Ustawiona częstotliwość: "); Serial.print(freq); Serial.println(" Hz"); } } Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Bądź aktywny - zaloguj się lub utwórz konto!
Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony
Utwórz konto w ~20 sekund!
Zarejestruj nowe konto, to proste!
Zarejestruj się »Zaloguj się
Posiadasz własne konto? Użyj go!
Zaloguj się »