Forum: Analoge Elektronik und Schaltungstechnik Phasenerkennung 50kHz Sinus Signal


von Claas H. (black_jacky)


Angehängte Dateien:

Lesenswert?

Hi Leute,
ich stehe aktuell vor der Aufgabe, messtechnisch die Impedanz zu 
ermitteln bei 50kHz und einem Sinusförmigen Strom von 0,8 mA. Dabei 
hänge ich an der Ermittlung des Phasenwinkels.

Folgendes habe ich bereits konzipiert, simuliert und aufgebaut:
„Wien-Robinson Oszillator“ zur Erzeugung einer 50kHz Sinusschwingung
Das Ausgangssignal wird über ein Potentiometer an eine 
spannungsgesteuert Stromquelle gegeben, in diesem Fall eine „Howland 
current pump“.
Somit kann ich mit Hilfe des Potis den Ausgangsstrom variabel einstellen 
die Schaltung so kalibrieren, dass ich einen Ausgangsstrom mit einer 
Amplitude von 0,8 mA bekomme.

Die über die Impedanz abfallende Spannung wird über zwei Messleitungen 
abgegriffen, Hochpass gefiltert, verstärkt und anschließen 
gleichgerichtet.
Somit kann erhalt ich ein Spannung die proportional zu meiner 
Spannungsamplitude von meinem Messsignal ist und damit proportional zum 
Realteil der Impedanz.

Für die Bestimmung des Phasenwinkels, greife ich einmal das 
Ausganssignal des Sinusgenerators ab, gebe das Signal auf einen 
Impedanzwandler und anschließen auf einen Hochpass mit nachgeschaltetem 
Schmitt-Trigger um die Nulldurchgänge zu bestimmen.

Ähnlich verfahre ich bei dem Messsignal, das ich nach dem Verstärker 
abgreife, auch noch einmal Hochpass filtere und ebenfalls zur Bestimmung 
des Nulldurchgangs auf einen Schmitt-Trigger gebe.
Von den Ausgangssignalen der Schmitt-Trigger nehme ich die positive 
Halbwelle und gebe diese auf ein XOR Gatter, wodurch ich ein High-Signal 
bekomme, das der Zeit der Phasenverschiebung entspricht und somit eine 
PWM-Signal, dessen Tastverhältnis proportional zur Phasenverschiebung 
ist. Der Einfachheit halber glätte ich das PWM-Signal um einen DC 
Spannung zu bekomme die proportional zur Phasenverschiebung ist.

Beide Spannungen werden über einen ADC an einen Mikrocontroller zur 
Verarbeitung weiter gegeben. Später soll die Bestimmung des PWM-Signals 
noch über einen externen Zähler realisiert werden.

Nun zu meinem Problem: Sobald ich die Impedanz (Im aktuellen Testfall 
rein ohmsch) verändere, wird logischer Weise des Messsignal in seiner 
Amplitude kleiner und die feste Hysterese des Schmitt-Triggers sorgt für 
eine Spätere Erkennung des Messsignals. Somit ist das Ausgangssignal des 
XOR-Gatters kürzer auf High und somit verringert sich das 
Tastverhältnis, obwohl keine Änderung des Phasenwinkels vorliegt.

Eine Überlegung ist nun einen spannungsgesteuerte Hysterese zu 
realisieren, die abhängig von der Amplitude des Signals, die Hysterese 
verändert.

Bevor ich mich hier aber in irgendetwas verrenne und total auf dem 
Schlauch stehe wollte ich euch Fragen ob ihr noch andere Ideen habt.

Viele Dank für eure Hilfe und Viele Grüße

von Thomas W. (Gast)


Lesenswert?

Claas H. schrieb:
> Bevor ich mich hier aber in irgendetwas verrenne und total auf dem
> Schlauch stehe wollte ich euch Fragen ob ihr noch andere Ideen habt.

Den Phasenwinkel kannst du rauschärmer messen, indem du den Mittelwert 
über eine längere Zeit bestimmst. Zwei Synchrongleichrichter, die mit 
dem Originalsignal bzw. mit dem 90° phasenverschobenen Signal arbeiten 
und das gleichgerichtete Signal anschließen durch einen Tiefpass 
schicken, wären geeignet, um die beiden ortogonalen Komponenten zu 
bestimmen.

von Lurchi (Gast)


