Forum: Mikrocontroller und Digitale Elektronik Neuling sucht Antworten :)


von Martin A. (stoepsel2k)


Lesenswert?

Hallo liebe Mikrocontrollergemeinde,

ich möchte anfangen eure wunderschöne Welt der Mikrocontroller zu 
beschreiten und frage mich nach dem lesen des tutorials, was sollte ich 
mir für ein startboard kaufen, wo ich drauf üben kann. Die Wahl fällt 
mir dabei sehr schwer.

Ziel soll es sein, irgendwann einmal eine Maschinenpneumatik steuern zu 
können (z.B. um Müll zu pressen, wenn er durch eine Lichtschranke fällt)

Das bringt mich auch direkt auf meine erste Frage.

Ich habe hier einen Durchflussmesser liegen, einen VISIO 2000, dieser 
gibt ein NPN open collector Signal aus.

Wie kann ich es mit meinem ATMEGA32U4 Chip auf einem Teensy2.0 Board so 
realisieren, dass die auf dem Board befindliche LED im Bereich PORTD pro 
HIGH signal des Drehzahlmessers blinkt.


Ich würde mich freuen, wenn mir jemand bei meinen Entscheidungen und bei 
meinen kleinen Anfängen helfen könnte.

von dr.schmock (Gast)


Lesenswert?

Du kannst den Open-Collector-Ausgang direkt an einen Pin des ATMega 
hängen. Diesen Pin musst du dann als Eingangspin (DDR-Register) 
definieren und auf "1" (high) setzen (PORT-Register) damit der interne 
Pull-Up-Widerstand aktiviert ist.

Wenn jetzt der NPN schaltet, wird der Pin auf "0" gezogen, ansonsten ist 
er "1".

Die LED blinken lassen bei "0" ist ja relativ klar: Schleife, 
Sensor-Pin-Abfrage, LED-Pin setzen...

von Floh (Gast)


Lesenswert?

Sebastian Ziegenbein schrieb:
> ich möchte anfangen eure wunderschöne Welt der Mikrocontroller zu
> beschreiten...
Schön. Ich würd sagen du liest dich hier im Tutorial mal ein, da wird 
eine sehr effektive Möglichkeit des Einstiegs aufegzeigt.
Allgemein:
http://www.mikrocontroller.net/articles/AVR-Tutorial
Für C-Liebhaber:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

> Das bringt mich auch direkt auf meine erste Frage.
>
> Ich habe hier einen Durchflussmesser liegen, einen VISIO 2000, dieser
> gibt ein NPN open collector Signal aus.

Also die Funktionsweise ist klar? Wenn der Sensor ein Signal ausgibt, 
zieht er die Signalleitung auf Masse.
Das lässt sich an einem uC sehr einfach detektieren, Signalleitung über 
Widerstand auf Versorgungsspannung de uCs legen, sobald Signal da ist, 
ist die Leitung auf 0Volt.
:-)

von Grübler (Gast)


Lesenswert?

Für deine Anwendung würde ich
ein LOGO!, easy von Moeller oder
eine richtige SPS vorschlagen.

Dein Sensor wird sehr wahrscheinlich
für 24V DC ausgelegt sein. Da MC mit
Spannungen von 3,3...5V arbeiten,
geht da nix.

von Martin A. (stoepsel2k)


Lesenswert?

Der VISIO 2000 kann mit 5-24 Volt betrieben werden.

Die Anleitung des ersten Posters werde ich nachher mal ausprobieren.

Eine Sache wäre jedoch. Der MC wird via USB gespeist (Strom). Kann ich 
den VISIO 2000 einfach mit einem 12V netzteil betreiben ohne meinen 
ATMEGA zu toasten ?

Laut Anleitung des VISIO 2000 ist optional ein Kondensator ein zu setzen 
zwischen SIGNAL und VDC. Ist das notwendig bei meiner Schaltung ?

Siehe: 
http://www.produktinfo.conrad.com/datenblaetter/150000-174999/150218-da-01-de-VISION_2000_DURCHFLUSSMESSTURBINE.pdf

von Karl H. (kbuchegg)


Lesenswert?

Sebastian Ziegenbein schrieb:

> Laut Anleitung des VISIO 2000 ist optional ein Kondensator ein zu setzen
> zwischen SIGNAL und VDC. Ist das notwendig bei meiner Schaltung ?

