Dealing with Analog Signals A Microcontroller View Jonathan Hui University of California, Berkeley 2008 EECS194-5 1 An Analog World • Everything in the physical world is an analog signal – Sound, light, temperature, gravitational force • Need to convert into electrical signals – Transducers: converts one type of energy to another • Electro-mechanical, Photonic, Electrical, … – Examples • Microphone/speaker • Thermocouples • Accelerometers 2008 EECS194-5 2 An Analog World • Transducers – Allow us to convert physical phenomena to a voltage potential in a well-defined way. 2008 EECS194-5 3 Going From Analog to Digital • What we want Physical Phenomena Engineering Units • How we have to get there Physical Phenomena Voltage Sensor 2008 Engineering Units ADC Counts ADC EECS194-5 Software 4 Sampling Basics • How do we represent an analog signal? – As a time series of discrete values On the MCU: read the ADC data register periodically f (x ) V Counts f sampled (x ) t 2008 EECS194-5 TS 5 Sampling Basics • What do the sample values represent? – Some fraction within the range of values What range to use? Vr Vr Vr Vr Range Too Small t Range Too Big t Vr Vr Ideal Range 2008 EECS194-5 t 6 Sampling Basics • Resolution – Number of discrete values that represent a range of analog values – MSP430: 12-bit ADC • 4096 values • Range / 4096 = Step Larger range less information • Quantization Error – How far off discrete value is from actual – ½ LSB Range / 8192 Larger range larger error 2008 EECS194-5 7 Sampling Basics • Converting: ADC counts Voltage Vr Vin N ADC 4095 N ADC Vin VR VR VR Vin N ADC Vr t VR VR 4095 • Converting: Voltage Engineering Units VTEMP 0.00355(TEMP C ) 0.986 TEMP C 2008 VTEMP 0.986 0.00355 EECS194-5 8 Sampling Basics • Converting values in 16-bit MCUs VTEMP N ADC VR VR 4095 TEMP C VTEMP 0.986 0.00355 vtemp = adccount/4095 * 1.5; tempc = (vtemp-0.986)/0.00355; tempc = 0 • Fixed point operations – Need to worry about underflow and overflow • Floating point operations – They can be costly on the node 2008 EECS194-5 9 Sampling Basics • What sample rate do we need? – Too little: we can’t reconstruct the signal we care about – Too much: waste computation, energy, resources • Example: – 2-bytes per sample, 4 kHz 8 kB / second – But the mote only has 10 kB of RAM… f (x ) f sampled (x ) 2008 EECS194-5 t 10 Shannon-Nyquist Sampling Theorem • If a continuous-time signal f (x ) contains no frequencies higher than f max , it can be completely determined by discrete samples taken at a rate: f samples 2 f max • Example: – Humans can process audio signals 20 Hz – 20 KHz – Audio CDs: sampled at 44.1 KHz 2008 EECS194-5 11 Sampling Basics • Aliasing – Different frequencies are indistinguishable when they are sampled. • Condition the input signal using a low-pass filter – Removes high-frequency components – (a.k.a. anti-aliasing filter) 2008 EECS194-5 12 Sampling Basics • Dithering – Quantization errors can result in large-scale patterns that don’t accurately describe the analog signal – Introduce random (white) noise to randomize the quantization error. 2008 Direct Samples EECS194-5 Dithered Samples 13 Analog-to-Digital Basics • So, how do you convert analog signals to a discrete values? • A software view: 1. Set some control registers : • • • 2. 3. 4. 5. 2008 Specify where the input is coming from (which pin) Specify the range (min and max) Specify characteristics of the input signal (settling time) Enable interrupt and set a bit to start a conversion When interrupt occurs, read sample from data register Wait for a sample period Repeat step 1 EECS194-5 14 Block Diagram (MSP430) 2008 EECS194-5 15 ADC Features 2008 Texas Instruments MSP430 Atmel ATmega 1281 Resolution 12 bits 10 bits Sample Rate 200 ksps 76.9 ksps Internally Generated 1.5V, 2.5V, Vcc Reference Voltage 1.1V, 2.56V Single-Ended Inputs 12 16 Differential Inputs 0 14 (4 with gain amp) Left Justified Option No Yes Conversion Modes Single, Sequence, Repeated Single, Repeated Sequence Single, Free Running Data Buffer 16 samples 1 sample EECS194-5 16 ADC Core • Input – Analog signal • Output – 12-bit digital value of input relative to voltage references VR Vin VR • Linear conversion N ADC 4095 Vin VR VR VR Vin N ADC 2008 EECS194-5 VR VR 4095 17 SAR ADC • SAR = Successive-Approximation-Register – Binary search to find closest digital value 2008 EECS194-5 18 SAR ADC • SAR = Successive-Approximation-Register – Binary search to find closest digital value 1 Sample Multiple cycles 2008 EECS194-5 19 SAR ADC 1 Sample Multiple cycles 2008 EECS194-5 20 Sample and Conversion Timing • Timing driven by: – – – • • 2008 EECS194-5 TimerA TimerB Manually using ADC12SC bit Signal selection using SHSx Polarity selection using ISSH 21 Voltage Reference Internal External Vref+ 1.5V, 2.5V, Vcc VeRef+ Vref- AVss VeRef- • Voltage Reference Generator – – – – 2008 1.5V or 2.5V REFON bit in ADCCTL0 Consumes energy when on 17ms settling time • External references allow arbitrary reference voltage • Want to sample Vcc, what Vref to use? EECS194-5 22 Sample Timing Considerations • Port 6 inputs default to high impedance • When sample starts, input is enabled – But capacitance causes a low-pass filter effect Must wait for the input signal to converge t sample ( RS 2kΩ) 9.011 40pF 800ns 2008 EECS194-5 23 Software Configuration • How it looks in code: ADC12CTL0 = SHT0_2 | REF1_5V | REFON | ADC12ON; ADC12CTL1 = SHP; 2008 EECS194-5 24 Inputs and Multiplexer • 12 possible inputs – – – – – • External pins may function as Digital I/O or ADC. – • 2008 EECS194-5 8 external pins (Port 6) 1 Vref+ (external) 1 Vref- (external) 1 Thermistor 1 Voltage supply P6SEL register Is this a multiplexor as you saw in CS150? 25 Conversion Memory • 16 sample buffer • Each buffer configures sample parameters – – – • 2008 EECS194-5 Voltage reference Input channel End-of-sequence CSTARTADDx indicates where to write next sample 26 Conversion Modes • Single-Channel Single-Conversion – – • Sequence-of-Channels – – • – – EECS194-5 Single channel sampled and converted continuously New sample occurs with each trigger (ADC12SC, TimerA, TimerB) Repeat-Sequence-of-Channels – 2008 Sequence of channels sampled and converted once Stops when reaching ADC12MCTLx with EOS bit Repeat-Single-Channel – • Single channel sampled and converted once Must set ENC (Enable Conversion) bit each time Sequence of channels sampled and converted repeatedly Sequence re-starts when reaching ADC12MCTLx with EOS bit 27 Software Configuration • How it looks in code: • Configuration ADC12CTL0 = SHT0_2 | REF1_5V | REFON | ADC12ON; ADC12CTL1 = SHP; ADC12MCTL0 = EOS | SREF_1 | INCH_11; • Reading ADC data m_reading = ADC12MEM0; 2008 EECS194-5 28 A Software Perspective command void Read.read() { ADC12CTL0 = SHT0_2 | REF1_5V | REFON | ADC12ON; ADC12CTL1 = SHP; ADC12MCTL0 = EOS | SREF_1 | INCH_11; call Timer.startOneShot( 17 ); } event void Timer.fired() { ADC12CTL0 |= ENC; ADC12IE = 1; ADC12CTL0 |= ADC12SC; } task void signalReadDone() { signal Read.readDone( SUCCESS, m_reading ); } async event void HplSignalAdc12.fired() { ADC12CTL0 &= ~ENC; ADC12CTL0 = 0; ADC12IE = 0; ADC12IFG = 0; m_reading = ADC12MEM0; post signalReadDone(); } 2008 EECS194-5 29 A Software Perspective command void Read.read() { ADC12CTL0 = SHT0_2 | REF1_5V | REFON | ADC12ON; ADC12CTL1 = SHP; ADC12MCTL0 = EOS | SREF_1 | INCH_11; call Timer.startOneShot( 17 ); } event void Timer.fired() { ADC12CTL0 |= ENC; ADC12IE = 1; ADC12CTL0 |= ADC12SC; } task void signalReadDone() { signal Read.readDone( SUCCESS, m_reading ); } async event void HplSignalAdc12.fired() { ADC12CTL0 &= ~ENC; ADC12CTL0 = 0; ADC12IE = 0; ADC12IFG = 0; m_reading = ADC12MEM0; post signalReadDone(); } 2008 EECS194-5 30 A Software Perspective command void Read.read() { ADC12CTL0 = SHT0_2 | REF1_5V | REFON | ADC12ON; ADC12CTL1 = SHP; ADC12MCTL0 = EOS | SREF_1 | INCH_11; call Timer.startOneShot( 17 ); } event void Timer.fired() { ADC12CTL0 |= ENC; ADC12IE = 1; ADC12CTL0 |= ADC12SC; } task void signalReadDone() { signal Read.readDone( SUCCESS, m_reading ); } async event void HplSignalAdc12.fired() { ADC12CTL0 &= ~ENC; ADC12CTL0 = 0; ADC12IE = 0; ADC12IFG = 0; m_reading = ADC12MEM0; post signalReadDone(); } 2008 EECS194-5 31 A Software Perspective command void Read.read() { ADC12CTL0 = SHT0_2 | REF1_5V | REFON | ADC12ON; ADC12CTL1 = SHP; ADC12MCTL0 = EOS | SREF_1 | INCH_11; call Timer.startOneShot( 17 ); } event void Timer.fired() { ADC12CTL0 |= ENC; ADC12IE = 1; ADC12CTL0 |= ADC12SC; } task void signalReadDone() { signal Read.readDone( SUCCESS, m_reading ); } async event void HplSignalAdc12.fired() { ADC12CTL0 &= ~ENC; ADC12CTL0 = 0; ADC12IE = 0; ADC12IFG = 0; m_reading = ADC12MEM0; post signalReadDone(); } 2008 EECS194-5 32 A Software Perspective command void Read.read() { ADC12CTL0 = SHT0_2 | REF1_5V | REFON | ADC12ON; ADC12CTL1 = SHP; ADC12MCTL0 = EOS | SREF_1 | INCH_11; call Timer.startOneShot( 17 ); } event void Timer.fired() { ADC12CTL0 |= ENC; ADC12IE = 1; ADC12CTL0 |= ADC12SC; } task void signalReadDone() { signal Read.readDone( SUCCESS, m_reading ); } async event void HplSignalAdc12.fired() { ADC12CTL0 &= ~ENC; ADC12CTL0 = 0; ADC12IE = 0; ADC12IFG = 0; m_reading = ADC12MEM0; post signalReadDone(); } 2008 EECS194-5 33 Interrupts and Tasks Application Kernel Driver command void Read.read() { ADC12CTL0 = SHT0_2 | REF1_5V | REFON | ADC12ON; ADC12CTL1 = SHP; ADC12MCTL0 = EOS | SREF_1 | INCH_11; call Timer.startOneShot( 17 ); } event void Timer.fired() { ADC12CTL0 |= ENC; ADC12IE = 1; ADC12CTL0 |= ADC12SC; } task void signalReadDone() { signal Read.readDone( SUCCESS, m_reading ); } MCU 2008 ADC async event void HplSignalAdc12.fired() { ADC12CTL0 &= ~ENC; ADC12CTL0 = 0; ADC12IE = 0; ADC12IFG = 0; m_reading = ADC12MEM0; post signalReadDone(); } EECS194-5 34 Interrupts and Tasks • Tasks are run-to-completion – Used to signal application events – Break up computation in the application • Interrupts – Generated by the hardware – Preempt execution of tasks • Interrupts and tasks can schedule new tasks Task Task Task Handler Interrupt 2008 Hardware EECS194-5 35