Σάββατο, 30 Αυγούστου 2014

Microcontrollers and LEDs

The (somewhat lengthy) Introduction

Arduino is breeding a new generation of hackers! Those of you old enough to remember the 80s will probably have fond memories of programming a home computer of that era: the ZX Spectrum, the Commodore 64, the TI-99 and all the other wonderful machines that wouldn't do much unless you could use their BASIC language (or learn machine code!) Sure, you could get ready made programs and games on cassette(!) but there were many who would buy them just for the fun of programming. The hardware had a lot of limitations, sure, but the mere joy of squeezing every single bit of power from the machine was unsurpassed.

Computers have evolved a lot since then, but also lost a lot: the interactiveness of the first computer languages, the simplicity of programming, the single point of entry: you would start learning BASIC. What about now? Where does a beginner start programming? Sure, there are many choices, in both programming languages and operating systems. Most of them are free. But here is the problem: the choice is too big. If that is not enough, the changes are rapid and most people won't be able to follow the latest trend or hype: first it's C++, then it's Java, tomorrow is Python and so on. All very nice,  but where does a beginner start? Confusion...

There are other problems too: your first (simple) programs will not be very impressive by today's standards. They will probably be command line and text driven (mind you, I've written a book on learning programming by writting games in Python and Pygame but it's in Greek only for the moment I'm afraid. You can get a PDF copy of it here). People get bored quickly writing the same old computational programs in modern PCs full of colors, sounds and multimedia. Trust me, I teach these subjects. Programming is now mostly viewed like a chore (we are teaching it the wrong way).

Microcontrollers to the rescue! Actually, they share a lot more than you think with the home computers of the 80s.

  • They are "underpowered" (by todays CPU standards)
  • Their programming is simple and has immediate (and spectacular) results
  • They are actually made to be "actively hacked" rather than "passively used"
They also combine tinkering with both hardware and software,  making them suitable for both computing and electronic engineering hackers!

Most people that are comfortable with programming don't necessarily have adequate knowledge of electronics: some basic stuff is required even at the beginner level: how do you connect a LED to a microcontroller output? Let's see.

Connecting a LED to a Microcontroller Output

You have to keep the following things in mind:
  • Some microcontrollers have 5V outputs (arduino), others have 3.3V or less (MSP430)
  • Some microcontrollers can provide enough current (in other words, they have adequately low output resistance) to drive a LED directly (with a suitable resistor). Arduino can drive LEDs with no problems.
  • Other microcontrollers like MSP430 have limited output current capability. You might be able to drive a LED from them directly but at risk of damaging the MCU.
  • No LED can operate directly from an MCU output: you will need a to connect a resistor in series. Typical LEDs operate at low voltages, depending on their color. For example, red leds need about 1.5V. Fancier colors like blue and white need higher voltages.
Assuming you are using a microcontroller like Arduino, all you need to connect your LED to an output is a suitable current limiting resistor.

Connecting a LED to an Arduino

Connecting a LED to an arduino  is very simple, since the outputs of the MCU can source enough current by themselves. With the following facts in mind it is easy to calculate the resistor:
  • An "active" arduino output provides 5V
  • A typical red LED needs 1.5V
  • About 10mA through the LED are usually sufficient for a good brightness.
Our circuit looks like this:

 Calculating R1 is simple:

We know Vout is 5V, Vled is 1.5V and we need 10mA for the LED. Solving for R1:

 Feel free to adjust this a bit up or down to use a value actually available in the E12 series of resistors (either 330Ω or 390Ω will do). Use this same calculation for other LEDs, adjusting for current and LED color (voltage drop) accordingly.

Connecting a LED to an MSP430 (or other low power MCU)

Low power MCU cannot (and should not) drive LEDs directly. Instead, use the output from the MCU to switch on a transistor that carries the load:

Although we show a separate 5V supply for the LED, if you are using a TI launchpad board, you can source this directly from its 5V output pin.