Das ist kein Kondensator, sondern ein Widerstand.
Und seine Aufgabe ist es eben dem Open COllector Ausgang auch dann einen 
definierten Pegel zu geben, wenn der interne Transistor nicht 
durchgeschaltet hat.
Ob der im Mega eingebaute zuschaltbare Pullup Widerstand ausreicht, 
müsste man ausprobieren.

> Eine Sache wäre jedoch. Der MC wird via USB gespeist (Strom).
> Kann ich den VISIO 2000 einfach mit einem 12V netzteil betreiben
> ohne meinen ATMEGA zu toasten ?

Wenn du mit dem internen Pullup Widerstand auskommst, besteht keine 
Gefahr. Wenn nicht, dann solltest du diesen Wiederstand nicht nach +12V 
legen, sondern nach +5V.

Abgesehen davon kannst du damit deinen Mega nicht toasten.
Einfach die Massen miteinander verbinden sowie die Signalleitungen und 
dann sollte das schon gehen.


Allerdings: Mach erst ein paar Vorübungen und Vorversuche. Arbeite das 
Tutorial durch. Dein Sensor ist im Prinzip nichts anderes als ein 
Taster, der an einem Eingangspin hängt.

Genauso wie das Board. Wenn du Schwierigkeiten hast, dich für ein Board 
zu entscheiden, dann nimm zunächst das, an welches du am besten 
rankommst. Es ist sinnlos, in deinem jetzigen Zustand nach einem Board 
zu suchen, dass 'das kann' was du brauchst. Denn im Prinzip können das 
so gut wie alle. Und wenn nicht: Die Megas kosten ein paar Euro und es 
ist keine Hexerei sich ein für die Aufgabenstellung massgeschneidertes 
Board zu bauen. Das einzige worauf du wirklich achten solltest: Kauf dir 
einen vernünftigen Programmer. Mach um alle Startboards, die über RS232 
oder die parallele Schnittstelle eines PC programmiert werden einen 
großen Bogen. Es wird mitlerweile immer schwieriger diese Programmer mit 
modernen PC zur Zusammenarbeit zu bewegen. Mit einem Programmer, den du 
am USB Port anstecken kannst, ist es hingegen kein Problem. Und nein: 
RS232 über USB (mit einem USB/RS232 Wandler) funktioniert nicht 
zuverlässig.

Das heißt: Du stellst dein großes Ziel jetzt erst mal zurück, lernst zu 
programmieren, baust eventuell auch dein erstes Board selber auf. Und 
erst dann gehst du wieder zurück zu deinem langfristigem Ziel. Und du 
wirst sehen: All die kleinen Problemchen und Unklarheiten, die dich 
jetzt noch quälen lösen sich selbst in Wohlgefallen auf, weil du dann 
schon mit einem gewissen Grundwissen an dein Problem rangehst.

von Martin A. (stoepsel2k)


Lesenswert?

Vielen Dank, für deine große Hilfe, ich werde mir das zu gemüte führen.

Ich habe den großen Vorteil bereits .net programmiert zu haben, auch C 
ist mir nicht fremd, genau so wie PHP z.B. also dürfte das Programmieren 
so keine große HÜrde darstellen. Ich schau mir das heute nachmittag mal 
an und spiele ein wenig rum.

Hat jemand zufällig eine ANleitung, wie man die Ohm Zahl ließt auf einem 
Widerstand ?

von Frank L. (florenzen)


Lesenswert?


von Karl H. (kbuchegg)


Lesenswert?

Sebastian Ziegenbein schrieb:

> Hat jemand zufällig eine ANleitung, wie man die Ohm Zahl ließt auf einem
> Widerstand ?

Google.
Farbcode Widerstand.


In a Nutshell:

Der goldene oder silberne Ring kommt nach rechts (der ist meistens auch 
etwas abgesetzt)
Dann bei links beginnend die ersten 3 Ringe lesen. Jede Farbe steht für 
eine Zahl. Der 4te Ring steh für die Zehnerpotenz.

Die Farbcodes sind leicht zu merken:
Da ist zunächst der Regenbogen

   rot
   orange
   gelb
   grün
   blau
   violett

dann bleiben noch die 'unbunten' Farben (fast: braun ist keine unbunte 
Farbe). Die dunklen kommen nach vorne, die hellen nach hinten

   schwarz
   braun
   rot
   orange
   gelb
   grün
   blau
   violett
   grau
   weiß


jetzt noch durchnummerieren

0   schwarz
1   braun
2   rot
3   orange
4   gelb
5   grün
6   blau
7   violett
8   grau
9   weiß

und du hast die Zahlenwerte jeder Ringfarbe.

