6
 ADC12 and DAC12 Modules by Alex Milenkovich, milenkovic@computer.org Objective: This tutorial discusses the use of MSP430’s ADC12 and DAC12 peripheral devices.  Note: Required are all previous tutorials. 1. On-Chip Temperature Sensor Let us consider a C a pplication shown in Figure 1 that samples the on-chip temperature sensor, converts the sampled voltage from the sensor to temperature in degrees Celsius and Fahrenheit, and sends the temperature sensor through a RS232 link to the Hype r-terminal application. Note: The source code for this program can be downloaded from the course secure directory (file temp_uart.c). Analyze the program and test it on the EasyWeb2 platform. Answer the following questions. What does the program do? How the basic block module is configured? How the ADC12 module is configured? How the USART0 module is configured? / / Descri pt i on: f M C LK = f ACLK = 8MHz / / / / M SP43 0F14 9 // ----------------- // /|\| XI N| - / / | | | XTAL ( 8M hz) / / - - | R ST XO U T|- // | | / / | P2. 1| - - >LED / / / / @ A. M i l en kov i c, m i l en kov i c@ com pu t er. org / / / / ****************************************************************************** # i ncl ude "m sp43 0x1 4x. h" # i ncl ude "st di o. h" unsigned char thr _cha r; / * hol d char f r omUAR T RX*/ unsi gned char rx_f l ag; / * recei ver rx status f l ag */ cha r gm 1[ 67 ] = "Hel l o! I aman M SP 430. W ou l d yo u l i ke t o know m y t em pe rat ure? ( Y| N ) "; char gm2[9] = "Bye, by e!" ; char gm 3[15] = "Type i n Y o r N! " ; l on g i nt t em p; l ong i nt I nt DegF; l ong i nt I nt DegC; char N ew Ke y[ 25 ] ; / / i ni t i ali ze basic clock module voi d I ni tOs c( voi d) ; / / U AR T Ini ti al i zai on voi d U AR T_I ni ti al i ze( voi d) ; / / send char f uncti on voi d UART0 _put char(char c) ;

lab8

Embed Size (px)

DESCRIPTION

của Lê Đức Nhân

Citation preview

Page 1: lab8

7/17/2019 lab8

http://slidepdf.com/reader/full/lab8563db921550346aa9a9a50fe 1/6

 ADC12 and DAC12 Modules

by Alex Milenkovich, [email protected]

Objective: This tutorial discusses the use of MSP430’s ADC12 and DAC12 peripheral devices.

 Note: Required are all previous tutorials.

1.  On-Chip Temperature Sensor

Let us consider a C application shown in Figure 1 that samples the on-chip temperature sensor,

converts the sampled voltage from the sensor to temperature in degrees Celsius and Fahrenheit,

and sends the temperature sensor through a RS232 link to the Hyper-terminal application. Note:The source code for this program can be downloaded from the course secure directory (file

temp_uart.c).

Analyze the program and test it on the EasyWeb2 platform. Answer the following questions.

What does the program do?

How the basic block module is configured?How the ADC12 module is configured?

How the USART0 module is configured?

/ / Descri pt i on: f MCLK = f ACLK = 8MHz/ // / MSP430F149/ / - - - - - - - - - - - - - - - - -/ / / | \ | XI N| -/ / | | | XTAL ( 8Mhz)

/ / - - | RST XOUT|-/ / | |/ / | P2. 1| - - >LED/ // / @A. Mi l enkovi c, mi l enkovi c@comput er. org/ // / ******************************************************************************

#i ncl ude "msp430x14x. h"#i ncl ude "st di o. h"

unsi gned char t hr _char ; / * hol d char f r omUART RX*/unsi gned char rx_f l ag; / * r ecei ver rx status f l ag */char gm1[ 67] = "Hel l o! I am an MSP430. Woul d you l i ke to know my t emper ature? ( Y| N) ";char gm2[ 9] = "Bye, bye!" ;char gm3[ 15] = "Type i n Y or N! " ;

l ong i nt t emp;l ong i nt I nt DegF;l ong i nt I nt DegC;

char NewKey[ 25] ;

/ / i ni t i al i ze bas i c cl ock modul evoi d I ni tOsc( voi d) ;/ / UART I ni t i al i zai onvoi d UART_I ni t i al i ze( voi d) ;/ / send char f uncti onvoi d UART0_put char ( char c) ;

