Skocz do zawartości

STM32 BluePill + Częstotliwość PWM + Pomiar sygnału Analogowego + inne problemy [wykrywacz metali]


xpytonx

Pomocna odpowiedź

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

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ę »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.