Inhaltsverzeichnis:

Tragbarer Funktionsgenerator für WiFi und Android - Gunook
Tragbarer Funktionsgenerator für WiFi und Android - Gunook

Video: Tragbarer Funktionsgenerator für WiFi und Android - Gunook

Video: Tragbarer Funktionsgenerator für WiFi und Android - Gunook
Video: Spektrumanalysator 📈 TinySA Praxis - UKW Empfang, Oberwellen, FM Hub 2024, Juli
Anonim
Tragbarer Funktionsgenerator für WiFi und Android
Tragbarer Funktionsgenerator für WiFi und Android
Tragbarer Funktionsgenerator für WiFi und Android
Tragbarer Funktionsgenerator für WiFi und Android
Tragbarer Funktionsgenerator für WiFi und Android
Tragbarer Funktionsgenerator für WiFi und Android
Tragbarer Funktionsgenerator für WiFi und Android
Tragbarer Funktionsgenerator für WiFi und Android

Gegen Ende des 20. Jahrhunderts tauchten verschiedene technologische Innovationen auf, insbesondere im Bereich der Kommunikation; aber nicht nur. Für uns haben Anwender, Verbraucher und Ingenieure die rasante Entwicklung elektronischer Geräte ans Licht gebracht, die unser Leben viel einfacher machen können: Smartwatches, Smart Homes, Smartphones etc.

Da heutzutage alles "smart" sein kann, habe ich beschlossen, ein äußerst nützliches Gerät zu entwickeln, das Teil einer wesentlichen elektronischen Laborausrüstung ist - tragbarer Funktionsgenerator, steuerbar von Android OS-basiertem Smartphone über WiFi Direct oder WiFi Local Area Network (WLAN)).

Warum sollten wir dieses Gerät bauen?

Ein Großteil der Prüfgeräte ist heutzutage ziemlich teuer. Und manchmal sind diese Geräte nicht tragbar. Als Lösung für hohe Preise, mangelnde Portabilität und fehlenden Netzwerkzugriff des Geräts bietet das Gerät einen Zweikanal-Wellenformgenerator, der tatsächlich tragbar ist und einen uneingeschränkten Zugang zum Netzwerk hat - entweder über das Internet oder ein lokales Netzwerk.

Und natürlich sollte das Gerät aus Begeisterung gebaut werden, nach den DIY-Prinzipien - Manchmal müssen wir Dinge einfach selbst tun, um sich richtig zu fühlen:)

Hauptmerkmale

Energieversorgung

  • USB-Typ-A-Anschluss, sowohl für Stromversorgungssysteme als auch für die Programmierung
  • Vollständiges Li-Ion-Batteriemanagementsystem - Laden und stabile Modi
  • Smart Switch-Implementierung – kein Umschalter erforderlich
  • Duale Stromversorgung: +3,3 V und -3,3 V für die Erzeugung einer symmetrischen Spannungswellenform

Wellenformgenerierung

  • Implementierung des DC-Pegels an der Ausgangskaskade - Biased Waveform zwischen den Spannungsgrenzen
  • DDS-basierte 4-Typ-Wellenformgenerierung - Sinus, Dreieck, Rechteck und DC
  • Bis zu 10 MHz Frequenzunterstützung
  • Ausgangsstrom bis 80mA bei 500mW maximaler Leistungsverfügbarkeit
  • Getrennte Kanäle für die Wellenformerzeugung – geteilte AD9834-basierte Schaltungen

Kommunikation

  • Implementierung von ESP32 - Anwendbare WLAN-Funktionen
  • Vollständige TCP/IP-Unterstützung durch Generatorgerät und Android-Smartphone
  • Möglichkeit, Benutzerparameter für jeden Gerätezyklus zu speichern
  • Zustandsüberwachung - beide Systeme kennen den jeweils anderen Zustand: FuncGen (nennen wir es von nun an so) und Smartphone.

Benutzeroberfläche

  • 20 x 4 Zeichen LCD mit einfacher 4-Bit-Datenschnittstelle
  • Android-Anwendung - vollständige Benutzerkontrolle über das FuncGen-Gerät
  • Summerschaltung - akustische Rückmeldung an den Benutzer

Schritt 1: Blockschaltbild - Hardware

Blockschaltbild - Hardware
Blockschaltbild - Hardware
Blockschaltbild - Hardware
Blockschaltbild - Hardware

Mikrocontroller-Einheit - ATMEGA32L

Mikrocontroller ist ein programmierbarer Chip, der aus allen Computerfunktionen besteht, die sich in einem einzigen elektronischen Chip befinden. In unserem Fall ist es das „Gehirn“und ein zentraler Bestandteil des Systems. Der Zweck der MCU besteht darin, alle Peripheriesysteme zu verwalten, die Kommunikation zwischen diesen Systemen zu handhaben, den Hardwarebetrieb zu steuern und die Benutzerschnittstelle und ihre Interaktion mit einem tatsächlichen Benutzer vollständig zu unterstützen. Dieses Projekt basiert auf einer ATMEGA32L MCU, die mit 3,3 V und einer Frequenz von 8 MHz betrieben werden kann.

Kommunikations-SoC - ESP32

