13. Qt - Osciloskop

Cvičení zaměřené na komunikaci mezi Qt a externím zařízením v podobě Nuclea po sériové lince. Nucleo se zde chová jako generátor signálu posílaný po sériové lince s konfigurací:

  • 115200 baud
  • 8 bitů
  • bez parity

Verze Qt 6 už má v sobě zabudovanou knihovnu sériové linky, kterou lze přidat přes hlavičkový soubor #include <QtSerialPort/QSerialPort>. Nesmíme zapomenout zahrnout knihovnu serialport do překladu, která se přidá do řádku kompilace QT v projektovém souboru .pro, např. QT += core gui serialport.

Jelikož používáme pro vykreslení grafu QtCharts, je třeba zahrnout ještě knihovnu charts, takže výsledný řádek poté bude vypadat QT += core gui serialport charts

Podklady pro cvičení

Qt Template osciloskopu

Zkompilovaný soubor pro Nucleo s procesorem STM32F401RE

Pro nahrání zkompilovaného elf souboru se řiďte podle návodu na konci.

Příkazy pro nastavení

Příkazy, kterými lze nastavit chod jednoduchého osciloskopu je vždy zakončen novým řádkem \n.

  • start - spouští odesílání dat sinusovky
  • adc - spouští odesílání dat z analogového vstupu
  • stop - zastavuje odesílání dat
  • fvz=x - vzorkovací frekvence v Hz, kde x je frekvence od 1 do 100 Hz (víc nestíhá Qt zpracovat bez redukce dat)
  • fper=x - frekvence periodického signálu v Hz, kde x je frekvence od 1 do 10 Hz
  • tim_rst - resetování času

Formát dat

Přijatá data jsou ve tvaru t.tttt, yyyy;\n, kde

  • t.tttt je čas v sekundách od začátku od spuštění zařízení nebo resetu času,
  • yyyy je poté naměřená hodnota nebo hodnota posílaného signálu

Nahrání kódu do STM32F401

Kód pro procesory STM32 můžete nahrát pomocí programu STM32CubeProgrammer, který lze stáhnout z https://www.st.com/en/development-tools/stm32cubeprog.html

Pro nahrání kódu postupujte následovně:

  1. Připojit vývojový kit a režim programátoru mít na typ ST-Link (J-link formát STM32CubeProgrammer nepodporuje)
  2. Spustit STM32CubeProgrammer
  3. Vpravo nahoře se připojte k vývojovému kitu
  4. Nalevo vybrat možnost Erasing & Programming
  5. Vybrat příslušný .elf soubor
  6. Stisknout Start Programming a vyčkat, než se program nahraje

Možné řešení pro kity Arduino/ESP32

Možné řešení rozhodně není optimální, protože využívá funkci delay - lépe by bylo využít časovač, který by vracel v přesný časový okamžik hodnotu vzorku. Pro demonstrační účely je ale tato varianta dostatečná.

class Generator
{
  int prodleva, status, f;
  double cas;
public:
  Generator(): status(0), cas(0), f(10), prodleva(100) {}
  void tick()
  {
    cas += prodleva/1000.;
    if (status)
    {
      Serial.print(cas);
      Serial.print(", ");
      Serial.print(int(1000*sin(6.28*cas)));
      Serial.println(";");
    }
    delay(prodleva);
  }
  void start() {status = 1;}
  void stop() {status = 0;}
  void reset() {cas = 0;}
  void setFR(int fr) {f = fr;}
  void setSR(int sr) {prodleva = 1000/sr;}
};
 
void setup() {
  Serial.begin(115200);
}
 
Generator g;
 
void loop() {
  if(Serial.available())
  {
    String cmd = Serial.readStringUntil('\n');
    int ind = cmd.indexOf('=');
    if (ind > 0)
    {
      String cmd1 = cmd.substring(0, ind);
      int value = cmd.substring(ind+1).toInt();
 
      if (cmd1 == "fvz")
        g.setSR(value);
      else if (cmd1 == "fper") 
        g.setFR(value);
    }
    if (cmd == "start")
      g.start();
    else if (cmd == "stop") 
      g.stop();
    else if (cmd == "tim_rst")
      g.reset();
  }
  g.tick();  
}

Program je možné otestovat na platformě Wokwi.

courses/b2b99ppc/tutorials/13.txt · Last modified: 2024/05/21 15:39 by viteks