Hat dein Widerstand also die Ringe

   rot rot schwarz rot

dann ist das

   2 2 0 2

der 4.te ring ist die Zehnerpotenz. Daher

   2 2 0   mal 10 hoch 2

10 hoch 2 ist hundert

   220 * 100

oder 22000, oder 22kOhm

(oder einfacher: der 4.te Ring sagt dir wieviele 0-en noch angehängt 
werden müssen
   220 und dann noch 2 Nullen hinten drann)

Hat dein Widerstand nur 3 Farbringe, dann funktioniert es genau gleich: 
Der letzte Ring gibt immer an wieviele 0-en noch angehängt werden 
müssen.
Mit nur 3 Ringen, wäre ein 22k Widerstand

   rot rot orange

von Martin A. (stoepsel2k)


Lesenswert?

Hi nochmal :).

So, habe das jetzt mal so programmiert:
1
#include <avr/io.h>
2
#define F_CPU 8000000U
3
#include <util/delay.h>
4
5
int main (void){
6
7
  DDRD=0xFF;
8
  DDRC=0x00;  
9
10
  PORTC=0x00;
11
  PORTC |= (1<<PC7);
12
  while(1){
13
    
14
    if(PINC & (1<<7)){
15
      PORTD=0x00;
16
    }else{
17
      PORTD=0xFF;
18
    }
19
  
20
  }
21
  return 0;
22
}

Wenn ich durch den durchflussmesser puste flackert die LED ganz leicht 
:).

Der Durchflussmesser ist an PIN C7 dran. Vielleicht könnt ihr ja ein 
paar Tipps geben, wie ich das jetzt vielleicht verbessern kann in meinem 
code, was ich vielleicht falsch gemacht habe, oder was unnötig ist.

Danke :).

von Karl H. (kbuchegg)


Lesenswert?

Sebastian Ziegenbein schrieb:

> Wenn ich durch den durchflussmesser puste flackert die LED ganz leicht
> :).

Passt doch.
Dein Durchflussmesser gibt dir ja nicht nur an, dass etwas durchfliesst, 
sondern auch wieviel. Nach jeweils einer bestimmten Menge gibt es einen 
Puls.

Siehe Datenblatt

> Meßprinzip         Turbine
> Abtastsystem       Halleffekt, berührungslos
> Ausgangssignal     NPN open collector sinking Rechtecksignal
> Impulse / Liter    1000 Imp./ Liter

Aha. Wenn du also die Impulse zählst, und du 1000 Pulse abzählst, dann 
ist 1 Liter durchgeflossen.

von Martin A. (stoepsel2k)


Lesenswert?

Danke, ich hatte damals schon in einem anderen Projekt mir für 100 € ein 
blödes Zählwerk kaufen müssen, damit ich die Umdrehungen counten konnte. 
Hätte ich das gewusst, dass es auch mit einem so günstigen Gerät geht 
:).

Jetzt wäre natürlich noch was ganz anderes cool zu wissen, wie übertrage 
ich z.B. die Impulse als Zähle über USB auf den PC ? :).

von Karl H. (kbuchegg)


Lesenswert?

Sebastian Ziegenbein schrieb:

> Jetzt wäre natürlich noch was ganz anderes cool zu wissen, wie übertrage
> ich z.B. die Impulse als Zähle über USB auf den PC ? :).

USB schminkst du dir am besten gleich wieder für den Anfang ab. USB ist 
kompliziert.

Viel einfacher ist eine Übertragung per serieller Schnittstelle. Dazu 
findest du im Tutorial ein ganzes Kapitel.

(Es sagt allerdings auch niemand dass man nicht einen fertigen USB/RS232 
Wandler zwischen µC und PC schalten kann. Der erledigt dann den USB 
Teil)

von Martin A. (stoepsel2k)


Lesenswert?

Ja, USB habe ich schon gelesen ist freaky :).

Aber was mich an meiner while 1 stört ist. Die läuft ja viel schneller 
als 1000 Impulse z.B. nun hat die if abfrage wohl mehrfach den Wert 1 
bevor das rad ein zweites mal wirklich den impuls gib. Was wäre, wenn 
ich einen counter bauen will, der genau zählt, wie oft es zu diesem HIGH 
auf PIN7 gekommen ist ?

von Karl H. (kbuchegg)


Lesenswert?

Sebastian Ziegenbein schrieb:
> Ja, USB habe ich schon gelesen ist freaky :).
>
> Aber was mich an meiner while 1 stört ist. Die läuft ja viel schneller
> als 1000 Impulse

Macht ja nichts.

Wie würdest du (als Person) das machen wenn du (angenommen) so schnell 
sehen könntest.

Da ist eine Lampe, die brennt nicht
Du siehst hin, sie brennt
du siehst nochmal hin, sie brennt
beim nächsten Blick, sie brennt nicht
noch ein Blick, sie brennt nicht
wieder ein Blick, sie brennt nicht
noch ein Blick, sie brennt
wieder ein Blick, sie brennt nicht
wieder ein Blick, sie brennt nicht
noch ein Blick, sie brennt
noch ein Blick, sie brennt
wieder ein Blick, sie brennt nicht


Wie machst du das, das du zählst wie oft die Lampe eingeschaltet wurde?
Du wirst dich nicht daran orientieren ob sie brennt oder nicht. Sondern 
du ornetierst dich daran, ob sich ihr Zustand /verändert/ hat, seit du 
das letzte mal hingesehen hast.
1
Da ist eine Lampe, die brennt nicht       ------+
2
Du siehst hin, sie brennt                 ------+   Veränderung:  Eins
3
du siehst nochmal hin, sie brennt         keine Veränderung: Egal
4
beim nächsten Blick, sie brennt nicht     Veränderung: aber in die falsche Richtung, uninteressant
5
noch ein Blick, sie brennt nicht          nichts verändert
6
wieder ein Blick, sie brennt nicht        immer noch nicht --+
7
noch ein Blick, sie brennt                ----+ Ah Veränderung: zwei
8
wieder ein Blick, sie brennt nicht        zar eine Veränderung, aber uninteressant
9
wieder ein Blick, sie brennt nicht        nix
10
noch ein Blick, sie brennt                und wieder eine Veränderung: drei
11
noch ein Blick, sie brennt                egal
12
wieder ein Blick, sie brennt nicht        Veränderung, aber uninteressant

Die Lampe wurde 3 mal eingeschaltet.

Du wirst also im Programm eine Variable brauchen, in der du den letzten 
Zustand vermerkst. Und nur dann wenn sich der verändert (in deinem Fall 
zb von 1 auf 0) dann hast du einen vollständigen Puls
1
#include <avr/io.h>
2
#define F_CPU 8000000U
3
#include <util/delay.h>
4
5
int main (void)
6
{
7
  unsigned int count = 0;
8
  unsigned char vorher, jetzt;
9
10
  DDRD=0xFF;
11
  DDRC=0x00;  
12
13
  PORTC=0x00;
14
  PORTC |= (1<<PC7);
15
16
  vorher = ( PINC & (1<<7) );
17
18
  while(1){
19
    
20
    jetzt = ( PINC & (1<<7) );
21
22
    if( vorher != jetzt ) {     // eine Änderung!
23
24
      if( jetzt == 0 )          // fallende Flanke vom Puls
25
        count++;
26
      vorher = jetzt;
27
    }
28
  }
29
30
  return 0;
31
}

von Martin A. (stoepsel2k)


Lesenswert?

nur was für eine abweichung hat man dann bei den 1000 pulsen pro liter ?

von Valentin B. (nitnelav) Benutzerseite


Lesenswert?

Du solltest einen Timer benutzen, um die Abfrage zu machen.
Der Controller braucht ja auch noch Zeit für die Übertragung.
Ich weiß jetzt nicht wie schnell dein Gerät die 1000 Pulse pro Liter 
machen wird, aber wenn du eine Mindestwartezeit von einigen ms hast, ist 
es vielleicht zu langsam.

Der ATMEGA32 hat unter anderem auch einen 16-Bit-Timer mit Input 
Capture.
An diesen Pin hängst du deinen Sensor.
Dann benutzt du deine Hauptschleife, um das TCCR1 abzufragen, und zu 
gucken ob es 1000 ist.
Du sparst dir den ganzen Teil mit der Flankenerkennung.
Wie das geht steht im Datenblatt, im Grunde genommen ist es aber Modus 
auswählen (Da hilft die Tabelle) und in der Hauptschleife den Timer 
abfragen.

Sebastian Ziegenbein schrieb:
> .net programmiert

Damit habe ich auch angefangen und bin hier gelandet ;-)

Mit freundlichen Grüßen,
Valentin Buck

von Karl H. (kbuchegg)


Lesenswert?

Sebastian Ziegenbein schrieb:
> nur was für eine abweichung hat man dann bei den 1000 pulsen pro liter ?

Wieviel ist denn der 1000ste Teil eines Liters?

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.