Dieses SoC (System on Chip) bietet vollständige Kommunikationsunterstützung für FuncGen - Zugriff auf WiFi-Funktionen, einschließlich direkter, lokaler oder Internetkommunikation. Zweck des Gerätes sind:

  • Handhabung der Datenübertragung zwischen Android-App und FuncGen-Gerät
  • Verwaltung von Kontroll-/Datennachrichten
  • Unterstützung der kontinuierlichen TCP/IP Client-Server-Konfiguration

In unserem Projekt ist der SoC espressif ESP32, das ist zu beliebt, um es noch weiter auszubauen:)

Li-Ionen-Batteriemanagementsystem

Um unser Gerät in ein tragbares zu verwandeln, enthält das Gerät einen entwickelten Li-Ion-Akkuladekreis. Die Schaltung basiert auf dem MC73831 IC mit steuerbarem Ladestrom durch Einstellen des Wertes eines einzelnen Programmierwiderstands (Wir werden dieses Thema im Schritt Schema behandeln). Der Stromversorgungseingang des Geräts ist ein USB-Typ-A-Anschluss.

Smart-Switch-Schaltung

Die Leistungssteuerschaltung des Smart-Switch-Geräts bietet eine vollständige Softwaresteuerung über die Abschaltsequenz des Geräts und das Fehlen eines externen Kippschalters zum Abschalten der Batteriespannung des Geräts. Alle Stromversorgungsvorgänge werden durch Drücken der Drucktaste und der MCU-Software ausgeführt. In einigen Fällen muss das System heruntergefahren werden: Niedrige Batteriespannung, hohe Eingangsspannung, Kommunikationsfehler usw. Smart Switch basiert auf dem STM6601 Smart Switch IC, der billig und sehr benutzerfreundlich ist.

Hauptnetzteil

Dieses Gerät besteht aus zwei batteriebetriebenen Stromversorgungskreisen - +3,3 V für alle digitalen / analogen Versorgungskreise und -3,3 V für den symmetrischen FunGen-Ausgang relativ zum 0-V-Potential (dh die erzeugte Wellenform kann in [-3,3 V: 3,3 V. eingestellt werden)]-Region.

  • Die Hauptversorgungsschaltung basiert auf dem linearen 1A-Spannungsregler LP3875-3.3 LDO (low dropout).
  • Der Sekundärversorgungskreis basiert auf dem LM2262MX IC, der eine negative DC-DC-Spannungswandlung über Kondensator-Ladungspumpe durchführt - System, auf dem der IC basiert.

Wellenformgeneratorsystem

Das System wurde mit Schwerpunkt auf separaten integrierten DDS-Schaltungen (Direct Digital Synthesis) entwickelt, die eine vollständige Steuerung der Wellenformerzeugung durch die SPI (serielle Peripherieschnittstelle) der MCU ermöglichen. Die beim Design verwendeten Schaltungen sind Analog Devices AD9834, die unterschiedliche Wellenformen liefern können. Die Herausforderungen, denen wir uns bei der Arbeit mit AD9834 stellen müssen, sind:

  • Feste Wellenformamplitude: Die Wellenformamplitude wird vom externen DAC-Modul gesteuert
  • Keine Berücksichtigung des Offset-DC-Pegels: Implementierung von Summierschaltungen mit gewünschten DC-Offset-Werten
  • Separate Ausgänge für Rechteckwelle und Dreieck-/Sinuswelle: Implementierung eines Hochfrequenz-Schaltkreises, sodass jeder einzelne Ausgang des Kanals alle gewünschten Wellenformen bereitstellen kann: Sinus, Dreieck, Rechteck und DC.

Flüssigkristallanzeige

LCD ist ein Teil der UI (Benutzeroberfläche) und soll dem Benutzer ermöglichen, zu verstehen, was das Gerät im Echtzeitmodus tut. Es interagiert mit dem Benutzer in jedem Gerätezustand.

Summer

Einfache Tongeneratorschaltung für zusätzliches Feedback vom Gerät an den Benutzer.

Integrierter ISP-Programmierer

Bei der Programmierung gibt es für jeden Ingenieur ein anhaltendes Problem: Es besteht immer die schlimmste Notwendigkeit, das Produkt zu zerlegen, um es mit einer neuen Firmware neu zu programmieren. Um diese Unannehmlichkeiten zu umgehen, wurde der AVR ISP-Programmierer von innen an das Gerät angeschlossen, während USB-Daten- und Stromleitungen an den USB-Typ-A-Anschluss des Geräts angeschlossen sind. In dieser Konfiguration müssen wir unseren FuncGen nur zum Programmieren oder Laden per USB-Kabel anschließen!

Schritt 2: Blockschaltbild - Vernetzung

Blockschaltbild - Vernetzung
Blockschaltbild - Vernetzung

Zweikanaliger Funktionsgenerator

Hauptgerät. Diejenige, die wir im vorherigen Schritt überprüft haben

ESP-WROOM-32

Integriertes System-on-Chip mit WiFi- und BLE-Funktionen. Der SoC ist über das UART-Modul mit der Hauptplatine verbunden (wir werden dies im Schaltplanschritt behandeln) und fungiert als Nachrichtentransciever zwischen Hauptgerät und Android-Smartphone.

Lokales WLAN-Netzwerk