Page 2: lab8

7/17/2019 lab8

http://slidepdf.com/reader/full/lab8563db921550346aa9a9a50fe 2/6

 voi d mai n( voi d){

i nt i = 0;

WDTCTL = WDTPW + WDTHOLD; / / St op wat chdog t i mer

I ni tOsc( ) ;

UART_ I ni t i al i ze( ) ;

ADC12CTL0 = SHT0_8 + REFON + ADC12ON;ADC12CTL1 = SHP; / / enabl e sampl e t i merADC12MCTL0 = 0x01A;ADC12I E = 0x001;

rx_f l ag = 0; / / rx def aul t state "empt y" _EI NT( ) ; / / enabl e gl obal i nt er r upts

/ / send gr eet i ng messagesf or ( i = 0; i < 67; i ++) {

t hr_char = gm1[ i ] ;UART0_put char( t hr_char ) ;

}

Wai t :

whi l e( ! ( r x_fl ag&0x01) ) ; / / wai t unt i l r ecei ve t he char act er f r omHyperTer mi nalrx_f l ag = 0; / / c l ear rx_f l agUART0_put char( t hr _char ) ;UART0_put char ( ' \ n' ) ; / / newl i neUART0_put char( ' \ r ' ) ; / / car ri age return/ / echo t o HyperTermi nal t wi cei f ( ( t hr_char ! = ' y' ) && ( t hr_char ! = ' n' ) && ( t hr_char ! =' Y' ) && ( t hr_char ! =' N' ) ) {

/ / UART0_put char ( t hr _char) ;f or ( i = 0; i < 15; i ++) {

t hr_char = gm3[ i ] ;UART0_put char( t hr _char ) ;

}UART0_put char( ' \ n' ) ; / / newl i neUART0_put char( ' \ r ' ) ; / / carr i age r et urngot o Wai t ;

}i f ( ( t hr_char == ' y' ) | | ( t hr_char == ' Y' ) ) {

ADC12CTL0 | = ENC + ADC12SC; / / Sampl i ng and conversi on st ar t _BI S_SR(CPUOFF + GI E) ; / / LPM0 wi t h i nt er r upt s enabl ed

/ / oF = ( ( x/ 4096) *1500mV) - 923mV) *1/ 1. 97mV = x*761/ 4096 - 468/ / I nt DegF = ( ADC12MEM0 - 2519) * 761/ 4096I ntDegF = ( t emp - 2519) * 761;I nt DegF = I ntDegF / 4096;

/ / oC = ( ( x/ 4096) *1500mV) - 986mV) *1/ 3. 55mV = x*423/ 4096 - 278/ / I nt DegC = ( ADC12MEM0 - 2692) * 423/ 4096I ntDegC = ( t emp - 2692) * 423;I ntDegC = I ntDegC / 4096;spri nt f ( NewKey, "T( F) =%l d\ t T(C) =%l d\ n", I ntDegF, I nt DegC) ;f or ( i = 0; i < 25; i ++) {

t hr _char = NewKey[i ] ;UART0_put char( t hr _char ) ;

}

UART0_put char( ' \ n' ) ; / / newl i neUART0_put char( ' \ r ' ) ; / / carr i age r et urngot o Wai t ;

}

i f ( ( thr_char == ' n' ) | | ( t hr_char == ' N' ) ) {f or ( i = 0; i < 9; i ++) {

t hr_char = gm2[ i ] ;UART0_put char( t hr _char ) ;

}UART0_put char( ' \ n' ) ; / / newl i neUART0_put char( ' \ r ' ) ; / / carr i age r et urn

Page 3: lab8

7/17/2019 lab8

http://slidepdf.com/reader/full/lab8563db921550346aa9a9a50fe 3/6

  }}

voi d I ni t Osc(voi d){

i nt i ;

I FG2 = 0;

I FG1 = 0;/ / usi ng a 8MHz c l ock f r om LFXT1, and ACLK=LFXT1BCSCTL1 | = XTS;/ *wai t i n l oop unt i l crystal stabal i zes*/do{

I FG1 &= ~OFI FG;}whi l e (OFI FG & I FG1);

f or ( i = 0xFF; i > 0; i - - ) ;/ / Reset osc. f aul t f l ag agai nI FG1 &= ~OFI FG;

}

