www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frequenzmessung Problem mit AT90CAN128


Autor: Jakob Ka (jakobka)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo liebe Forumsmitglieder,

ich bin Neuling in Sachen Mikrocontroller, muss mich aber innerhalb 
kurzer Zeit in das Thema einarbeiten, da ich für ein zeitkritisches 
Projekt an der Uni eine einfache Motorsteuerung entwickeln muss. Ich bin 
kein Elektrotechniker... trotzdem muss das irgendwie gehen. Ich nutze 
dabei ein Programm namens Wormhole, mit dem ich Simulink-Code direkt aus 
Matlab heraus auf den AT90CAN128 übertragen kann. Zusätzlich kann 
separat geschriebener C-Code eingebunden werden. A/D-Wandler, PWM Signal 
ausgeben, Digitale I/Os hab ich soweit unter Kontrolle. Für die 
Drehzahlbestimmung (Hall-Sensor) muss ich allerdings die Frequenz 
messen, was ich noch nicht kann. Der Hall-Sensor (bzw. der 
Frequenzgenerator) liegt am ICP1 an. Mit einer sehr einfachen 
Interruptroutine kann ich bei fallender Flanke einen Pin setzen, den ich 
später wieder zurücksetze:
#ifndef ____testinterrupt
#define ____testinterrupt


#include <avr/io.h>
#include <avr/interrupt.h>
#include <string.h>
#include <util/delay.h>  
#include <math.h>
#include <inttypes.h>
#include <stdbool.h>


#define setbit(ADR,BIT)   (ADR |= (1<<BIT))
#define clearbit(ADR,BIT) (ADR &=~(1<<BIT))
#define getbit(ADR, BIT)  (ADR &  (1<<BIT))



ISR( TIMER1_CAPT_vect )
{

setbit(PORTF,0); //PORTF.0 auf 1 setzen

}



uint8_T get_freq() //Diese Funktion wird aus dem Simulink Modell heraus aufgerufen
{

  
clearbit(PORTF,0); //PORTF.0 auf 0 setzen
  
return 1;


}


#endif




Von daher gehe ich davon aus, dass ich die Register richtig gesetzt habe 
(geschieht in Simulink) und auf dem richtigen Weg bin. Die 
Frequenzmessung mit einem auf den AT90CAN128 angepassten Code von dieser 
Seite wollte ich die Frequenz messen, es klappt allerdings nicht:

volatile unsigned int  StartTime = 0;   // ICR-Wert bei 1.High-Flanke speichern
volatile unsigned int  EndTime = 0;     // ICR-Wert bei 2.High-Flanke speichern
volatile unsigned char vollstMess = 0; // Messung vollständig?


ISR( TIMER1_CAPT_vect )
{
static unsigned char ErsteFlanke = 1;

if(vollstMess)
return;


setbit(PORTF,0);




if( ErsteFlanke )
 {
    StartTime = ICR1;
    NrOverflows = 0;
    ErsteFlanke = 0;       // Die naechste Flanke ist das Ende der Messung
  }

else
  {
   EndTime = ICR1;
    ErsteFlanke = 1;
    vollstMess = 1;
          // Bei der naechsten Flanke beginnt der naechste Messzyklus
  }

}

ISR( TIMER1_OVF_vect )
{
 NrOverflows++;
}


int get_freq() //wird von SImulink aus aufgerufen
{
int Erg=0;
  
clearbit(PORTF,0);


if( vollstMess )
    {

    Erg = (NrOverflows * 65536) + EndTime - StartTime;


    Erg = F_CPU / Erg;       // f = 1 / t

vollstMess=0;

}  
return Erg;


}


#endif





Könnt ihr mir weiterhelfen? Leider konnten mir die anderen Threads nicht 
helfen und wie gesagt bin ich Neuling und habe wenig Zeit (schlechte 
Kombination).

Vielen Dank,

Jakob

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.