Smartphone und Gerät kommunizieren über WiFi Direct oder Local Area Network, basierend auf der TCP-Server/Client-Konfiguration. Wenn sich Geräte im WLAN gegenseitig erkennen, erstellt das Hauptgerät einen TCP-Server mit entsprechenden Parametern und kann Nachrichten senden/empfangen. Das Gerät fungiert als Zweitgerät zum Smartphone. Android-Gerät hingegen verbindet sich als Client-Netzwerkgerät mit dem TCP-Server, wird aber als primärer Nachrichtensender angesehen - Smartphone ist derjenige, der den gesamten Kommunikationszyklus initiiert: Nachricht senden - Antwort empfangen.

Android-Smartphone

Android OS-basiertes Smartphone-Gerät, das auf der FuncGen-Anwendung ausgeführt wird

Schritt 3: Teile, Werkzeuge, IDE und Stückliste

Teile, Werkzeuge, IDE und Stückliste
Teile, Werkzeuge, IDE und Stückliste
Teile, Werkzeuge, IDE und Stückliste
Teile, Werkzeuge, IDE und Stückliste
Teile, Werkzeuge, IDE und Stückliste
Teile, Werkzeuge, IDE und Stückliste

Stückliste (Siehe angehängte XLS-Tabelle)

UI- und Systemverbindungen

  • 1 x 2004A Char-LCD 20x4 Blau
  • 1 x USB-Typ-B-Anschluss
  • 1 x 10 Set Mini Micro JST XH 2.54mm 4 Pin
  • 1 x 6pcs Momentary SW

PCB-Bestellung (laut Seeed Studio)

Basismaterial FR-4

Anzahl der Schichten 2 Schichten

PCB-Menge 10

Anzahl verschiedener Designs 1

Leiterplattendicke 1,6 mm

PCB-Farbe Blau

Oberflächenbeschaffenheit HASL

Mindestlötmaskendamm 0,4 mm↑

Kupfer Gewicht 1oz

Mindestbohrlochgröße 0,3 mm

Leiterbahnbreite/Abstand 6/6 mil

Plattierte Halblöcher / Kastellierte Löcher Nr

Impedanzkontrolle Nr.

Werkzeuge

  • Heißklebepistole
  • Pinzette
  • Cutter
  • ~22AWG-Draht für die Fehlerbehandlungszwecke
  • Lötkolben/-station
  • Lötzinn
  • SMD-Rework-Station (optional)
  • 3D-Drucker (optional)
  • Extrudieren von Datei
  • AVR ISP-Programmierer
  • USB-zu-Seriell-Konverter (optional, für Debugging-Zwecke)

Integrierte Entwicklungsumgebung (IDE) und Software

  • Autodesk EAGLE oder Cadence Schematic Editor / Allegro PCB Editor
  • OpenSCAD (optional)
  • Ultimaker Cura (optional)
  • Saleae-Logik (Zur Fehlerbehebung)
  • Atmel Studio 6.3 oder höher
  • Android Studio oder Eclipse-IDE
  • Docklight Serial Monitor / Andere COM-Port-Überwachungssoftware
  • ProgISP für AVR ATMEGA32L Flash-Programmierung

Schritt 4: Hardware-Design - Hauptplatine

Hardware-Design - Hauptplatine
Hardware-Design - Hauptplatine
Hardware-Design - Hauptplatine
Hardware-Design - Hauptplatine
Hardware-Design - Hauptplatine
Hardware-Design - Hauptplatine

Batteriemanagement-Schaltung

Die Batterieladeschaltung basiert auf dem MCP7383 IC, mit dem wir den gewünschten Ladestrom für den Li-Ion-Akku auswählen können - 3,7 V mit einer Kapazität von 850 mAh. Der Ladestrom wird in unserem Fall durch die Programmierung des Widerstandswerts (R1) eingestellt

R1 = 3KOhm, I(Ladung) = 400mA

Die USB-Spannung VBUS wird durch den π-Filter (C1, L3, C3) gefiltert und dient als Stromquelle für die Ladeschaltung.

Die Spannungsteilerschaltung (R2, R3) ermöglicht es der MCU, anzuzeigen, ob eine externe USB-Stromversorgung angeschlossen ist oder nicht, indem sie dem A/D-Kanal der MCU die folgende Spannung liefert:

V(Anzeige) ~ (2/3)V(BUS)

Da unser A/D von ATMEGA32L 12-Bit ist, können wir die digitale Reichweite berechnen:

A/D(Bereich) = 4095V(Anzeige) / V(REF).

A/D ∈ [14AH: FFFH]

Smart-Switch-Netzteil

Die Schaltung ermöglicht es dem System, die Stromversorgung jedes entworfenen Blocks sowohl über den Druckknopf als auch über die Software auf der MCU zu steuern und basiert auf dem STM6601 Smart-Switch mit POWER-Option anstelle von RESET. Die Terminals, die wir in Betracht ziehen möchten, sind diese:

  • PSHOLD - Eingangsleitung, die den Gerätestatus definiert: Wenn auf LOW gezogen, deaktiviert das Gerät alle sekundären Netzteile (+3.3V und -3.3V). Wenn HIGH gehalten - Gerät behält den EIN-Zustand bei.
  • nSR und nPB - Eingangsleitungen. Druckknopfklemmen. Wenn an diesen Pins eine fallende Flanke erkannt wird, versucht das Gerät, in den Ein-/Ausschaltmodus zu wechseln
  • nINT - Ausgangsleitung. Wird jedes Mal auf LOW gezogen, wenn der Druckknopf gedrückt wird
  • DE - Ausgangsleitung, wird als Leistungsfreigabe für die sekundären Netzteile verwendet. Während LOW gehalten wird, sind beide sekundären Netzteile deaktiviert

