Top Banner
Chapter 11 Chapter 11 It’s an Analog World It’s an Analog World Learning to use the Analog to Digital Converter
9

Chapter 11 It’s an Analog World Learning to use the Analog to Digital Converter.

Dec 17, 2015

Download

Documents

Bryce Harper
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Chapter 11 It’s an Analog World Learning to use the Analog to Digital Converter.

Chapter 11 Chapter 11 It’s an Analog WorldIt’s an Analog World

Learning to use the Analog to Digital Converter

Page 2: Chapter 11 It’s an Analog World Learning to use the Analog to Digital Converter.

Di Jasio - Programming 32-bit Microcontrollers in C

Analog to Digital ConverterAnalog to Digital Converter

Page 3: Chapter 11 It’s an Analog World Learning to use the Analog to Digital Converter.

Di Jasio - Programming 32-bit Microcontrollers in C

Reading a PotentiometerReading a Potentiometer

Page 4: Chapter 11 It’s an Analog World Learning to use the Analog to Digital Converter.

Di Jasio - Programming 32-bit Microcontrollers in C

First ConversionFirst Conversion

int readADC( int ch){ AD1CHSbits.CH0SA = ch; // 1. select analog input AD1CON1bits.SAMP = 1; // 2. start sampling T1CON = 0x8000; TMR1 = 0; // 3. wait for sampling time while (TMR1 < 100); // AD1CON1bits.SAMP = 0; // 4. start the conversion while (!AD1CON1bits.DONE); // 5. wait conversion complete return ADC1BUF0; // 6. read result} // readADC

Page 5: Chapter 11 It’s an Analog World Learning to use the Analog to Digital Converter.

Di Jasio - Programming 32-bit Microcontrollers in C

Automating Sample TimingAutomating Sample Timing

void initADC( int amask) { AD1PCFG = amask; // select analog input pins AD1CON1 = 0x00E0; // automatic conversion after sampling AD1CSSL = 0; // no scanning required AD1CON2 = 0; // use MUXA, use AVdd & AVss as Vref+/- AD1CON3 = 0x1F3F; // Tsamp = 32 x Tad; AD1CON1bits.ADON = 1; // turn on the ADC} //initADC int readADC( int ch){ AD1CHSbits.CH0SA = ch; // 1. select input channel AD1CON1bits.SAMP = 1; // 2. start sampling while (!AD1CON1bits.DONE); // 3. wait conversion complete return ADC1BUF0; // 4. read conversion result} // readADC

Page 6: Chapter 11 It’s an Analog World Learning to use the Analog to Digital Converter.

Di Jasio - Programming 32-bit Microcontrollers in C

First Example: Pot-ManFirst Example: Pot-Man/*** Pot-Man.c** */// configuration bit settings, Fcy=72MHz, Fpb=36MHz#pragma config POSCMOD=XT, FNOSC=PRIPLL #pragma config FPLLIDIV=DIV_2, FPLLMUL=MUL_18,#pragma config FPLLODIV=DIV_1#pragma config FPBDIV=DIV_2, FWDTEN=OFF, CP=OFF, BWP=OFF #include <p32xxxx.h>#include <explore.h>#include <LCD.h>#include <ADC.h> main (){ int a, r, p, n; // 1. initializations initLCD(); initADC( AINPUTS); // 2. use the first reading to randomize srand( readADC( POT)); // 3. init the hungry Pac p = '<'; // 4. generate the first random food bit position r = rand() % 16;

// main loop while( 1) { // 5. select the POT input and convert a = readADC( POT);   // 6. reduce the 10-bit result to a 4 bit value (0..15) // (divide by 64 or shift right 6 times a >>= 6; // 7. turn the Pac in the direction of movement if ( a < n) // moving to the left p = '>'; if ( a > n) // moving to the right p = '<';   // 8. when the Pac eats the food, generate more food while (a == r ) r = rand() % 16; // 9. update display clrLCD(); setLCDC( a); putLCD( p); setLCDC( r); putLCD( '*');  // 10. provide timing and relative position Delayms( 200); // limit game speed n = a; // memorize previous position } // main loop} // main

Page 7: Chapter 11 It’s an Analog World Learning to use the Analog to Digital Converter.

Di Jasio - Programming 32-bit Microcontrollers in C

Sensing TemperatureSensing Temperature

TC1047 Output Voltage vs. Temperature characteristics Temperature Sensor connection on Explorer16 board (DS51589)

Page 8: Chapter 11 It’s an Analog World Learning to use the Analog to Digital Converter.

Di Jasio - Programming 32-bit Microcontrollers in C

Reading TemperatureReading Temperature

Averaged temperature reading procedure:

a = 0; for( j=0; j <10; j++) a += readADC( TSENS); // add up 10 readings i = a / 10; // divide by 10 to average

Resolving the temperature/voltage equation for T:

T = (Vout - 500 mV) / 10 mV/CWhere Vout = ADC reading * ADC resolution (3.3 mV/bit)

T = (( i * 3.3) - 500) / 10;

Page 9: Chapter 11 It’s an Analog World Learning to use the Analog to Digital Converter.

Di Jasio - Programming 32-bit Microcontrollers in C

Second Example: Temp-ManSecond Example: Temp-Manmain (){ int a, i, j, n, r, p; // 1. initializations initADC( AINPUTS); // initialize the ADC initLCD(); // 2. use the first reading to randomize srand( readADC( TSENS)); // generate the first random position r = rand() % 16; p = '<'; // 3. compute initial average value a = 0; for ( j=0; j<10; j++) { a += readADC( TSENS); // read temp Delayms( 100); } i = a / 10; // average  

// main loop while( 1) { // 4. take the average value over 1 second a = 0; for ( j=0; j<10; j++) { a += readADC( TSENS); // read the temperature Delayms( 100); } a /= 10; // average result // 5. compare initial reading, move the Pac a = 7 + (a - i); // 6. keep the result in the value range 0..15 if ( a > 15) a = 15; if ( a < 0) a = 0;  // 7. turn the Pac in the direction of movement if ( a < n) // moving to the left p = '>'; if ( a > n) // moving to the right p = '<'; // 8. as soon as the Pac eats the food, generate new while (a == r ) r = rand() % 16;  // 9. update display clrLCD(); setLCDC( r); putLCD( '*'); setLCDC( a); putLCD( p); // 10. remember previous postion n = a;  } // main loop} // main