Lesenswert?

Vermutlich sollte man das ganze anders angehen: - mit einer anderen 
Hardware:
Das Anregungssignal kann man gut per PWM und low pass Filter erzeugen. 
Sofern der µC es hergibt alternativ auch per DDS in SOftware. Wenn das 
Signal kein perfekter Sinus ist, stört dies nicht so sehr - vor allem 
wenn man bei der detection vor allem die Grundwelle detektiert.

Sofern der ADC im µC schnell genug ist, notfalls mit Unterabtastung, 
würde ich eher den ADC direkt das Wechselspannungssignal erfassen 
lassen. Das Signal kann man dann ähnlich wie beim Lockin Verstärker 
auswerten. Damit erhält man mehr oder weniger direkt den Real- und 
Imaginärteil der Spannung und damit der Impedanz. Für den Abgleich der 
Phase wird man einmal einen Widerstand oder verlustarmen Kondensator 
vermessen müssen.

P.s. die Willson Stromquelle ist vermutlich auch keine so gute Wahl bei 
der hohen Frequenz. Man kann da gut einen kleinen HF Transformator 
nutzen, um den Strom auch gegen Masse messen zu können.

von Achim S. (Gast)


Lesenswert?

in welcher Größenordnung liegen denn die zu messenden Impedanzen?

Wenn du bei sub-mA Signalen auf die Nulldurchgänge starrst, wirst du 
immer mit Dreckeffekten kämpfen.

Der Vorschlag von Thomas W. passt (LCR-Meter machen das häufig so, wobei 
nicht nur der Spannungsabfall komplex zerlegt wird sondern auch der 
anregende Strom).

Vielleicht wäre auch der AD5933 eine Komplettlösung für dein Problem:
http://www.analog.com/en/products/rf-microwave/direct-digital-synthesis-modulators/ad5933.html#product-overview

von Possetitjel (Gast)


Lesenswert?

Claas H. schrieb:

> Bevor ich mich hier aber in irgendetwas verrenne und
> total auf dem Schlauch stehe

In der Hoffnung, dass Du mir das nicht übelnimmst:
Moderater Irrsinn, würde ich sagen :)

> wollte ich euch Fragen ob ihr noch andere Ideen habt.

Viele Wege führen nach Rom; in diesem Fall unterstütze ich
den, den Lurchi vorgeschlagen hat. Also:

Signalerzeugung synchronisiert mit dem µC, d.h. Timer-Ausgang
und Filter. Freilaufende WIEN-Brücke würde ich nicht machen.
Gibt viele Wege dafür; 50:50-Rechteck und Tiefpass ist der
einfachste.

Unterabtastung finde ich eine sehr gute Idee; dazu würde ich
vielleicht zwei Sample&Hold-Glieder verwenden und die statt
des Gleichrichters/Tiefpasses einsetzen.
Die Sampling-Pulse sollte man vom µC-Timer ableiten; dadurch
hast Du zwingend eine feste Phasenbeziehung zwischen Sender-
und Empfängerseite. Ach so: Natürlich Sende- UND Empfangsseite
erfassen, wegen der Phasenmessung.

Ach so: Ist zwingend vorgegeben, dass Du den Strom einspeisen
und die Spannung messen musst? Ansonsten könntest Du eine
stellbare Spannungsquelle benutzen, den Strom messen und die
Spannung mit dem µC so einstellen, dass genau 0.8 mA fließen.
Die Forderung, bei 0.8mA zu messen, ist dadurch auch erfüllt,
aber es ist einfacher, eine Spannung einzuspeisen und den
Strom zu messen als andersrum.

von Henrik V. (henrik_v)


Lesenswert?

Wenn es denn rein analog sein soll ist die Synchrongleichrichtung ja 
schon genannt worden.

Ansonsten würde ich Strom und Spannung mit der Soundkarte messen, 
jeweils Sinus anfitten und die Phase ausrechnen.

Wenn die Soundkarte resp. deren Verstärker auch noch 50kHz schafft, 
braucht es nur noch einen bekannten Widerstand :) und der Sinusfit ist 
besonders einfach, da die Frequenz genau bekannt ist. (DAC und ADC haben 
den gleichen Takt)

AC 
Stromquelle:http://www.edn.com/design/analog/4324499/Bipolar-current-source-maintains-high-output-impedance-at-high-frequencies