Bevor wir mit dem endgültigen Design fortfahren, gibt es einige wichtige Hinweise:

  • PSHOLD sollte auf 3,3 V hochgezogen werden, da es Fälle gibt, in denen MCUs alle I/Os in den Zustand HIGH-Z zwingen. In diesem Fall ist der Status von PSHOLD von der MCU unbekannt und kann den Geräteprogrammierungsprozess dramatisch beeinflussen.
  • STM6601 sollte mit einer EN-Einstelloption bei langem Drücken anstelle der RESET-Option bestellt werden (ich bin in diese gefallen).

Netzteil: +3.3V

Hauptstromversorgung für alle Systeme in unserem Projekt. Wenn die +3,3-V-Leitung auf GND-Pegel gehalten wird (d. h. keine Spannung vorhanden ist), werden alle ICs außer dem Smart Switch deaktiviert. Die Schaltung basiert auf dem LDO LP-3875-3.3 IC, kann über die EN-Klemme gesteuert werden und liefert Strom bis zu 1A.

Die Stromquelle für diese Schaltung ist die Batteriespannung mit angeschlossener A/D-Anzeige zum Erfassen von VBAT in Konfiguration, ähnlich der VBUS-Erfassungsschaltung. In diesem Fall weichen die Berechnungen geringfügig ab;

V (Batterie-zu-A/D) = 0,59 V (Batterie); A/D(Bereich) ∈ [000H: C03H]

Netzteil: -3.3V

Eine negative Spannungsversorgungsschaltung ermöglicht es uns, symmetrische Wellenformen mit einem DC-Faktor von 0 V zu erzeugen (d. h. der Wellenformmittelwert kann 0 V betragen). Diese Schaltung basiert auf dem LM2662MX IC - DC/DC-Wandler, der nach einem "Ladungspumpen"-Verfahren arbeitet. Der maximale Ausgangsstrom der Schaltung beträgt 200 mA, was für unsere Designanforderungen ausreichend ist - wir sind auf 80 mA Ausgangsstrom von jedem Gerätekanal beschränkt.

Der IC führt alle erforderlichen Arbeiten aus, daher müssen nur zwei Elektrolytkondensatoren angebracht werden: C33 zum Schalten und C34 für die -3,3-V-Leitungsüberbrückung (Überlegungen zur Rauschunterdrückung). Die Schaltfrequenz ist im Design vernachlässigbar, wenn wir die Schaltung weit genug von den Wellenformerzeugungsteilen platzieren (wir werden dies beim PCB-Layout-Schritt besprechen).

Mikrocontroller-Einheit - MCU

Dies ist der Manager und CEO unseres Systems - Steuerung, Netzwerkhandhabung, Nachrichtenübertragung und UI-Unterstützung - alles wird von MCU durchgeführt.

Als MCU wurde Atmel ATMEGA32L gewählt, wobei L für Supported Voltage Operation ∈ [2.7V: 5.5V] steht. In unserem Fall beträgt die Betriebsspannung +3,3V.

Betrachten wir die wichtigsten Operationsblöcke, die zum Verständnis der Arbeit mit MCU in unserem Design erforderlich sind:

  • Externer Oszillator - Ist eine optionale Komponente, da wir an einer Betriebsfrequenz von 8 MHz interessiert sind
  • Peripheriesteuerung, SPI-Netzwerk – Alle Peripheriegeräte (außer ESP32) kommunizieren über SPI mit der MCU. Es gibt drei gemeinsame Leitungen für alle Geräte (SCK, MOSI, MISO) und jede Peripherieschaltung hat ihre eigene CS (Chip Select) Leitung. Die SPI-Geräte, die Teil von device sind:

    1. D/A für Amplitudensteuerung - Kanal A
    2. D/A für Amplitudensteuerung - Kanal B
    3. AD9834-Gerät - Kanal A
    4. AD9834-Gerät - Kanal B
    5. D/A für Vorspannungssteuerung - Kanal A
    6. D/A für Vorspannungssteuerung - Kanal B
    7. Digitales Potentiometer für LCD-Helligkeits-/Kontrasteinstellungen
  • LCD-Unterstützung - Da es sich bei LCD um ein generisches 20 x 4-Zeichen-Display handelt, verwenden wir eine 4-Bit-Schnittstelle (Leitungen D7: D4), Steuerpins (Leitungen RS, E) und Helligkeits-/Kontraststeuerung (Leitungen V0 und Anode)
  • RGB-LED-Unterstützung - Dieses Modul ist optional, aber es gibt einen gemeinsamen Kathoden-RGB-LED-Anschluss mit entsprechenden Widerständen, der an die MCU angeschlossen ist.
  • Power Control - MCU führt die Überwachung des Stromsystems im Echtzeitmodus durch und verarbeitet alle erforderlichen Stromereignisse:

    1. VBAT_ADC - Überwachung der Batteriespannung und Bestimmung ihres Zustands (ADC0-Kanal)
    2. PWR_IND - Anzeige des externen Stromversorgungsanschlusses (ADC1-Kanal)
    3. PS_HOLD – Primäre Stromfreigabeleitung für alle definierten Systeme. Wenn von der MCU nach unten gezogen wird, wird das Gerät ausgeschaltet
    4. Klemme des Smart Switch unterbrechen - Zustandsüberwachung der Taster
  • WiFi-Netzwerkmanagement - ESP32: MCU kommuniziert mit ESP32 über die UART-Schnittstelle. Da wir mit 8MHz eine Baudrate von 115200 mit einem relativ kleinen Fehler implementieren können, können wir ESP32 in der Schaltung ohne Vordefinitionen von Baudratenänderungen verwenden.

