Pages: [1]   Go Down
Author Topic: PWM signal einlesen  (Read 2352 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Sr. Member
****
Karma: 0
Posts: 282
Einfach ein Flop :P
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi

Ich wollte mal fragen wie ich ein PWM-Signal einlesen kann.

Folgendes:

Ich bin für den Solarboot-Cup in Koblenz, das jedes jahr stattfindet, ein Solarboot am bauen. Im letzten jahr haben wir einen guten platz versaut, da der Regler für den Brushless-Motor immer eingebrochen ist. Also der Strom der von den Solarzellen kommt, reicht nicht aus um den Motor zu füttern. Wenn man dann zu viel Gas gibt, schaltet der regler ab und der Motor geht aus. Dann muss man immer wieder Gas wegnehmen, dann wieder gas geben. Und das bei nem richtig teuren Kontronik-Regler -.-
Mim ardu will ich einen Begrenzer basteln. Eine Photo-diode soll erfassen, wie hell es ist. Wenn es dunkler wird soll der Regler runtergeregelt werden, also dass man nicht mehr so viel gas geben kann. Das mit der Photodiode funzt auch schon einwandfrei, auch das Ansteuern des Reglers. Mit der Berechnung komme ich auch zurecht, das einzigste Problem ist das Eingangssignal vom Empfänger. Ich will das PWM-Signal in 0 - 255 Schritten im Ardu bearbeiten können.

Kann mir da pls einer helfen?

MFG, Robdeflop®
Logged

AREA COLOGNE
Offline Offline
Edison Member
*
Karma: 21
Posts: 1148
I am 1 of 10 who understands binary
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich würde dies mit einem RC-Glied machen also einen Widerstand in Reihe und danach einen Kondensator so 100nF. Mit dem Widerstand muss du ein bisschen spielen. Austesten welche Spannungswerte du dann bei 100% ontime hast und dann Liest du  mit dem Analog Read (0-1024) den Wert und mit einem  kleinen Filter(neuen gelesenen Wert hat nur einen bestimmten einfluss auf den "alten") arbeitest du damit dir evtl Störungen nicht alles Versauen.

Filter in diesem Sinne

Lesewert=Analogread(A0);
Rechenwert1=(Lesewert*10)/100      // pro Zyklus einfuss von 10%
Rechenwert2=(Lesewertalt*90)/100   // pro Zyklus einfluss von 90%
Istwert=Rechenwert1+Rechnwert2
Lesewertalt=Istwert

Ist ein Zyklusabhäniger Filter den man gerne in SPSen nimmt so versaut die auch ein einzelner flascher Wert nicht die ganze Regelung. Bei den kurzen Zykluszeiten hast du innerhalb weniger Durchläufen eine optimale annährung wenn du dann mit den Multiplikatoren arbeitest kannst du das ganze empfindlicher oder weniger empfindlicher machen
Logged

So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

0
Offline Offline
Sr. Member
****
Karma: 0
Posts: 282
Einfach ein Flop :P
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi

Geht doch auch ohne extra bauelemente oder?

Hab eben zufällig mal einen code bei diydrones gefunden:

Code:
unsigned int serinp[8]; //servo positions

void setup_timer1()
{
  //disable all interupts
  TIMSK1 &= ~( _BV(TOIE1) | _BV(ICIE1) | _BV(OCIE1A) | _BV(OCIE1B));

  //set timer mode
  TCCR1A &= ~( _BV(WGM11) | _BV(WGM10) );
  TCCR1B &= ~( _BV(WGM12) | _BV(WGM13) | _BV(ICNC1));

  //capture raising edge
  TCCR1B |= _BV(ICES1); //capture raising edge

  //prescaler 1/8
  TCCR1B |= _BV(CS11);
  TCCR1B &= ~( _BV(CS12) | _BV(CS10) );

  //disable outputs
  TCCR1A &= ~( _BV(COM1A0) | _BV(COM1A1) | _BV(COM1B0) | _BV(COM1B1));

  //enable capture interupt
  TIMSK1 |= (1ICIE1);
}


ISR(TIMER1_CAPT_vect)
{
  static unsigned int lasticr; //icr at last caputre
  static unsigned char cserinp; //current input servo

  unsigned int licr;

  //TCCR1B ^= _BV(ICES1);
  licr=ICR1-lasticr;
  lasticr=ICR1;

  if(licr>5000)
  { //pulse too long, means start of new frame
    cserinp=0;
  }
  else if(licr>1000)
  { //pulse good, take reading, go to next channel
    serinp[cserinp]=licr;
    if(cserinp<8)
    {
      cserinp++;
    }
  }
  else
  {
    //too short, nothing to see here
  }
}


void setup()
{
  pinMode(8, INPUT); //sum
  setup_timer1();
}

void loop()
{
  //use serinp!!!
}

http://diydrones.com/profiles/blogs/705844:BlogPost:39393

Nur hab ich da nen Error:

error: invalid suffix "ICIE1" on integer constant


Eig braucht man ja nur einen Zähler, der immer im richtigen takt die Ein und Aus-zustände des empfänger-ausgans-signals zählt, nicht wahr?

Der gepostete code oben ist zu hoch für mich. Ich bin für sachen mit "normalen" funktionen eher zu gebrauchen xD

MFG, Robdeflop®
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 272
Posts: 21939
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich finde auch, daß es ohne zusätzliche Bauteile geht (außer dem Arduino). Die Reglegröße ist die Spannung der Solarzellen. Wenn die zusehr einbricht, weil der Regler zuviel Strom zieht, dann muß man den Regler zurückregeln. In diesem Fall würde ich eine Steuerung mit dem Arduino bauen und mit dem das Steuersignal (von der Fernsteuerung) und der verfügbaren Leistung der Solarzellen ein optimale Ansteuerung des Motorreglers errechnet.
Grüße Uwe 
Logged

0
Offline Offline
Sr. Member
****
Karma: 0
Posts: 282
Einfach ein Flop :P
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi

Dass der regler einbricht hab ich ja schon geschrieben^^ Und auch dass ich das mit dem Ardu dann abregeln will hab ich glaub ich auch geschrieben smiley Ich werde entweder die Spannung der Solar´s messen, oder eine Photodiode verwenden um die Sonneneinstrahlung zu messen. Wird es dunkler als eine bestimmte grenze, abregeln.

Brauche halt nur hilfe beim einlesen des Signals des Empfängers.
Nur habe ich mich glaube ich wieder mit dem PWM signal vertan.
Nicht die I/O Zustände in einer bestimmten zeit sind ausschlaggebend, sondern die zeit, wie lange der Zustand des Signal´s 1 ist, in einer bestimmten zeit. Oder?
Wenn es so ist, kenne ich, im moment, noch keine gescheite rescourcensparende oder gute Lösung.

Ich schau mir aber gleich mal die Funktion "pulseIn" an, und was man damit machen kann smiley

Wäre trotzdem sehr dankbar für eine Hilfe smiley-grin

MFG, Robdeflop®
Logged

0
Offline Offline
Sr. Member
****
Karma: 0
Posts: 282
Einfach ein Flop :P
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi

So, hab mal grad die pulseIn funktion getestet. Meiner meinung nach ist diese Funktion sehr gut zu gebrauchen, nur leider schwankt der wert ein wenig. Aber ich denk das wirkt sich nicht so sehr auf´s Servo aus smiley Hab dann anschließend einfach die werte von 935 bis 2030 auf 0 bis 255 gemappt. Damit wär das Problem soweit eig gelöst smiley-grin

Aber mal zu ner anderen frage. Wie kann ich spannungen über 5V messen?

Vielen dank schonmal^^

MFG, Robdeflop®
Logged

Germany
Offline Offline
Edison Member
*
Karma: 48
Posts: 2346
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Am einfachsten geht das wohl über einen Spannungsteiler: Wenn du eine Spannung von maximal 10V messen willst, nimmst du einfach zwei gleich große Widerstände (Größenordnung 10k) und schaltest die in Reihe von der zu messenden Spannung zu Masse. Am Verbindungspunkt der Widerstände kannst du dann eine Spannung abgreifen, die genau der Hälfte der ursprünglichen Messspannung ist.
Logged

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

0
Offline Offline
Sr. Member
****
Karma: 0
Posts: 282
Einfach ein Flop :P
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi

War klar dass man das so machen kann, ich idiot smiley-grin Hab auch über das Stichwort Spannungsteiler nachgedacht^^

Aber, warum gibt es Sensoren für Strom, aber nicht für Spannung? Zumindest hab ich bei watterott keine gesehen. Falls ich z.B. ne art Messgerät mim Ardu basteln will und nicht immer lust hab nen Spannungsteiler zu verwenden. Alternative?

Weil nen Logger kann man immer mal gebrauchen. UniLog is im bereisch modellsport zwar eine der besten möglichkeiten, so einen hab ich hier auf rumliegen, aber das wär ja viel zu einfach.

MFG, Robdeflop®
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 272
Posts: 21939
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Stromsensoren gibt es weil es nicht trivial ist Ströme zu messen ohne den Stromkreis durch die Messung zu stören. Die meisten Stronsensoren sind auch galvanisch getrennt (isoliert) zwischen Strommessung und Spannungsausgang.
Spannung kann man einfach mit Spannungsteiler verkleinern oder mit Operationsverstärker vergrößern.
Grüße Uwe
Logged

Pages: [1]   Go Up
Jump to: