Inhalt
- So geben Sie dem ADC eine Eingabe
- Abtasten eines Gleichstromsignals
- Abtasten eines Wechselstromsignals mit ADC
- Testen des ADC
- ADC-Beispielcode für dsPic
- ADC-Modul konfigurieren
- 1. Stellen Sie den Port als Eingang und im analogen Modus ein
- 2. Wählen Sie Analogeingänge für die Abtastung
- 3. Wählen Sie die Spannungsreferenz
- 4. Wählen Sie das Ausgabeformat der Daten
- 5. Wählen Sie die Conversion-Triggerquelle aus
- 6. Wählen Sie den Sampling-Modus
- 7. Wählen Sie die Konvertierungsuhr
- 8. Entscheiden Sie, ob eine gleichzeitige Probenahme erforderlich ist oder nicht (optional)
- 9. Wählen Sie die Conversion Clock Source (optional).
- 10. Stellen Sie fest, ob ein Eingabescan erforderlich ist (optional).
- Der ADC-Interrupt in dspic30f und dspic33f
- Interrupt-basierter Code für ADCs in dspic30f und dspic33f
Der Autor schloss sein letztes Ingenieurjahrsprojekt mit den dsPic-Mikrocontrollern ab und erhielt umfassende Einblicke in diese Geräte.
Die dsPic-Geräte bieten ein leistungsstarkes ADC-Modul (Analog-Digital-Wandler), das mit einer Geschwindigkeit von bis zu 1 Msps abtasten kann. Es kann auf verschiedene Arten und Modi verwendet werden, um den Anforderungen Ihres Projekts zu entsprechen.
Dieses Tutorial soll all jenen die Grundlagen der A / D-Konvertierungsmodule vermitteln, die ihre Projekte mit den dsPics beginnen.
So geben Sie dem ADC eine Eingabe
Der erste Schritt besteht darin, die erforderliche Hardware für die Eingabe in den ADC einzurichten.
Abtasten eines Gleichstromsignals
Für den ersten Test können Sie ein Potentiometer verwenden, das an eine 5-V-Versorgung angeschlossen ist, und die ADC-Analogstifte direkt eingeben.
Abtasten eines Wechselstromsignals mit ADC
Um ein Wechselstromsignal (Netzspannungen oder -ströme) abzutasten, müssen Sie:
- Stellen Sie das Signal mit Hilfe von Transformatoren auf den erforderlichen Spannungspegel herunter.
- Pegelverschiebung des Signals, so dass negative Werte unter Null nach oben verschoben werden. Die ADCs in Pics können keine negativen Signale abtasten.
Dieses Referenzschaltungsdesign kann Ihnen bei den Pegelverschiebungsschaltungen helfen:
Testen des ADC
Nach dem Einrichten des erforderlichen Codes und der erforderlichen Hardware muss eine Möglichkeit vorhanden sein, zu testen, ob der ADC tatsächlich auf die erforderliche Weise korrekt abtastet oder nicht. Da Sie nicht in die MCU schauen können, um zu sehen, ob alles richtig läuft, schlage ich zwei Möglichkeiten vor:
- Sie können einen Debugger wie oben abgebildet mit dem Bild verbinden. Im Debug-Modus können Sie den Wert in den Registern ADCBUF0 bis 10 überprüfen, um festzustellen, ob sie mit korrekt abgetasteten Werten geladen werden.
- Sie können die Werte des ADCBUF-Registers gründlich über UART senden und mithilfe eines seriellen Monitors auf einem PC überwachen.
ADC-Beispielcode für dsPic
#include "xc.h" #define FCY 20000000 #define FPWM 3600 #include xc.h> #include stdio.h> #include delay.h> #include libpic30.h> #include dsp.h> #include math.h > _FOSC (CSW_FSCM_OFF & XT_PLL8); // Externer Oszillator, PLLx8 _FWDT (WDT_OFF); // Watchdog-Timer aus _FBORPOR (MCLR_DIS); // Reset deaktivieren int ADCValue; void init_ADC (void) {TRISB = 0xFFFF; // Als Eingangsport setzen ADPCFG = 0x0000; // Auswahl aller analogen Pins in den analogen Modus ADCHSbits.CH0SA = 1; ADCHSbits.CH0NA = 0; //ADCHSbits.CH123SA = 0; //ADCHSbits.CH123NA = 0; IEC0bits.ADIE = 1; // ADC Interrupt IPC2bits aktivieren.ADIP = 1; // setze Interrupt priorty-6 ADCSSLbits.CSSL0 = 0; // Eingangsscan für Analoge-Pin AN0, AN1, AN2 überspringen ADCSSLbits.CSSL1 = 0; ADCSSLbits.CSSL2 = 0; ADCON3bits.SAMC = 0; // Automatische Abtastzeit 6TAD // maximale Abtastzeit ADCON3bits.ADRC = 0; // Auswahl der vom Systemtakt abgeleiteten Konvertierungstaktquelle ADCON3bits.ADCS = 9; // Konvertierungstakt auswählen 6Tcy ADCON1bits.ADSIDL = 0; // Auswahl des Weiterbetriebs im Leerlaufmodus ADCON1bits.FORM = 1; // Datenausgabe im vorzeichenbehafteten Ganzzahlformat auswählen ADCON1bits.SSRC = 0; // Auswahl des Motorsteuerungs-PWM-Intervalls beendet die Abtastung und startet die Konvertierung ADCON1bits.SIMSAM = 0; // Proben CH0, CH1, CH2, CH3 gleichzeitig ADCON1bits.ASAM = 0; // Die Auswahl von Sampling beginnt unmittelbar nach Abschluss der letzten Konvertierung. Das SAMP-Bit wird automatisch gesetzt. ADCON1bits.SAMP = 0; // Mindestens ein A / D-Sample / Hold-Verstärker tastet ADCON2bits ab. VCFG = 0; // Spannungsreferenz Konfigurationsbits ADCON2bits.CSCNA = 0; // Eingangsscan deaktivieren ADCON2bits.CHPS = 0; // Konvertierungskanal auswählen CH0 ADCON2bits.SMPI = 0; // Auswahl von 1 Konvertierungsbeispiel pro Interrupt ADCON2bits.ALTS = 0; // Verwendet die Einstellungen des MUX A-Eingangsmultiplexers ADCON2bits.BUFM = 0; // Puffer konfiguriert als ein 16-Wort-Puffer ADCBUF (15 ... 0) ADCON1bits.ADON = 1; // A / D-Wandler ist eingeschaltet} void readADC () {//ADCON1bits.SAMP = 1; // Sampling starten, automatische Konvertierung folgt // __ delay_ms (100); ADCON1bits.SAMP = 0; // Sampling starten, automatische Konvertierung folgt while (! ADCON1bits.DONE); // warte bis die Konvertierung abgeschlossen ist ADCValue = ADCBUF0; // Konvertierungsergebnis lesen} void main (void) {init_ADC (); int data; während (1) {readADC (); data = ADCValue; }}
ADC-Modul konfigurieren
Das ADC-Modul kann mit Hilfe des oben angegebenen Codes initialisiert und konfiguriert werden. Es folgt eine Schritt-für-Schritt-Anleitung.
Die Schritte 1 bis 7 sind wichtig. Nach 7 können einige oder alle von ihnen übersprungen werden.
1. Stellen Sie den Port als Eingang und im analogen Modus ein
- Port B, an dem die ADC-Eingangspins vorhanden sind, muss als Eingangsport eingestellt werden. (Zeile - 21).
- Sie müssen vom ADPCFG-Register auf den analogen Eingangsmodus eingestellt werden. (Zeile - 22).
2. Wählen Sie Analogeingänge für die Abtastung
Analoge Eingänge müssen zur Abtastung an einen 'ADC-Kanal' angeschlossen werden. Es gibt normalerweise mehr analoge Eingänge als Kanäle. Zum Beispiel hat dsPic30f4011 09 analoge Eingänge, aber nur 04 ADC-Kanäle. Daher müssen Sie jetzt auswählen, welcher Analogeingangspin mit welchem ADC-Kanal verbunden ist. Dies geschieht mit Hilfe des ADCHS-Registers.
- Hier wird AN1 als analoger Pin-Eingang für Kanal 0 ausgewählt (Leitung - 2).
- Die Anzahl der Kanäle bestimmt die Anzahl der gleichzeitig möglichen Abtastungen.
- Der Controller kann abwechselnd zwischen Mux A und Mux B abtasten.
Mögliche Konfigurationen von ADCHS | Resultierende analoge Eingangspin-Konfiguration | Codezeile |
---|---|---|
Kanal 0 -> Mux A. | Jeder Anlouge-Pin von AN0 - AN8 kann ausgewählt werden, um Kanal 0 über Mux A einen Eingang zu geben. | ADCHSbits.CH0SA = 1; oder eine andere Nummer je nach Pin |
Kanal 1, 2 und 3 -> Mux A. | Kanal 1 Eingang ist AN3, Kanal 2 -> AN4, Kanal 3 -> AN5 | ADCHSbits.CH123SA = 1; |
Kanal 0 -> Mux B. | Jeder Anlouge-Pin von AN0 - AN8 kann ausgewählt werden, um Kanal 0 über Mux B einen Eingang zu geben | ADCHSbits.CH0SB = 1; oder eine andere Nummer je nach Pin |
Kanal 1, 2 und 3 -> Mux B. | Kanal 1 Eingang ist AN3, Kanal 2 -> AN4, Kanal 3 -> AN5 | ADCHSbits.CH123SB = 1; |
3. Wählen Sie die Spannungsreferenz
Es muss eine Spannungsreferenz ausgewählt werden, die dem Eingangsbereich der Analogeingänge entspricht. Hierfür gibt es zwei Möglichkeiten:
- Vcc und Gnd können zu oberen und unteren Referenzgrenzen gemacht werden.
- An den AVref-Pin kann eine externe Referenzspannung angelegt werden.
Dies erfolgt mit Hilfe des VCFG-Bits im ADCON2-Register. (Zeile - 47)
VCFG | Vref (höher) | Vref (unten) |
---|---|---|
0 | AVdd | AVss |
1 | Externe Vref + | AVss |
2 | AVdd | Externe Vref - |
3 | Externe Vref + | Externe Vref - |
4. Wählen Sie das Ausgabeformat der Daten
Das Ausgabeformat der über ADC abgetasteten Daten kann auch mit Hilfe des FORM-Bits im ADCON1-Register gemäß der folgenden Tabelle angegeben werden:
BILDEN | Datenausgabeformat |
---|---|
0 | ganze Zahl |
1 | Ganzzahl mit Vorzeichen |
2 | fraktioniert |
3 | fraktioniert signiert |
5. Wählen Sie die Conversion-Triggerquelle aus
Die Analog-Digital-Wandlung innerhalb des ADC-Moduls kann durch eine Anzahl von Triggerquellen ausgelöst werden, die durch die SSRC-Bits im ADCON1-Register gemäß der folgenden Tabelle bestimmt werden:
SSRC | Conversion-Trigger-Quelle |
---|---|
0 | Das manuelle Löschen des SAMP-Bits beendet die Abtastung und startet die Konvertierung. |
1 | Der aktive Übergang am INT0-Pin beendet die Abtastung und startet die Konvertierung. |
2 | Timer 3 vergleicht das Match, beendet die Abtastung und startet die Konvertierung. |
3 | Das Ende des PWM-Zyklus beendet die Abtastung und startet die Konvertierung. |
7 | Automatische Konvertierung durch internen Zähler ausgelöst. |
6. Wählen Sie den Sampling-Modus
Die Abtastung auf ADC-Kanälen kann mit einer der folgenden Methoden eingeleitet werden:
- Manuelles Setzen des SAMP-Bits im Code.
- Automatisch nach dem Ende der letzten Konvertierung.
Dies wird durch das ASAM-Bit im ADCON1-Register entschieden.
ASAM | Modus |
---|---|
0 | Die Abtastung beginnt, wenn das SAMP-Bit gesetzt ist |
1 | Die Probenahme beginnt unmittelbar nach dem Ende der letzten Konvertierung. |
7. Wählen Sie die Konvertierungsuhr
Jede Analog-Digital-Wandlung mit dem A / D-Modul erfordert 12 Taktperioden. Die Periode eines einzelnen Taktzyklus kann mit Hilfe von ADCS-Bits im ADCON3-Register konfiguriert werden. Der in ADCS platzierte Wert ist ein Sechs-Bit-Wert. Dies kann aus den folgenden Formeln berechnet werden:
Der minimale Wert von Tad, der verwendet werden kann, beträgt 154 Nanosekunden.
8. Entscheiden Sie, ob eine gleichzeitige Probenahme erforderlich ist oder nicht (optional)
Die gleichzeitige Abtastung kann durch das SIMSAM-Bit im ADCON1-Register aktiviert werden. Durch gleichzeitiges Abtasten werden die Abtastwerte aller Eingangskanäle genau zum gleichen Zeitpunkt erfasst. Wenn die gleichzeitige Abtastung deaktiviert ist, werden die Kanäle nacheinander abgetastet.
9. Wählen Sie die Conversion Clock Source (optional).
In den meisten Fällen wird die Konvertierungstaktquelle als Systemtakt ausgewählt, indem das ADRC-Bit im ADCON3-Register auf 0 gesetzt wird.
10. Stellen Sie fest, ob ein Eingabescan erforderlich ist (optional).
- Dieser Schritt kann in den meisten Anwendungen übersprungen werden.
- Das Scannen von Eingängen kann über das CSNA-Bit im ADCON2-Register aktiviert werden.
Kanal 0 des ADC-Moduls kann so konfiguriert werden, dass mehrere analoge Eingänge abgetastet werden. Dies kann verwendet werden, wenn es sich um mehrere Eingabequellen handelt und nicht alle gleichzeitig aktiv sind.
Der ADC-Interrupt in dspic30f und dspic33f
Anstatt die Funktion readADC () im Hauptteil zum Lesen der Werte aus dem ADC-Modul zu verwenden, wird ein Interrupt verwendet, um dieselbe Funktion in den meisten fortgeschrittenen Anwendungen auszuführen.
Weitere Informationen zu Interrupts finden Sie in diesem ausführlichen Tutorial: Verwendung von Interrupts in Pic MicroControllern
Interrupt-basierter Code für ADCs in dspic30f und dspic33f
#define FCY 30000000 #include xc.h> #include stdio.h> #include delay.h> #include libpic30.h> #include math.h> #include p30F4011.h> _FOSC (CSW_FSCM_OFF & FRC_PLL16); // Fosc = 16 × 7,5 MHz, d. H. 30 MIPS _FWDT (WDT_OFF); // Watchdog-Timer aus _FBORPOR (MCLR_DIS); void Interrupt_Init (void) {IEC0bits.ADIE = 1; // ADC Interrupt IPC2bits aktivieren.ADIP = 6; // setze Interrupt-Priorität = 6} void __attribute __ ((Interrupt, auto_psv)) _ ADCInterrupt (void) {while (! ADCON1bits.DONE); // warte, bis das Konvertierungsbeispiel abgeschlossen ist.Va = ADCBUF0; sample.Vb = ADCBUF1; IFS0bits.ADIF = 0; } int main (void) {// RD0 zu einem digitalen Ausgang machen _TRISD0 = 0; Interrupt_Init (); ADC_Init (); während (1) {_LATD0 = 1; __delay32 (15000000); _LATD0 = 0; __delay32 (15000000); }}
- Es sollte eine Konvertierungs-Triggerquelle ausgewählt werden, damit der ADC-Interrupt ordnungsgemäß funktioniert, wie in Schritt 5 beschrieben.
- Die Probenahme sollte im automatischen Modus erfolgen. (ASAM-Bit)
- Die Häufigkeit des Auslösens eines ADC-Interrupts kann mit Hilfe von SMPI-Bits im ADCON2-Register gesteuert werden. (Zeile 50).
Dieser Artikel ist genau und nach bestem Wissen des Autors. Der Inhalt dient nur zu Informations- oder Unterhaltungszwecken und ersetzt nicht die persönliche Beratung oder professionelle Beratung in geschäftlichen, finanziellen, rechtlichen oder technischen Angelegenheiten.