AVR ISP-Programmierer

Unsere MCU ist über SPI programmiert, wobei die Reset-Leitung (/RST) für einen ordnungsgemäßen Betrieb auf HIGH gezogen werden muss (wenn nicht - MCU befindet sich für immer in einem Reset-Zustand).

Damit das Gerät über USB sowohl programmiert als auch aufgeladen werden kann, habe ich einen AVR ISP-Programmierer (kleines Produkt, gekauft bei eBay) angeschlossen. Um die vollständige USB-Unterstützung des Geräts aufrechtzuerhalten, müssen die USB-Typ-A-Anschlüsse (D+, D-, VBUS und GND) mit dem AVR-ISP-Gerät verbunden werden.

Schaltung zur Erzeugung von Wellenformen

Der Kern des Geräts sind diese Schaltkreise. AD9834 ist ein DDS-Gerät mit geringem Stromverbrauch, das uns alle Wellenformen liefert, die wir vom System abrufen möchten. Die Schaltungen enthalten zwei unabhängige AD9834-ICs mit getrennten externen 50-MHz-Oszillatoren (wie in den Schaltplänen zu sehen). Der Grund für den getrennten Oszillator sind Überlegungen zur Rauschunterdrückung digitaler Schaltungen, daher wurde die Entscheidung getroffen, geeignete 50-MHz-Leitungen mit Oszillatoren zu handhaben, die neben dem AD9834 platziert sind.

Schauen wir uns nun etwas Mathematik an:

Da das DDS-Gerät mit der Phase Wheel-Technologie arbeitet, wobei der Ausgabewert in einem 28-Bit-Register gespeichert wird, können wir die Wellenformerzeugung mathematisch beschreiben:

dP(Phase) = ωdt; = P' = 2πf; f(AD9834) = ΔP * f(clk) / 2^28; ΔP ∈ [0: 2^28 - 1]

Und laut AD9834-Datenblatt kann unter Berücksichtigung der maximalen Frequenz eine Auflösung der Ausgangsfrequenz erreicht werden:

Δf = k * f(Oszillator) / f(Maximum) = 0,28 * 50M / 28M = 0,187[Hz]

AD9834-ICs bieten einen analogen Stromausgang für Dreieck-/Sinuswelle (IOUT-Anschluss) und einen digitalen Ausgang für Rechteckwelle (SIGN_OUT-Anschluss). Die Verwendung des Vorzeichenbits ist etwas knifflig, aber wir können damit umgehen - Jedes Mal, wenn DDS die Vergleichswertschwelle überschreitet, verhält sich SIGN_OUT entsprechend. An jedem Ausgang jedes Kanals ist ein 200Ohm Widerstand angebracht, so dass die Ausgangsspannung sinnvolle Werte hätte:

I (Einzelkanal) = V (Ausgang) / R (Spannungsauswahl); V(Ausgang) = R(VS)*I(SS) = 200I(SS) [A]

Amplitudensteuerungs-(D/A)-Schaltungen

Laut Datenblatt von AD9834 kann seine Amplitude angepasst werden, indem dem DDS-Vollskala-System Strom zugeführt wird. Noch einmal etwas Mathematik:

I(volle Skala) = 18 * (V_REF - V_DAC) / R_SET [A]

Nach Schaltplänen und einigen Zahlen zur Gleichung:

I(volle Skala) = 3,86 - 1,17 * V_DAC [A]

Das im Design verwendete D/A-Modul ist 12-Bit-MCP4922, wenn der Strom im Bereich von [0mA: 3,86mA] liegt und die lineare Amplitudenfunktion ist:

V(Amplitudenauswahl) = 1 - [V(D/A) / (2^12 - 1)]

Wellenform-Multiplexing-Schaltung

Rechteckwellen- und Sinus-/Dreieckwellen-Erzeugungsausgänge werden bei AD9834 getrennt, daher müssen wir eine Hochgeschwindigkeits-Multiplexschaltung für beide Ausgänge verwenden, um das Abrufen aller gewünschten Wellenformen von einem einzelnen getrennten Kanal zu ermöglichen. Der Multiplexer-IC ist ein analoger Schalter ADG836L mit einem sehr niedrigen Einschaltwiderstand (~0,5 Ohm).

Die Auswahltabelle, die die MCU für die Ausgänge verwendet, wie sie ist:

Modusauswahl [D2:D1] | Ausgangskanal A | Ausgangskanal B