Ansonsten mal schauen ob es nicht billiger, schneller und genauer damit 
geht:
http://www.sourcetronic.com/shop/de/lcr-meter/

: Bearbeitet durch User
von Claas H. (black_jacky)


Lesenswert?

Hi,

vielen Dank für die vielen Antworten.

Jetzt habe ich noch ein paar Fragen zu den einzelnen Vorschlägen:

Zu Lurchi:
Signalerzeugung ist mir soweit klar, genauso wie die Unterabtastung, 
aber wie bekomme ich die Geschwindigkeit vom ADC heraus? Als uC nutze 
ich den ATMega328p mit einem Takt von 16Mhz. Ich nutze den internen 
10-Bit ADC. Den Takt des ADC kann ich über Prescale vorgeben, nur wie 
bekomme ich die Anzahl der benötigten Takte für die Wandlung raus (mit 
Worst Case Abschätzung) und wie verändert sich die Genauigkeit der 
Messung, da diese ja bei steigender Frequenz abnimmt.

Und ist die Willson Stromquelle ein Synonym für die Howland Current 
Pump? Und wie ist das prinzipielle Vorgehen bei der Realisierung mit 
einem HF Transformator?

Zu Achim:
Der Realteil der Impedanz liegt zwischen 100-1300 Ohm und der 
Phasenwinkel im Bereich von 0-25°.
Zum Vorschlag von Thomas werde ich mich heute noch ein wenig einlesen.

Zu Possetitjel:
Meinst du den Gleichrichter + Tiefpass zur Bestimmung der Amplitude?
Wenn ich zwei Sample & Hold verwende, würde es Sinn machen zwei externe 
ADC zu verwenden um das Signal schneller abtasten zu können? Und falls 
ja, welche ADC würde ihr empfehlen?
Die Variante mit der Spannungsquelle und messen des Stroms finde ich 
auch interessant, werde ich aber erstmal hinten anstellen.

Zu Hendrik:
Die Nutzung der Soundkarte zur Bestimmung des Signals hört sich auch gut 
an, welche würdest du verwenden und kennst du Projekte die mittels uC 
und Soundkarte bereits eine Signalerfassung realisieren?

Viele Grüße

von Possetitjel (Gast)


Lesenswert?

Claas H. schrieb:

> Zu Possetitjel:
> Meinst du den Gleichrichter + Tiefpass zur Bestimmung
> der Amplitude?

Ja, genau.

> Wenn ich zwei Sample & Hold verwende, würde es Sinn
> machen zwei externe ADC zu verwenden um das Signal
> schneller abtasten zu können?

Das kannst Du natürlich auch machen. - Die ADCs haben
ja in der Regel schon Track/Hold-Schaltungen auf dem
Chip.
Du musst halt nur beide Kanäle synchron starten.

von Henrik V. (henrik_v)


Lesenswert?

Claas H. schrieb:
> Die Nutzung der Soundkarte zur Bestimmung des Signals hört sich auch gut
> an, welche würdest du verwenden und kennst du Projekte die mittels uC
> und Soundkarte bereits eine Signalerfassung realisieren?

Du brauchst für die 50kHz eine Soundkarte mit 192kHz Samplerate, ob nun 
16 oder 24bit ist eigentlich egal.

Zum Spielen an der Soundkarte nehm ich gerne Specrumlab
http://www.qsl.net/dl4yhf/spectra1.html
oder ich Klick mir was in LabVIEW ...

Frage ist, was DU willst: Schnell die Messungen machen, oder billigst 
was selber basteln?
Und dann : Welche Phasenauflösung schwebt Dir denn vor?

Die Messdatenerfassung könnte man auch über ein Scope machen, die Kosten 
ja auch fast nix mehr und haben alle USB Anschluß. Sind zwar nur 8 bit, 
aber bei genug Punkten und Sinusfit kommt man da auch schon sehr weit.

von Lurchi (Gast)


Lesenswert?

Die AVRs brauchen im freilaufenden Modus 13 Zyklen des ADC taktes für 
eine Wandlung. Ein Problem gibt es ggf. durch den Bezug auf den ADC Takt 
- der Vorteiler ist nicht so einfach synchron zu bekommen. Was aber 
geht, ist den ADC einen interrupt auslösen zu lassen und dann zu der AD 
Wandlung die Zeit / Phase des Oszillators zu bestimmen. Durch mitteln 
über mehr Werte bekommt man damit den Fehler auch sehr klein.

Der ADC des AVRs ist gerade etwas langsam um ein 50 kHz Signal direkt 
abzutasten - da sind knapp 40 kHz als analoge Bandbreite angegeben. Wie 
sich das genau beim Subsampling verhält weiss ich jetzt nicht. Die 
Chancen stehen gut das man dies noch direkt mit dem µC machen kann, ggf. 
mit realtiv hohem ADC Takt (z.B. 250 kHz), ggf. auch etwas oberhalb des 
sonst optimalen Bereichs.

Beim AVR würde ich auch eher zu PWM Signal vom Timer und Bandpass / 
Teifpass tendieren. So gut muss der Sinus zur Anregung meist nicht sein.

Sofern man keinen so stabilen Strom braucht, könnte man das Testobjekt 
über einen Widerstand in Reihe mit Spannung versorgen. Mit dem 
Transformator kann man dann Wahlweise die Spannung am 
Vergleichswiderstand oder dem DUT je weils gegen Masse, mit dem gleichen 
Verfahren messen. Damit würden Phasenfehler oder eine variable Amplitude 
vom Filter herausfallen - man braucht aber halt etwas länger für die 
Messung.
Als 1:1 HF Transformator könnte etwa eine Stromkompensierte Drossel 
dienen.


Für nur Werte in einem Bereich 1:15 kommt man wohl auch noch ohne eine 
umschaltbare Verstärkung aus.

von Claas H. (black_jacky)


Lesenswert?

Hi,
also ich habe mich jetzt noch ein wenig mit dem AD5933 beschäftigt, 
diese biete aber nicht, dass der Messstrom auf 0,8mA begrenzt wird 
sonder dieser ist abhängig von der angehängten Last. Daher werde ich 
deisen Chip leider nicht verwenden können, außer ich habe etwas 
übersehen und ihr belehrt mich eines besseren ;-)

Die Soundkarte schließe ich auch erstmal aus, da das Gerät nacher 
mittels uC gesteuert werden soll und auch möglichst klein werden soll. 
Da ich keine zusätzlichen Komponenten wie einen PC verwenden möchte.

Daher werde ich mich auf die Variante mit dem PWM -> Sinus -> 
Stromquelle -> Impedanz -> ADC mit intertupt konzentrieren.
Jetzt habe ich mal kurz Überschlagen, das ich bei einem 8bit PWM Signal 
bei einem uC Takt von 16Mhz eine maximale PWM Frequenz von 16/256Mhz -> 
62,5kHz bekomme. Daher macht eine PWM Signal keinen Sinn sondern ich 
erhalte ein Rechtecksignal mit 50kHz und muss diese filtern, oder habe 
ich einen Denkfehler?

Ich habe auch noch nicht ganz verstanden, warum die Howland Current Pump 
nicht geeignet ist für die Anwendung, bzw. wo die Nachteile liegen.

Besten Dank schon einmal für die super Hilfe von alle! :-)

von Possetitjel (Gast)


Lesenswert?

Claas H. schrieb:

> Daher macht eine PWM Signal keinen Sinn sondern
> ich erhalte ein Rechtecksignal mit 50kHz und muss
> diese filtern,

Ja, genauso war das gemeint.

> oder habe ich einen Denkfehler?

Nein.

> Ich habe auch noch nicht ganz verstanden, warum die
> Howland Current Pump nicht geeignet ist für die
> Anwendung, bzw. wo die Nachteile liegen.

Die Howland-Schaltung enthält eine MITKOPPLUNG und hat
daher eine Schwingneigung. Das macht sie bei manchen
Leuten (z.B. bei mir) unbeliebt.

von Claas H. (black_jacky)


Angehängte Dateien:

Lesenswert?

Nabend alle zusammen,
ich habe es jetzt soweit, das ich mir ein Rechtecksignal am Ausgangspin 
erzeuge, indem ich den 8 Bit Timer2 verwenden und bei 16Mhz bis 160 
zählen lasse, durch den CompareA wird der OC2A Pin mit 100kHz 
gewechselt, somit erhalte ich ein 50:50 PWM mit 50kHz. Diese schicke ich 
vorerst durch einen Butterworth Filter 8. Ordnung mit einer 
Grenzfrequenz von 51kHz. Dadurch erhalte ich das Ergebnis (Siehe Anhang) 
Rot ist der Ausgang an PB3 vom uC und Gelb das Signal nach dem Filter.