We now have two resistors to calculate, R1 and R2.

Starting with R2, the equation for the output part of our circuit is:

We will be operating our transistor as a switch. In this configuration the transistor is used in two states: cut off (where no current flows) or fully on (saturation) where the transistor shows almost no resistance (the collector-emitter voltage is zero).

In an ideal transistor (which exists only in... an ideal world) the Vcesat would be zero, but in practice it will be around 0.2V.  We still need about 10 mA for the LED. Solving the above equation for R2 yields:

Conveniently, this is an E12 value as well :)
You may adjust a bit up or down if you have happen to not have the exact value.

Since we know the collector current wil be 10mA, we can easily calculate the base current and resistor R1. Assuming the transistor has b (hfe) 300:

The equation for the input:

Solving for R1:


69K is not a value of the E12 series but feel free to replace it with either 68K (little more current) or even 56K (if your transistor has a lower hfe).

In any case, you will only be drawing a minute and absolutely safe amount of current from the MCU output: around 30 μΑ!

Πόλωση Transistor


Σε αυτό το blog ευελπιστώ να ασχοληθώ κυρίως με αναλογικά ηλεκτρονικά: θα δείτε transistors και τελεστικούς ενισχυτές (opamps), φίλτρα, ταλαντωτές, ενισχυτές και άλλα κλασικά κυκλώματα. Αναπόφευκτα θα δείτε και κάποια ψηφιακά: το παιχνίδι με το Arduino και το MSP430 είναι ευχάριστο!
Θα προσπαθήσω τα κυκλώματα που δείχνω να είναι πρακτικά: υπάρχουν πάρα πολλά site με κυκλώματα "αρχής" τα οποία ενώ καλύπτουν το θεωρητικό μέρος στην πράξη απέχουν πολύ από το να λειτουργούν ικανοποιητικά (ενίοτε και καθόλου). Όλα τα κυκλώματα που θα δείχνουμε εδώ δοκιμάζονται σε breadboard και θα βλέπουμε και τη διαφορά μεταξύ θεωρίας και πράξης.
Θα βλέπουμε βέβαια όπου χρειάζεται και τις απαραίτητες πράξεις και μαθηματικές σχέσεις για τους υπολογισμούς. Κάποιες φορές θα δίνουμε και μικρά προγραμματάκια σε Python για να γίνονται οι υπολογισμοί μας ευκολότεροι.

Φυσιολογικά αυτό το blog θα έπρεπε να ξεκινήσει με ένα post για το 555. Το 555 ήταν το κύκλωμα που έβαλε τους περισσότερους από εμάς στα ηλεκτρονικά (flashing leds, anyone?) και διαπιστώνω ότι και σήμερα έχει πολλούς... οπαδούς. Για να σας καθησυχάσω, σίγουρα θα υπάρξουν και posts για το 555. Επιτρέψτε μου όμως για πρώτο post να τιμήσω το λογότυπο του site και να ασχοληθώ με
τον ακρογωνιαίο λίθο της σύγχρονης ηλεκτρονικής: το transistor.

Τι είναι η Πόλωση;

Η πόλωση (biasing) είναι ένα πολύ σημαντικό κομμάτι των αναλογικών ηλεκτρονικών και ειδικά όταν έχουμε να κάνουμε με διακριτά εξαρτήματα (όπως το αγαπημένο μας transistor). Μια αποτυχημένη πόλωση μπορεί να μας οδηγήσει σε ενισχυτές που παραμορφώνουν, ταλαντωτές που... ξεφεύγουν μόλις ζεσταθούν και  πολλά απογεύματα με δυσάρεστα προβλήματα (αντίθετα, η σχεδίαση αναλογικών κυκλωμάτων πρέπει να μας χαρίζει ευχάριστα απογεύματα!)