00 | Sinus/Dreieck | Sinus/Dreieck 01 | Sinus/Dreieck | Quadrat 10 | Quadrat | Sinus/Dreieck 11 | Quadrat | Quadrat

Vorspannungssteuerung (D/A) Schaltungen

Eine der Hauptfunktionen des Wellenformgenerators ist die Steuerung seines DC-Werts. In diesem Design wird dies durch Einstellen der gewünschten D/A-Spannung für jeden Kanal erreicht, und diese Vorspannungen werden mit gemultiplexten Ausgängen summiert, die wir etwas früher besprochen haben.

Die von D/A abgerufene Spannung liegt im Bereich [0V: +3,3V], daher gibt es eine Schaltung auf Op-Amp-Basis, die den D/A-Bereich auf [-3,3V: +3,3V] abbildet, sodass das Gerät den vollen Bereich bereitstellen kann des gewünschten Gleichstromanteils. Wir überspringen die lästige analytische Mathematik und konzentrieren uns nur auf die Endergebnisse:

V_OUT(Kanal B) = V_BIAS_B(+) – V_BIAS_B(-); V_OUT(Kanal A) = V_BIAS_A(+) - V_BIAS_A(-)

Nun liegt der DC-Komponentenbereich im Bereich [-3.3V: +3.3V].

Summierschaltungen - DC-Komponenten und Signalausgänge

An dieser Stelle haben wir alles, was wir für den richtigen Geräteausgang benötigen - Vorspannung (DC-Komponente) im gesamten Spannungsbereich und gemultiplexte AD9834-Ausgänge. Wir machen das möglich, indem wir den Summierverstärker verwenden - Op-Amp-Konfiguration

Lassen Sie uns die Mathematik noch einmal überspringen (wir haben bereits viele mathematische Ansätze behandelt) und das Endergebnis der Ausgabe des Summierverstärkers aufschreiben:

V(Geräteausgang) = V(positiver Bias) - V(negativer Bias) - V(Multiplex-Ausgang) [V]

Somit:

V_OUT = ΔV_BIAS - V_AD9834 [V]

Ausgangsanschlüsse vom Typ BNC sind mit Auswahlwiderständen (R54, R55; R56, R57) verbunden. Der Grund dafür ist, dass wir in dem Fall, dass das Design möglicherweise dysfunktional ist, immer noch auswählen können, ob wir einen Summierverstärker verwenden möchten.

Wichtiger Hinweis: Die Widerstandsnetzwerke der Endsummenverstärker können von einem Designer angepasst werden, um die maximale Amplitude zu ändern, die vom Gerät abgerufen werden kann. In meinem Fall haben alle Verstärker die gleiche Verstärkung = 1, daher beträgt die maximale gepufferte Amplitude 0,7 Vpp für Dreieck-/Sinuswelle und 3,3 Vpp für Rechteckwelle. Der spezifische mathematische Ansatz ist in den angehängten Bildern von step zu finden.

ESP32 als externes Modul

MCU kommuniziert mit ESP32 über die UART-Schnittstelle. Da ich eine eigene Platine für den ESP32 wollte, stehen 4 Klemmen zum Anschließen zur Verfügung: VCC, RX, TX, GND. J7 ist ein Schnittstellenanschluss zwischen PCBs, und ESP32 wird als externes Modul im Gerät zugewiesen.

Benutzeroberfläche - LCD und Lautsprecher

Das verwendete LCD ist ein generisches 20 x 4-Zeichen-Display mit einer 4-Bit-Schnittstelle. Wie aus dem Design ersichtlich ist, ist an den LCD-Anschlüssen "A" und "V0" ein digitales SPI-Potentiometer angebracht - dessen Zweck ist die Einstellung Helligkeit und Kontrast des LCD-Moduls programmgesteuert.

Der Lautsprecher bietet dem Benutzer eine Tonausgabe durch einfache Rechteckwellenerzeugung von der MCU. Der BJT T1 steuert den Strom durch den Lautsprecher, der nur in zwei Zuständen sein kann - EIN / AUS.

Schritt 5: Hardware-Design - ESP32-Modul

Hardware-Design - ESP32-Modul
Hardware-Design - ESP32-Modul

ESP32 wird als externes Modul für die Hauptplatine verwendet. Die Gerätekommunikation basiert auf AT-Befehlen, die auf der Firmware eines generischen Gerätes verfügbar sind.

An diesem Design gibt es nicht viel zu erweitern, aber es gibt einige Hinweise zum Design:

  • Für die Fehlerbehandlung bei der Verwendung des richtigen UART-Moduls von ESP32 habe ich drei Auswahlwiderstände für die TX- und RX-Leitungen angebracht. (0Ohm für jeden). Für die Standardkonfiguration wird das UART2-Modul für AT-Befehle verwendet (R4, R7 müssen gelötet werden)
  • Das Gerät hat einen 4-Linien-Ausgang - VCC, GND, TX, RX.
  • IO0- und EN-Pins bewerten den Gerätebetrieb und sollten so ausgelegt sein, wie es in den Schaltplänen vorgesehen ist

Alle PCB-Funktionen, die wir im folgenden Schritt behandeln.

Schritt 6: PCB-Layout