Soweit hat alles gut geklappt, jetzt hänge ich aber ein wenig am 
Subsampling.
Um den ADC immer zu einem definierten Zeitpunkt zu starten, habe ich 
einen weiteren Compare zum Timer2 hinzugefügt.
Der Plan ist den Comparewert von 0-160 zu variieren und bei einem 
CompareB Match die AD-Wandlung zu starten. Somit erhalte ich wenn ich 
dies jeweils für den Zeitpunkt durchführe wo der Ausgang von PB3 0 bzw. 
1 ist, 320 Werte pro Periode.

Den Takt vom ADC habe ich vorerst auf den maximalen Takt von 1MHz 
gesetzt und erhalte damit 76,9kSPS.
Für einen ersten Testlauf habe ich die Werte vom CompareB in 8er 
Schritten erhöht und die Werte aus dem ADC in ein Array geschrieben. 
Zudem habe ich diese öfters wiederholt um die Werte zu mitteln.

Leider bekomme ich dabei keine sinnvollen Werte raus, sobald ich mir 
diese Werte ausgeben lasse und plotte.

Da ich erst seit knapp 2 Wochen uC programmiere, bin ich für jeden Tipp 
dankbar um meine Programmierung zu verbessern.
1
#include <avr/io.h>
2
#include "messen.h"
3
#include <avr/interrupt.h>
4
#include <util/delay.h>
5
#include <stdlib.h>
6
#include <stdio.h>
7
8
volatile uint16_t convert = 0;
9
volatile uint8_t adc_aktiv = 0, sin_pin_value = 0, signal_half = 0; 
10
volatile uint16_t adc_messwerte[40][2];
11
12
void sin_sig_init( void )
13
{
14
  TCCR2A = (1<<COM2A0)|(1<<WGM21);        //OC2A auf toggle bei Compar Match setzen, Modus 2 wählen (CTC)
15
  OCR2A = F_CPU/(2*F_SIN)-1;            //Zähler einstellen, bis zu dem gezählt werden soll
16
  DDRB |= 1<<PB3;                  //Pin PB3 als Ausgang definieren (OCRA mapped on PB3)
17
}
18
19
void sin_sig_start( void )
20
{
21
  TCCR2B = 1<<CS20;                //Prescale auf "No Prescaling"
22
}
23
24
void sin_sig_stop( void )
25
{
26
  TCCR2B = 0;                    //Prescale auf 0 -> Timer deaktivieren
27
}
28
29
void adc_init(void)
30
{
31
  ADMUX = (1<<REFS0);                //Analog Refferenz auf extern VCC
32
  ADMUX |= (1<<ADLAR);              //linksbündig ausgerichtet um einfacher die obersten 8Bit auszulesen
33
  ADCSRA = (1<<ADEN);                //ADC einschalten
34
  ADCSRA |= (1<<ADPS2);              //Prescale der Systemclock auf 16 setzen (16MHz/16=1MHz)
35
  
36
}
37
38
void adc_set_pin (uint8_t pin)
39
{
40
  ADMUX &= (1<<REFS1)|(1<<REFS0)|(1<<ADLAR);    //MUX3..0 auf 0 setzen
41
  ADMUX |= pin;                  //MUX3..0 auf den jeweiligen Eingangspin setzten
42
}
43
44
void adc_stop(void)
45
{
46
  if(adc_aktiv) adc_aktiv = 0;          //falls noch nicht gestoppt wurde, auf stoppen setzen
47
  ADCSRA &= ~(1<<ADSC);            //stoppen der Analog-Digital Umwandlung
48
}
49
50
void adc_start(void)
51
{
52
  adc_aktiv = 1;              //auf starten setzten
53
  signal_half = 0;            //auf die erste Singalhälfte setzen
54
  ADCSRA |= (1<<ADIE);          //Interrupt einschalten
55
  OCR2B = 16;                //Compare Wert für Timer2CompareB setzen
56
  TIMSK2 |= (1<<OCIE2B);          //Compare Interrupt aktivieren
57
}
58
59
void adc_dummy_read(void)
60
{
61
  adc_aktiv = 0;
62
  ADCSRA |= (1<<ADIE);          //Interrupt einschalten
63
  ADCSRA |= 1<<ADSC;            //Starten der Analog-Digital Umwandlung
64
  _delay_ms(2);              //Warten bis die Werte ausgelesen wurden
65
}
66
67
uint16_t adc_read (uint8_t zeile, uint8_t spalte)
68
{
69
  return adc_messwerte[zeile][spalte];
70
}
71
72
ISR(TIMER2_COMPB_vect)
73
{
74
  sin_pin_value = (PINB & (1<<PB3))>>PB3;    //Speichern des aktuellen Zustands von Pin PB3
75
  if(!(ADCSRA&(1<<ADIF)) && !((ADCSRA)&(1<<ADSC)) && sin_pin_value==signal_half)
76
  {
77
    ADCSRA |= 1<<ADSC;            //Starten der Analog-Digital Umwandlung
78
  }
79
}
80
81
ISR(ADC_vect)
82
{
83
  TIMSK2 &= ~(1<<OCIE2B);            //Compare Interrupt deaktivieren
84
  uint8_t temp = ((OCR2B+4)/8);
85
  if(adc_aktiv && signal_half)
86
  {
87
    adc_messwerte[temp+19][0] = (adc_messwerte[temp+9][0]+(ADCH))/2;    //Speichern des Wertes der AD Wandlung
88
    adc_messwerte[temp+19][1] = OCR2B +160;  //Startzeitpunkt der Wandlung speichern
89
    if(OCR2B >= 156) 
90
    {
91
      //adc_aktiv=0;      //Wenn die zweite Signalhälfte auch abgetastet ist die Messung deaktivieren
92
      signal_half = 0;
93
      OCR2B = 4;
94
    }
95
    else OCR2B += 8;            //Falls noch nicht vollständig abgetastet Compare2B auf den nächst höheren setzen
96
  }
97
  else if(adc_aktiv)
98
  {
99
    adc_messwerte[temp-1][0] = (adc_messwerte[temp-1][0]+(ADCH))/2;    //Speichern des Wertes der AD Wandlung
100
    adc_messwerte[temp-1][1] = OCR2B;    //Startzeitpunkt der Wandlung speichern
101
    if(OCR2B >= 156)
102
    {                    //wenn 144 erreicht ist (5 Abtastungen der ersten Hälfte)
103
      signal_half = 1;          //Auf die zweite Hälfte des Signals stelle
104
      OCR2B = 4;              //Compare2B Werte zurücksetzen auf 16
105
    }else OCR2B += 8;            //Falls noch nicht vollständig abgetastet Compare2B auf den nächst höheren setzen
106
    
107
  }
108
  else convert = (ADCL)|(ADCH<<8);      //Werte aus dem ADC speichern
109
  //if(start) ADCSRA |= 1<<ADSC;        //erneut starten der Analog-Digital Umwandlung
110
  //else ADCSRA &= ~(1<<ADIE);        //Interrupt ausschalten
111
  if(adc_aktiv)  TIMSK2 |= (1<<OCIE2B);      //Compare Interrupt einschalten
112
}

