Frequenzgenerator

Hallo leute,

ich bin neuer in Arduino und möchte ein Frequenzgenerator generieren.ich habe etwas geschrieben für den Rechteck, aber es funktioniert nicht wie ich möchte.hier ist den Code:

#define INLENGTH 5 //maximale Größe der Zahl
#define INTERMINATOR 'H' //'H' von 'Hz'

char inString[INLENGTH+2];
int inCount;

#define MinFreq 62
#define MaxFreq 62500
#define led 7

unsigned int f = 0;
float P = 0;
int T_on = 0;
int i=0;
void setup()
{
Serial.begin(115200);
Serial.println("Bitte angeben wieviel Hz ausgegeben werden sollen (mit 'Hz')!");
pinMode(led,OUTPUT);
}
void loop()
{
Eingabe(); //Eingabe-Funktion, die Eingabe-String entgegennimmt
f = atol(inString);
//Bereich prüfen
f = constrain(f, MinFreq, MaxFreq);
P = float((1/f)*1000);Serial.println(P);
T_on = int(P/2);
Serial.print("Es wird gesetzt: ");
Serial.print(f,DEC);
Serial.println("Hz!");

for( i; i<5; i=i+1)
{
digitalWrite(led,HIGH);
delay(T_on);
digitalWrite(led,LOW);
delay(T_on); }
}
void Eingabe(){
inCount=0; //Ziffern-Zähler rücksetzen

do
{
while (Serial.available()==0);
inString[inCount] = Serial.read();
if(inString[inCount]==INTERMINATOR) break;
if((inString[inCount]<'0')||(inString[inCount]>'9')){
//continue; //geht nicht
inCount--; //-> Workaround
}
}
while(++inCount < (INLENGTH+1));
Serial.flush();
}

kann jemannd mir sagen ,warm ich immer Null auf 'P' habe?

aber es funktioniert nicht wie ich möchte.

This does not mean anything. Please describe what it does and describe what you expect it to do.

I've answered in English as you posted in the English section of the forum and my German is a bit rusty.

#define INTERMINATOR 'H' //'H' von 'Hz'


#define MinFreq 62
#define MaxFreq 62500
#define led 7


unsigned int f = 0;
float P = 0;
int T_on = 0;
int i = 0;


void setup()
{
  Serial.begin(115200);
  Serial.println("Bitte angeben wieviel Hz ausgegeben werden sollen (mit 'Hz')!");
  pinMode(led, OUTPUT);
}


void loop()
{
  f = Eingabe();  //Eingabe-Funktion, die Eingabe-String entgegennimmt
  
  if (f > 0)
  {
    //Bereich prüfen
    f = constrain(f, MinFreq, MaxFreq);
    P = 1000.0 / f; 
    Serial.println(P);
    T_on = int(P / 2);
    Serial.print("Es wird gesetzt: ");
    Serial.print(f, DEC);
    Serial.println("Hz!");
  }


  for ( i=0; i < 5; i = i + 1)
  {
    digitalWrite(led, HIGH);
    delay(T_on);
    digitalWrite(led, LOW);
    delay(T_on);
  }
}


unsigned int Eingabe()
{
  static unsigned value = 0;


  if (Serial.available())
  {
    char inChar = Serial.read();
    if (inChar == INTERMINATOR)
    {
      int returnValue = value;
      value = 0;
      return returnValue;
    }


    if (inChar >= '0' && inChar <= '9')
    {
      value *= 10;
      value += inChar - '0';
    }
  }
  return 0;
}

Here

  P = float((1/f)*1000);Serial.println(P);

1/f is always 0. Use 1.0/f at least.

Hallo,

meinst du Zeile 27 ?

P = float((1.0 / f * 1000);  Serial.println(P);

Oder wie John zeigte einfacher 1000.0 / f

Soll der Takt durch diese Zeilen erzeugt werden ?

for ( i; i < 5; i = i + 1)
  {
    digitalWrite(led, HIGH);
    delay(T_on);
    digitalWrite(led, LOW);
    delay(T_on);
  }

die for Schleife ist falsch und die Erzeugung ist mangelhaft. Nimm einen Timer dafür.

globales i weg und dafür

for (byte i = 0; i < 5; i++)
  {
    ...
  }

Wie gesagt, Timer ist die bessere Wahl.