PCB-Layout
PCB-Layout
PCB-Layout
PCB-Layout
PCB-Layout
PCB-Layout

Die Ziele beim Design einer Leiterplatte

  1. Erstellen Sie ein eingebettetes System für alle integrierten Schaltkreise auf derselben Platine
  2. Verbessern Sie die Geräteleistung durch das Entwerfen einer einzigen Hauptplatine
  3. Kostenreduktion - wenn Sie die Preise nachschlagen möchten, sind Low-Cost-Designs WIRKLICH günstig
  4. Minimieren Sie die Größe der elektronischen Platine
  5. Einfache Fehlerbehebung - Wir können TPs (Testpunkte) für jede mögliche fehlerhafte Leitung verwenden.

Technische Parameter

Beide PCBs: Hauptplatine und ESP32-Platine haben die gleichen Eigenschaften für den Herstellungsprozess - kostengünstig und für unsere Zwecke betriebsbereit. Sehen wir sie uns an:

A - Hauptplatine

  • Größe: 10cm x 5,8cm
  • Anzahl der Schichten: 2
  • Leiterplattendicke: 1,6 mm
  • Minimaler Spurabstand/-breite: 6/6mil
  • Minimaler Durchgangslochdurchmesser: 0,3 mm
  • Kupfer bis zum Rand der Leiterplatte Mindestabstand: 20mil
  • Oberflächenveredelung: HASL (Ziemlich gut aussehender silberner billiger Typ)

B - Hauptplatine

  • Größe: 3cm x 4cm
  • Anzahl der Schichten: 2
  • Leiterplattendicke: 1,6 mm
  • Minimaler Spurabstand/-breite: 6/6mil
  • Minimaler Durchgangslochdurchmesser: 0,3 mm
  • Kupfer bis zum Rand der Leiterplatte Mindestabstand: 20mil
  • Oberflächenveredelung: HASL

Schritt 7: 3D-Gehäuse

3D-Gehäuse
3D-Gehäuse

Ich habe es nicht selbst entworfen, weil ich zu der Zeit dieses Gerät überreden wollte, zu funktionieren, also waren mir alle 3D-Druck-Grundlagen überhaupt nicht bewusst. Daher habe ich ein SCAD-Projekt von Thingiverse verwendet und gemäß den Spezifikationen meines Geräts verschiedene Blenden an den Begrenzungen angebracht.

  1. Druckgerät: Creality Ender-3
  2. Betttyp: Glas, 5 mm Dicke
  3. Filamentdurchmesser: 1,75 mm
  4. Filamenttyp: PLA+
  5. Düsendurchmesser: 0,4 mm
  6. Anfangsgeschwindigkeit: 20 mm/Sek.
  7. Durchschnittsgeschwindigkeit: 65 mm/Sek.
  8. Unterstützung: N/A
  9. Füllung: 25%
  10. Temperatur:

    • Bett: 60 (oC)
    • Düse: 215 (oC)
  11. Filamentfarbe: Schwarz
  12. Gesamtanzahl der Blenden: 5
  13. Anzahl der Gehäuseplatten: 4

    • TOP Schale
    • Unterschale
    • Frontblende
    • Rückseite

Schritt 8: Softwareimplementierung - MCU

Softwareimplementierung - MCU
Softwareimplementierung - MCU
Softwareimplementierung - MCU
Softwareimplementierung - MCU
Softwareimplementierung - MCU
Softwareimplementierung - MCU

GitHub-Link zu Android und Atmega32-Code

Software-Algorithmus

Alle Operationen, die von der MCU ausgeführt werden, werden in den beigefügten Flussdiagrammen beschrieben. Darüber hinaus gibt es einen angehängten Code für das Projekt. Lassen Sie uns die Softwarespezifikationen behandeln:

Einschalten

In dieser Phase führt die MCU alle Initialisierungssequenzen zusammen mit der Bestimmung des gespeicherten Kommunikationstyps mit dem Android-Gerät durch: Direkte WLAN- oder WLAN-Netzwerkkommunikation - diese Daten werden im EEPROM gespeichert. Der Benutzer kann in dieser Phase den Kopplungstyp für Android-Geräte neu definieren.

Direkte Kopplung mit Android-Geräten

Diese Art der Kopplung basiert auf der WLAN-Netzwerkerstellung durch das FuncGen-Gerät. Es erstellt einen AP (Access Point) und einen TCP-Server auf einer lokalen Geräte-IP mit einer bestimmten SSID (WiFi-Netzwerkname) und einer bestimmten Portnummer. Gerät sollte den Zustand halten - offen für Verbindungen.

Wenn das Android-Gerät mit FuncGen verbunden ist, wechselt die MCU in den AKTIV-Modus und reagiert gemäß den Benutzeranweisungen des Android-Geräts.

WLAN-Kopplung

Um in einem lokalen WiFi-Netzwerk zu kommunizieren, sollte die MCU Befehle für den ESP32 bereitstellen, um einen AP zu erstellen, mit einem Android-Gerät zu kommunizieren und die entscheidenden Netzwerkdaten auszutauschen:

  • Android-Gerät erhält von FuncGen seine MAC-Adresse, speichert sie im Speicher.
  • Das FuncGen-Gerät empfängt vom Android-Gerät ausgewählte WLAN-Parameter: SSID, Sicherheitstyp und Passwort und speichert es im EEPROM.

Wenn Geräte tatsächlich mit demselben WLAN verbunden sind, sucht das Android-Gerät nach dem FuncGen, indem es alle MAC-Adressen der mit dem WLAN verbundenen Geräte scannt. Wenn das Android-Gerät eine MAC-Übereinstimmung feststellt, versucht es zu kommunizieren.

Verbindung und Zustandsbehandlung - MCU

Wenn Geräte miteinander kommunizieren, bleibt das Protokoll (siehe vorletzter Schritt) gleich und das Flussdiagramm ist gleich.

Überwachung des Gerätezustands

Der zeitgesteuerte Interrupt stellt der MCU die notwendigen Details für die Zustandsbehandlung bereit. Bei jedem Zyklus des Timer-Interrupts wird die folgende Parameterliste aktualisiert:

  • Externes Netzteil - Ein/Aus
  • Batteriespannungszustand
  • UI-Update für jede Anpassung
  • Druckknopf: Gedrückt/Nicht gedrückt

Schritt 9: Softwareimplementierung - Android-App

Softwareimplementierung - Android-App
Softwareimplementierung - Android-App
Softwareimplementierung - Android-App
Softwareimplementierung - Android-App
Softwareimplementierung - Android-App
Softwareimplementierung - Android-App
Softwareimplementierung - Android-App
Softwareimplementierung - Android-App

Die Android-App ist im Java-Android-Stil geschrieben. Ich werde versuchen, es auf die gleiche Weise wie in den vorherigen Schritten zu erklären - indem ich den Algorithmus in separate Codeblöcke aufteile.

Einschaltsequenz

Erste Sequenz des Geräts. Hier wird das App-Logo zusammen mit der Aktivierung von GPS- und WLAN-Modulen des Android-Geräts angezeigt (keine Sorge, das GPS wird nur für den Scan von WLAN-richtigen Netzwerken benötigt).

Hauptmenü

Nach dem Booten der App erscheinen vier Schaltflächen auf dem Bildschirm. Tastenaktion:

  1. DIREKTE VERBINDUNG: Initialisieren der Verbindung zum AP von FuncGen durch die SSID von IOT_FUNCGEN. Wenn die Verbindung erfolgreich ist, wechselt das Gerät in den Haupt-UI-Modus.
  2. WIFI-VERBINDUNG: Das Gerät prüft, ob im Speicher gespeicherte Datenparameter vorhanden sind: wifi.txt, mac.txt. Wenn keine Daten gespeichert sind, lehnt das Gerät die Benutzeranfrage ab und gibt eine Popup-Meldung aus, dass zuerst die WLAN-Kopplung durchgeführt werden muss.
  3. PAIRING: Kommunikation mit FuncGen wie bei DIRECT CONNECTION, aber statt ständigem Nachrichtenaustausch gibt es einen einzigen Handshake. Das Android-Gerät prüft, ob es bereits mit dem WLAN-Netzwerk verbunden ist, und fordert den Benutzer auf, das Passwort einzugeben. Wenn die erneute Verbindung erfolgreich ist, speichert das Android-Gerät SSID und Passkey in der Datei wifi.txt. Nach erfolgreicher Kommunikation mit FuncGen speichert es die empfangene MAC-Adresse in der Datei mac.txt.
  4. Exit: Genug gesagt:)

WLAN-Scan-Manager

Ich wollte, dass die Anwendung voll funktionsfähig ist und keine Anpassungen außerhalb der App vorgenommen werden müssen. Also habe ich einen WiFi-Scanner entwickelt, der alle erforderlichen Operationen durchführt, um eine Verbindung zum WiFi-Netzwerk mit einem bekannten Passkey und einer bekannten SSID herzustellen.

Datenübertragung und TCP-Kommunikation

Dies ist der Hauptcodeblock in der App. Für alle UI-Einheiten gibt es eine definierte Nachricht in einem bestimmten Format (Pre-final step), die FuncGen dazu zwingt, die gewünschte Ausgabe für die Kanäle bereitzustellen. Es gibt drei Arten von UI-Feldern in der Aktivität:

  1. Suchleisten: Hier definieren wir den realen Bereich der FuncGen-Ausgabeparameter

    1. Amplitude
    2. DC-Offset
    3. LCD-Helligkeit
    4. LCD-Kontrast
  2. Textbearbeitung: Um ganzzahlige Werte klar definiert und präzise zu halten, erfolgt die Frequenzeingabe nur über Zahlentextfelder
  3. Schaltflächen: Auswahl von Parametern aus den verfügbaren Listen:

    1. Wellenformtyp

      1. Sinus
      2. Dreieck
      3. DC
      4. Quadrat
      5. AUS
    2. Informationen bekommen

      1. Batteriestatus (Prozent)
      2. AC-Status (externe Stromversorgung)
    3. Boot-Option (für FuncGen-MCU)

      1. Werkseinstellungen
      2. Neu starten
      3. Abschalten
      4. Direkt - Neustart mit direktem Pairing-Modus
      5. WLAN - Neustart mit WLAN-Pairing-Modus
    4. Zurück zum Hauptmenü: Genug gesagt:)

Schritt 10: Testen

Empfohlen: