PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frequenzmessung - Flanke erkennen



silo11
03.01.2007, 19:54
hallo ich hab folgendes Problem:

Ich will einen Frequenzzähler in AVR Studio 4 für den ATmega88 programmieren.
Frequenzbereich 80-400Hz. Sinus-Spannung über Oszi an Pin.


Ich hab mich die letzten 4 stunden durch sämtliche foren und
bauanleitungen gegoogelt und hab ein grundlegendes Problem:

Wie erkenn ich eine high-low Flanke des Signals?

Der ADC ist programmiert und sollte einen 10bit Wert in die Register
schreiben (ADH, ADL) wie errechne ich daraus eine Flanke? In allen
Anleitungen wurde einfach abgefragt, ob am Port X eine 1 anliegt
(Flanke ??).

Kann der Contr. hardwareseitig eine Flanke erkennen ?

Danke für die schnellen und zahlreichen Antworten.

RedEagle
03.01.2007, 21:34
??
Einfach prüfen, ob der zuvor gemessene Wert größer, bzw kleiner ist.

if(wert[i] < wert[i-1]) //Fallende Flanke (1->0)
if(wert[i] > wert[i-1]) //Steigende Flanke (0->1)

Andun
04.01.2007, 00:04
Naja, da hast du dann aber auch leicht sofort eine Flanke wenn der Wert nur leicht im high oder low bereich flakert. Du müsstest die aufschreiben wie die Werte in den letzten paar Millisekunden waren und dann vergleichen, damit dass ganze aussagekräftig ist, aber da ist die Frage nach ner internen Möglichkeit sehr gut :D

Ich hätte auch gerne ne Antwort auf deine Frage . . . :D

Hubert.G
04.01.2007, 10:38
Warum verwendet ihr nicht den Analog-Comparator, der kann auch gleich einen Interrupt auslösen bei entsprechender Flanke.

Hubert

Vitis
04.01.2007, 12:45
oder nen OP-Verstärker davor, der dann das kleine Signal auf annähernd
Rechteck verstärkt

ogni42
04.01.2007, 15:54
Über RC Netzwerk an INT0 oder INT1 Pin und auf Flanke triggern lassen. Steht im Datenblatt des Mega88 beschrieben.

silo11
06.01.2007, 16:05
danke erstmal für eure ideen,

hab mich jetzt mal an das prog. gemacht. warscheinlich ist es etwas primitv oder umständlich....ist ja auch mein erstes \:D/

die berechnung hab ich simuliert und die funtzt auch, aber der ADC konvertiert nicht. hab schon alles mögliche bei der initalisierung
ausprobiert: Single Conversion, Free Running...
es wird einfach kein Wert in die ADCL und ADCH register geschrieben,

Das Signal kommt wie gesagt aus nem generator und liegt definitv am Port an.

hier die Initialisierung des ADCs:


void initadc (void)
{
//Powersave Disable
PRR |= (0<<PRADC);

// ADC aktivieren
ADCSRA |= (1<<ADEN);

// Prescaler auf /128
ADCSRA |= (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);

// Referenzspannung auf interne 1,1V
ADMUX |= (1<<REFS1) | (1<<REFS0);

// Input auf PC4 / ADC4
ADMUX |= (0<<MUX3) | (1<<MUX2) | (0<<MUX1) | (0<<MUX0);

// Ergebnis rechtsverschoben
ADMUX |=(0<<ADLAR);

// B-Register initialisieren
ADCSRB = 0x00;

und hier der Start der Konvertierung im Single Conversion Mode:



ADCSRA |= (1<<ADSC); // Umwandlung starten
//while (ADCSRA & (1<<ADSC)); // warten bis umwandlung fertig