voi d UART_I ni t i al i ze( voi d)

{/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / // / UART0 I ni t i al i zat i on/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /

/ / UART0 - 38400 bps/ / I MPORTANT NOTI CE: t he f ol l owi ng conf i gur at i on works onl y f or 8MHZ cl ock rat e/ / AND 38400 bps baud r at e/ / You have t o recal cul ate t hese val ues i f t he cpu cl ock r ate or baud rat e has changed

U0MCTL = 146;U0BR0 = 208;U0BR1 = 0;

P3SEL | = 0x30; / / bi t s 4- 5 ar e f or speci al f uncti on UART0ME1 | = URXE0 + UTXE0; / / UART modul e enabl eU0CTL = CHAR; / * 8- bi t charact ers */U0TCTL = SSEL0; / * cl ock sour ce ACLK, 8MHZ */

U0RCTL = 0;

I E1 | = URXI E0; / / enabl e RX i nt er r upt s}

voi d UART0_putchar( char c) {/ / wai t f or ot her character t o tr ansmi twhi l e (! ( I FG1 & UTXI FG0) ) ;U0TXBUF = c;

}

#pr agma vect or =UART0RX_VECTOR __ i nt er r upt voi d UART0_RX_i nt er r upt ( voi d){

t hr_ char = U0RXBUF;r x_fl ag=0x01; / / si gnal mai n f unct i on r ecei vi ng a char

}

#pr agma vect or =ADC_VECTOR __ i nt er r upt voi d ADC12I SR ( voi d){

t emp = ADC12MEM0; / / Move r esul t s, I FG i s cl ear ed _BI C_SR_I RQ( CPUOFF) ; / / Cl ear CPUOFF bi t f r om 0( SR)

}

Figure 1. C program for sampling and displaying temperature from the MSP430’s temperature

sensor.

Page 4: lab8

7/17/2019 lab8

http://slidepdf.com/reader/full/lab8563db921550346aa9a9a50fe 4/6

2.  Sinusoidal Wave Generator

Let us consider the following application. Your task is to develop a sinusoidal wave generator

using the Softbaugh DRFG4618 board. The function you should implement is described as

follows: y = 1.25*(1+sin(x)). The maximum voltage is consequently 2.5 V and the minimum

voltage is 0 V. The frequency of the sine wave should be 10 Hz, that this one period should take10 ms.

The signal is generated using the MSP430’s DAC12 digital-to-analog converter. Periodically we

will be sending a new digital value to the DAC12. These values are prepared in advance in a

constant table. Let us first discuss how to create this lookup table. Our first step is to determinethe number of samples we want to have and the number of bits to represent them. More samples,

means a better quality of the generated sine wave. Let us assume that we want to have 256

samples of the function  y in a lookup table, each sample with a value in the range of [0 ... 4095].The sample with value 0 corresponds to 0 V, and samples with the value 0xFFF (4095)

corresponds to 2.5 V. We can use Matlab to generate the lookup table for x=0, Δx, 2Δx,..2*pi,

where Δx=2*pi/256. Figure 2 shows the Matlab program. We generate 256 samples (actually257) in the range x=[0...2*pi] and calculate the integer values that correspond to each sample x,

using the original function y=1.25*(1+sin(x)). The values are rounded to nearest integers andthe samples are written back to a file. Note: the actual number of samples is 257, so we should

remove the last one (the same as the first). We should also ensure that no samples are larger than

4095 (the largest number that can be represented by 12-bits). These constants will be used toinitialize the lookup table visible to your program (here we create a header file named

sine_lut_256.h). The sine_lut_256.h file can be found in the course secure directory.

x=( 0: 2*pi / 256: 2*pi )y=1. 25*( 1+si n( x) )dac12=y*4096/ 2. 5dac12r = r ound(dac12)dl mwr i t e( ' s i ne_l ut _256. h' , dac12r , ' , ' )

Figure 2. Matlab program to generate a 256-entry lookup table.

The next step is to determine the trigger period. We want 256 samples to spread over 2*pi range

of x. The required period of the sine wave is 10 Hz (0.1sec). That means that the trigger period

is 0.1/256 sec. We will use a TimerA device to generate triggers. Assuming that the defaultclock frequency on SMCLK is used as the timer clock (1048576 Hz), we can determine the value

that needs to be written to the TimerA counter (0.1/256)*FSMCLK  = 410.