Η πόλωση είναι μια μέθοδος που χρησιμοποιούμε για να φέρουμε ένα κύκλωμα (και ειδικότερα κάποια ενεργά εξαρτήματα του όπως το transistor) σε μια προκαθορισμένη αρχική κατάσταση λειτουργίας. Για παράδειγμα στο κύκλωμα μας, ένα συγκεκριμένο ρεύμα συλλέκτη και τάση συλλέκτη-εκπομπού.
Ας πάρουμε για παράδειγμα ένα ενισχυτή κοινού εκπομπού. Θεωρώντας ότι μόλις έχουμε ενεργοποιήσει το κύκλωμα και δεν υπάρχει τίποτα συνδεδεμένο στην είσοδο, ποιο είναι το ιδανικό σημείο λειτουργίας του transistor; Καταρχήν, τι εννοούμε με το σημείο λειτουργίας;

Το μοναδικό ενεργό στοιχείο στο κύκλωμα μας, το transistor Q1, με την ενεργοποίηση του κυκλώματος διαρρέεται από ένα ρεύμα συλλέκτη στην έξοδο του και ένα ρεύμα βάσης στην είσοδο. (Φυσικά το ρεύμα εκπομπού είναι το άθροισμα των δυο παραπάνω, αλλά μπορούμε να το θεωρήσουμε ίσο με το ρεύμα συλλέκτη καθώς το ρεύμα βάσης είναι πολύ μικρό. Τα ρεύματα αυτά φαίνονται παρακάτω:

Το ρεύμα βάσης είναι αυτό που καθορίζει το ρεύμα συλλέκτη με τη γνωστή σχέση:

Χωρίς σήμα στην είσοδο του, θέλουμε το transistor να έχει στα άκρα του την μισή τάση τροφοδοσίας, στην περίπτωση μας 4.5V. Αυτό θα επιτρέψει στον ενισχυτή μας να δίνει τη μέγιστη δυνατή έξοδο: βρίσκεται στη μέση της ευθείας φόρτου και με την είσοδο του σήματος έχει τον ίδιο χώρο να κινηθεί τόσο προς τα 0V όσο και προς τα 9V:

Η ευθεία φόρτου μπορεί να χαραχθεί εύκολα αν σκεφτούμε τα δύο άκρα της: Όταν το τρανζίστορ είναι εντελώς κλειστό (αποκοπή), η τάση Vce είναι ίση με την τάση τροφοδοσίας. Όταν είναι εντελώς ανοιχτό (κόρος) η τάση Vce είναι μηδέν (θεωρητικά, πρακτικά θα είναι γύρω στα 0.2V) και το ρεύμα περιορίζεται μόνο από τις δύο αντιστάσεις (συλλέκτη και εκπομπού).

Βλέποντας το κομμάτι της εξόδου, μπορούμε εύκολα να γράψουμε τη σχέση:

Και μια που το ρεύμα βάσης είναι εξαιρετικά μικρό, μπορούμε να την απλουστεύσουμε ακόμα περισσότερο θεωρώντας ότι το ρεύμα συλλέκτη είναι ίδιο με το ρεύμα εκπομπού:

Λύνοντας αυτή τη σχέση ως προς το ρεύμα συλλέκτη:

Αντικαθιστώντας τις τιμές του κυκλώματος και για Vce = 4.5V, θα βρούμε:

Αυτό είναι και το επιθυμητό σημείο ηρεμίας για το transistor του ενισχυτή μας: αντιστοιχεί στο λεγόμενο midpoint biasing, στην πόλωση δηλαδή που μας φέρνει ακριβώς στη μέση της ευθείας φόρτου.

Για την πόλωση μπορούμε να χρησιμοποιήσουμε διάφορες μεθόδους: Μια αντίσταση από Vcc προς τη βάση, διαιρέτη τάσης κ.α. Συνήθως η προτιμότερη μέθοδος είναι ο διαιρέτης τάσης. Τι τάση όμως χρειαζόμαστε;

Μπορούμε αρχικά να υπολογίσουμε το ρεύμα βάσης σύμφωνα με το ρεύμα συλλέκτη που υπολογίσαμε. Με μια ματιά στο datasheet του BC547B βλέπουμε ότι ο συντελεστής β (hfe) έχει τιμές από 200-450.  Μπορούμε βέβαια να μετρήσουμε το transistor, αλλά κάτι τέτοιο συνήθως δεν είναι πρακτικό. Θα κάνουμε τους υπολογισμούς μας με ένα μέσο όρο γύρω στο 300.

Στο διαιρέτη τάσης, θέλουμε το ρεύμα που θα διαρρέει την αντίσταση R2 να είναι τουλάχιστον 10πλάσιο του ρεύματος βάσης που υπολογίσαμε. Για να βρούμε την τάση που χρειαζόμαστε στη βάση (και άρα στην R2) μπορούμε απλά να παρατηρήσουμε το κύκλωμα εισόδου: η τάση θα πρέπει να είναι τόση ώστε να υπερνικήσει τη Vbe (τυπικά γύρω στα 0.7V) και την αντίσταση Re που διαρρέεται από το ρεύμα εκπομπού. Άρα:

Η αντίσταση R2 θα διαρρέεται από το 10πλάσιο του ρεύματος βάσης που υπολογίσαμε, άρα:

Φυσικά, για το διαιρέτη τάσης ισχύει η γνωστή μας σχέση:

οπότε γνωρίζοντας την R2, μπορούμε εύκολα να υπολογίσουμε την R1:

Και αντικαθιστώντας τις τιμές:

Μπορούμε να επιλέξουμε τις κοντινότερες τιμές από τη σειρά Ε12 αντιστάσεων: 22kΩ και 68kΩ.
Όσο αφορά την πόλωση το κύκλωμα μας έχει ολοκληρωθεί. Μη βιάζεστε όμως να πανηγυρίσετε!

Παρατηρήσεις και Παγίδες

Αν σας δημιουργήθηκε η εντύπωση ότι το ρεύμα βάσης που υπολογίσαμε δεν είχε μεγάλη σημασία στους υπολογισμούς μας, δεν έχετε άδικο. Σκεφτείτε ότι πρακτικά το χρησιμοποιήσαμε (το 10πλάσιο) για να υπολογίσουμε την τιμή της R2. Έτσι απλά εξασφαλίζουμε ότι ο διαιρέτης τάσης που χρησιμοποιούμε είναι σχεδόν αφόρτιστος (Η τάση που υπολογίζουμε θεωρητικά σε ένα διαιρέτη τάσης ισχύει όσο δεν τραβάμε ρεύμα από αυτόν. Όταν ο διαιρέτης τάσης φορτίζεται, η τάση μειώνεται. Υπολογίζοντας τον για το 10πλάσιο ρεύμα εξασφαλίζουμε ότι θα λειτουργεί πρακτικά αφόρτιστος).  Ωστόσο το κύκλωμα μας θα λειτουργούσε και με 8πλάσιο ή 12πλάσιο ρεύμα. Γιατί όμως συμβαίνει αυτό;

Παρατηρήσατε πιθανόν ότι η αντίσταση Re συμμετέχει τόσο στο κύκλωμα εισόδου όσο και στο κύκλωμα εξόδου. Προσέξτε τώρα τι θα γίνει αν αντικαταστήσουμε το transistor με ένα άλλο, έστω μεγαλύτερου β από αυτό που χρησιμοποιήσαμε στους υπολογισμούς μας.

Ο διαιρέτης τάσης θα εξακολουθεί να δίνει την ίδια τάση στη βάση. Όμως τώρα το ρεύμα βάσης θα προκαλέσει ένα μεγαλύτερο ρεύμα συλλέκτη λόγω του μεγαλύτερου β. Το μεγαλύτερο ρεύμα συλλέκτη (και άρα εκπομπού) θα προκαλέσει μεγαλύτερη πτώση τάσης στην αντίσταση Re. Όμως η τάση αυτή αντιτίθεται στην τάση πόλωσης που εφαρμόζουμε στην είσοδο και άρα το ρεύμα βάσης θα μειωθεί, μειώνοντας αντίστοιχα ξανά και το ρεύμα συλλέκτη.

Με μια φράση: η πόλωση στο κύκλωμα μας αυτορυθμίζεται! Αυτό είναι αποτέλεσμα της αντίστασης Re. Φυσικά αν η Re δεν υπάρχει ή η τιμή της είναι ιδιαίτερα χαμηλή δεν θα έχουμε αυτή την αυτορύθμιση. Η Re ουσιαστικά προκαλεί αρνητική ανάδραση στο κύκλωμα μας.

Δεδομένου ότι το κύκλωμα μας είναι ένας ενισχυτής κοινού εκπομπού, η αρνητική ανάδραση από την Re έχει επίδραση και στο κέρδος του. Αν αυτό δεν είναι επιθυμητό, θα πρέπει να χρησιμοποιήσουμε ένα πυκνωτή bypass ώστε η Re να μην επιδρά στο AC σήμα του ενισχυτή:

Η αρνητική ανάδραση μειώνει το κέρδος του ενισχυτή και πρακτικά το κάνει ανεξάρτητο από το β του transistor:

Ο ενισχυτής μας έχει κέρδος τάσης 1000/470= 2.12, πάρα πολύ μικρότερο από ένα αντίστοιχο χωρίς Re. Σε κάποιες περιπτώσεις το χαμηλό κέρδος μπορεί να είναι πρόβλημα. Πως μπορούμε να το αυξήσουμε (χωρίς να καταφύγουμε στη λύση του πυκνωτή bypass);

Από τον προηγούμενο τύπο είναι εμφανές ότι μπορούμε είτε να αυξήσουμε την Rc είτε να μειώσουμε την Re (είτε και τα δύο!). Προσέξτε όμως: Αν μειώσετε ιδιαίτερα την Re μειώνεται αντίστοιχα και η αυτορύθμιση της πόλωσης. Αν αυξήσετε την Rc θα μειώσετε το ρεύμα Ic στο σημείο ηρεμίας. Για παράδειγμα με Rc=4.7kΩ, το ρεύμα συλλέκτη στο σημείο ηρεμίας θα είναι λιγότερο από 1 mA. Με τόσο λίγο ρεύμα κινδυνεύετε να λειτουργήσετε το transistor σε μη γραμμική περιοχή με παραμορφώσεις κλπ. (Εννοείται φυσικά ότι οι αντιστάσεις αυτές επιδρούν και σε άλλα χαρακτηριστικά του ενισχυτή π.χ. αντίσταση εξόδου)

Αν θέλετε λοιπόν περισσότερο κέρδος, κρατήστε την ανάδραση σας και δημιουργήστε ένα ενισχυτή με περισσότερα στάδια:

Το συνδυασμένο κέρδος τάσης των δύο σταδίων στο παραπάνω σχέδιο είναι περίπου 6.

Στην Πράξη

Υλοποιώντας το κύκλωμα μας σε μια breadboard με βάση τις τιμές που υπολογίσαμε, μετρήσαμε τα παρακάτω:

Μια πρόχειρη μέτρηση του β του BC547B έδειξε περίπου 300. Έπειτα το αντικαταστήσαμε με ένα BC550C με β γύρω στο 450, και οι νέες μας μετρήσεις ήταν:

Είναι εμφανές ότι η σταθεροποίηση της πόλωσης μας λειτουργεί αρκετά καλά.
Και μια που φτιάξαμε ένα ενισχυτή, μπήκαμε στον πειρασμό να τον τροφοδοτήσουμε και με σήμα για να δούμε πως τα πάει:

Θα επανέλθουμε όμως στους ενισχυτές σε μελλοντικά μας posts. Προς το παρόν σας ευχόμαστε πολλά ευχάριστα και δημιουργικά ηλεκτρονικά απογεύματα!