Zudem hier noch der Teil in der Main Methode:
1
int main(void)
2
{
3
  adc_init();
4
  adc_set_pin(PHASE_PIN);
5
  adc_dummy_read();
6
  sin_sig_init();
7
  sin_sig_start();
8
  _delay_ms(5);
9
  adc_start();
10
  
11
  do
12
  {
13
    sprintf(zeile1, "S:%04d ", adc_read(ebene,0));
14
    sprintf(zeile1+7, "T:%04d", adc_read(ebene,1));
15
    display_update();
16
    if(minute==1) adc_stop();
17
  }while(1);
18
}

Teilweise habe ich Abschnitte in der Main ausgelassen, die Tastendrücke 
auswerten und eine Zeitbasis, über die ich die Minute hochzähle.
Der Einfachheit halber lasse ich mir die Werte aufm Display anzeigen und 
kann durch das Array durchschalten per Tastendruck. Demnächst setze ich 
mich noch an die Ausgabe per UART.

Nur leider ergeben die Werte wenn ich diese Plotte keinen Sinn. Im 
Anhang ein Auszug von den Werten in dem Array.

Vielen Dank für die bestimmt kommende Hilfe :-) So und nun gute Nacht.

von X4U (Gast)


Lesenswert?

Claas H. schrieb:
> Nun zu meinem Problem: Sobald ich die Impedanz (Im aktuellen Testfall
> rein ohmsch) verändere, wird logischer Weise des Messsignal in seiner
> Amplitude kleiner und die feste Hysterese des Schmitt-Triggers sorgt für
> eine Spätere Erkennung des Messsignals. Somit ist das Ausgangssignal des
> XOR-Gatters kürzer auf High und somit verringert sich das
> Tastverhältnis, obwohl keine Änderung des Phasenwinkels vorliegt.

Kannst du das nicht durch normalisieren indem du "unendlich" verstärkst 
und dann auf "1" abschneidest?

von max2 (Gast)


Lesenswert?

Du hast den Arduino UNO genommen und solltest den Anrduino Due 
verwenden.
KEin PWM, keine Unterabtastung nötig, da ARM 3.

Alternativ eine Messkarte von NI.

von Lurchi (Gast)


Lesenswert?

Die folgende Zeile kommt mit komisch vor - insbesonder das temp+9 :

   adc_messwerte[temp+19][0] = (adc_messwerte[temp+9][0]+(ADCH))/2;

Das dürfte einiges durcheinander bringen.

von Claas H. (black_jacky)


Lesenswert?

Lurchi schrieb:
> Die folgende Zeile kommt mit komisch vor - insbesonder das temp+9 :
>
>    adc_messwerte[temp+19][0] = (adc_messwerte[temp+9][0]+(ADCH))/2;
>
> Das dürfte einiges durcheinander bringen.

Ohman, du hast recht, da habe ich vergessen was zu ändern, als ich die 
Schrittgröße von 16 auf 8 geändert habe. Danke! Das sollte hoffentlich 
bessere Ergebnisse liefern.

>Du hast den Arduino UNO genommen und solltest den Anrduino Due
>verwenden.
>KEin PWM, keine Unterabtastung nötig, da ARM 3.

Klingt interessant, habe mir grade mal das Datenblatt vom ATSAM3X8E 
Cortex-M3 MCU angeschaut. Wie schwer ist der Umstieg von dem ATMega328p 
auf diesen Prozessor?
Und eine NI-Messkarte kann nicht eingesetzt werden, da das Gerät mobil 
und ohne externe Hardware, wie einen PC genutzt werden soll.

>Claas H. schrieb:
>> Nun zu meinem Problem: Sobald ich die Impedanz (Im aktuellen Testfall
>> rein ohmsch) verändere, wird logischer Weise des Messsignal in seiner
>> Amplitude kleiner und die feste Hysterese des Schmitt-Triggers sorgt für
>> eine Spätere Erkennung des Messsignals. Somit ist das Ausgangssignal des
>> XOR-Gatters kürzer auf High und somit verringert sich das
>> Tastverhältnis, obwohl keine Änderung des Phasenwinkels vorliegt.
>
>Kannst du das nicht durch normalisieren indem du "unendlich" verstärkst
>und dann auf "1" abschneidest?

Das ist einen weitere alternative, die ich noch testen werde. Vorerst 
werde ich aber die Variante mit dem Subsampling  versuchen umzusetzen.

von max2 (Gast)


Lesenswert?

Claas Hartmann (black_jacky schreieb:


> Klingt interessant, habe mir grade mal das Datenblatt vom ATSAM3X8E
> Cortex-M3 MCU angeschaut. Wie schwer ist der Umstieg von dem ATMega328p
> auf diesen Prozessor?

Dieser Prozessor ann in der Arduino-Sprache programmiert werden.
Einmaliige vorgänge ins Setup(), statt main()einfach loop() verwenden.
Dann C oder C++ . Es ist damit wirklich der Cross-Compiler realisiert 
worden.

Ich habe damit ein EKG gebaut. Alle 2 ms ein Interrupt und in dieser 
Zeit
wird folgendes ausgeführt:
1. AD Wadlung
2. DA Wandlung (Ausgabe eines Nornsignals)
3. Digitales Medianfilter
3. Digitales Notch mit FIR Methode
4. Digitales Tiefpass mit FIR Methode
5. Zeichnen eines Kurvenzugs auf ein TFT Display
6. Auswertung eines Encoders und einiger Schalter (entprellen)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.