Figure 3 shows the complete program. We stop the watchdog time, initialize the ADC12 to give

a reference voltage of 2.5 V, and initialize the timer to raise an interrupt every 0.1/256 sec. TheTimerA ISR wakes the processor, we read the next sample from the table, and output it to the

DAC12.

Page 5: lab8

7/17/2019 lab8

http://slidepdf.com/reader/full/lab8563db921550346aa9a9a50fe 5/6

 / / ******************************************************************************/ / MSP430xG461x Demo - DAC12_0, Out put Vol t age SI NEWAVE on DAC0/ // / Descr i pti on: Usi ng DAC12_0 and 2. 5V ADC12REF r ef erence wi t h a gai n of 1,/ / out put si ni soi dal wave on P6. 6, y=1. 25( 1+si n( x)) ./ / Nor mal mode i s LPM0 wi t h CPU of f . WDT used/ / t o provi de ~0. 064ms i nter r upt used t o wake up t he CPU and updat e t he DAC

/ / wi t h sof t war e. Use i nt er nal 2. 5V Vr ef ./ / ACLK = 32kHz, SMCLK = MCLK = WDTCLK = def aul t DCO 1048576Hz/ // // / MSP430xG461x/ / - - - - - - - - - - - - - - - - -/ / / | \ | XI N| -/ / | | | 32kHz/ / - - | RST XOUT|-/ / | |/ / | DAC0/ P6. 6| - - > si ne ( 10Hz)/ / | |/ // / Aut hor : Al eksandar Mi l enkovi c, mi l enkovi c@comput er. org/ / Date: Oct ober 2009/ / ******************************************************************************#i ncl ude " msp430xG46x. h"#i ncl ude "si ne_l ut _256. h" / *256 sampl es ar e st ored i n t hi s t abl e */

voi d mai n( voi d) {unsi gned i nt i ;

WDTCTL = WDTPW + WDTHOLD; / / St op WDTADC12CTL0 = REF2_5V + REFON; / / I nter nal 2. 5V r ef onf or ( i =50000; i >0; i - - ) ; / / Del ay t o al l ow Ref t o set t l e

 __ di sabl e_i nt er r upt ( ) ; / / Di sabl e I nt er r uptsDAC12_0CTL = DAC12I R + DAC12AMP_5 + DAC12ENC; / / Set s DAC12CCTL0 = CCI E; / / CCR0 i nt err upt enabl edCCR0 = 410; / / Set s Ti mer Fr eq ( 1048576*0. 1sec/ 256)

 TACTL = TASSEL_2 + MC_1; / / set cl ock t o SMCLK, up modei =0;whi l e (1){

 __ bi s_ SR_r egi st er ( LPM0_bi t s + GI E) ; / / Enter LPM0, i nt er r upts enabl edDAC12_0DAT = LUT256[ i ] ;DAC12_0DAT &= 0xFFF;i =( i +1)%256;

}}

#pr agma vect or = TI MERA0_VECTOR __ i nt er r upt voi d TA0_I SR( voi d){

 __ bi c_ SR_r egi st er _on_ exi t ( LPM0_bi t s) ; / / Exi t LPMx, i nt er r upts enabl ed}

Figure 3. Sine Wave Generator.

Page 6: lab8

7/17/2019 lab8

http://slidepdf.com/reader/full/lab8563db921550346aa9a9a50fe 6/6

 

3.  Assignments

Assignment #1: Serial communication (PC to EasyWeb2 and EasyWeb2 to PC)Write a C program that samples the integrated on-chip temperature sensor (analog input channel

INCHx = 1010, see User’s Guide, Chapter 17 for details) once every second, calculates thetemperature in degrees of Celsius and Fahrenheit, time-stamps it, and sends it to the

HyperTerminal. The format of a reading on the HyperTerminal should be as follows:01:23 <78 F/ 26 C> (“Minutes:Seconds <Degrees Fahrenheit / Degrees Celsius>”). The time

keeping starts from 00:00.

Assignment #2: DAC12Write a C program that will generate a sinusoidal wave with frequency of 100 Hz. You should

use the lookup table initialized with 256 values for the first quadrant of the sine wave, that is: 0,

Δx, 2Δx,.. pi/2, where Δx=pi/512. You should implement the control in the program to get thecorrect sine wave. What are advantages and disadvantages of this approach?