You are on page 1of 9

1.

C 2 module ADC trong MSP430 l ADC 10 bit v


ADC 12 bit c TEXAS INSTRUMENTS gii thiu
l c hiu nng rt ng k.

Guide ny s hng dn cho cc bn s dng ADC10


v 12, nhng config nng cao nh tit kim nng
lng, hiu chnh b m, chuyn i nng cao knh
mong b con tm hiu thm trong datasheet.

B chuyn i ADC10 (da trn mc in p v+ v


v- lm h qui chiu) s chuyn kt qu t tn hiu
analog thnh tn hiu digital vi phn gii 10 bit
v lu kt qu vo thanh ghi ADC10MEM.

Nu in p c vo ln hn v+ th kt qu s l
0x3ff v nu b hn v- th kt qu s l 0.

Configuration :
B iu khin ADC c ci t bi 2 thanh ghi l
ADC10CTL0 v ADC10CTL1 ch c th c
chnh sa khi bit ENC=0 v sau khi chnh sa
xong th bn cn set bit ENC=1 ADC lm vic.
NU BN CHN IN P QUI CHIU NI
Chn ngun in p so snh bng cch set bit REFON ( REFON mt 30
micro giy chuyn trng thi ) . Khi REFON =0 th tc l bn chn
ngun ni AVCC =3.5V, khi REFON =1 th:
*Khi REF2_5V = 1 ,in p qui chiu ni l 2.5 V, = 0,

in p qui chiu ni l 1.5 V.


NU BN CHN IN P QUI CHIU NGOI
REFOUT=1 th chng ta phi gn in p qui chiu ngoi vo 2 chn Vref+
v Vref- ca chip, ln lt P1.4 v P1.3.
ADC10ON: bt tt b ADC10
ADC10IE: cho php ngt trong ADC10, c ngt ADC10IFG s c
set mi khi chuyn i xong, dng c ngt ny th bit cho php ngt
ADC v ngt ton cc phi c set trc ( GIE =1 ), c ngt s c t
reset mi khi vo chng trnh ngt.
ENC (Enable conversion) v ADC10SC (Start conversion) s c set
khi chng ta bt u chuyn i
Bit MSC: la chn khi ng bng tay sau mi ln chuyn i hoc
t ng chuyn i lin tc ADC
(CH DNG TRONG MODE 1,2,3 CA ADC ) => xem li trong datasheet
hiu a ch ca cc bit .

C 4 mode chuyn i adc nh trn bng cch chnh sa bit CONSEQx


-MODE 00: mu s c chuyn i 1 ln, kt qu lu trong thanh ghi
ADC10MEM,
chuyn i c kch hot da vo bit ADC10SC v ENC phi c set li sau
mi ln
chun i.
-MODE 01: chuyn i ln lt nhiu tn hiu ADC t chn Ax ( config bit trong
NCHx) n chn A0 kt qu s lu ln lt vo ADC10MEM.
-MODE 10: chuyn i lin tc tn hiu ADC t 1 chn c nh kt qu s lu
ln lt
vo ADC10MEM.
-MODE 11: chuyn i lin tc NHIU tn hiu ADC t chn Ax ( config bit
trong

NCHx) n chn A0 kt qu s lu ln lt vo ADC10MEM.


mang li hiu nng cao nht vi cc mode 01,10,11 th nh sn xut khuyn
bt
bit MSC=1 (multiple sample and convert)
Bn cnh vic set bit INCHx chn chn mang chc nng ADC,
cc bn phi enable chc nng ADC cho chng qua thanh ghi
ADC10AE
y l phn gii thiu s qua v ADC trong msp, hiu r hn cc bn hy ti
slide bi ging ny v tham kho, y l ti liu mnh ang hc ti trng nn
rt d hiu
Ai gii thch cho mnh cc mode convert ca ADC10 ny khng? trong y c h tr 4 mode:
+ CONSEQ = 00: A single channel is converted once => ly mu 1 knh 1 ln duy nht. c phi
mode ny ch ly 1 ln r ADC ngng hot ng lun? khng cn reset bit ENC & ADC10SC?
+ CONSEQ = 01: A sequence of channels is converted once => ly mu nhiu knh 1 ln duy nht,
tng t nh mode trn nhng ly nhiu knh
+ CONSEQ = 10: A single channel is converted repeatedly => ly mu 1 knh nhiu ln, ly mt
knh v lp i lp li nhiu ln, vy ADC10MEM s mt d liu nu khng dc sao lu sang ch khc?
+ CONSEQ = 11: A sequence of channels is converted repeatedly => ly mu nhiu knh nhiu ln,
tng t nh mode CONSEQ_10 nhng ly nhiu knh, vy ke6t` qu ly dc l rt nhiu lu u
???
REFON =0 th tc l bn chn ngun ni AVCC =3.5V
Nh vy khong ra ca ADC10MEM = [Min;Max] = [0; 3FF] tng ng vi in p vo trong khong [0; 3.5V]
on code trn th so snh ADC10MEM<0x1FF tc c ngha l nu in p trc khi chuyn i nh hn (0x1FF/0x3FF)*3.5V=(511/1023)*3.5V=0.5*3.5V=1.75V th tt
led p1.0 ngc li th bt led p1.0.
Ngi ta mun Led sng lc no th ch vic i gi tr p vo tng ng vi gi tr s sau khi chuyn i thanh ghi ADC10MEM m thi.

Code v d trong bi ging


#include <msp430g2231.h>
void main(void) {
WDTCTL=WDTPW+WDTHOLD;
ADC10CTL0=ADC10SHT_2+ADC10ON+ADC10IE;//
ADC10CTL1=INCH_1;
ADC10AE0|=0x02;
P1DIR|=0x01;
for( ; ; ){
ADC10CTL0|=ADC10SC+ENC;
__bis_SR_register(CPUOFF+GIE);
if(ADC10MEM < 0x1FF)
P1OUT&=~0x01;
else
P1OUT|=0x01;
}
}
#pragma vector=ADC10_VECTOR
__interrupt void ADC10ISR(void){
__bic_SR_register_on_exit(CPUOFF);
}

mode 00, khi n ly mu xong th ngng ADC li bng cch t clear ci bit cho php chy ADC (qun bit no ri). Bn mun c ADC tip th set bit ln
Khi ly mu nhiu ln( c mode 10 v 11) th d liu c lu dng block. Tui cha dng chc nng block ny nhng nh l c c qua. Bn c th c tip phn sau
trong file User's Guide c thm thng tin v my ci Block

MSP430 c DTC (data transfer controller) c chc nng lu mt block data (data t ADC) vo RAM. Trong c thanh ghi ADC10DTC1 xc nh s kt qu chuyn i
s c lu trong RAM t a ch c nh trc trong thanh ghi ADC10SA. Sau khi chuyn i s ln trn knh c chn th s dng c ngt ADC10IFG, lc ny
trong RAM c d liu v bn c th c c

ah, th ra gi tr ti a ca ADC10MEM l 3FF(1023).


Vref=3.5V/2.5V/1.5V,
in p mun so snh l Vx th
=> gi tr so snh thanh ghi ADC10MEM = (Vx*1023)/Vref
=> ri chuyn sang Hexa l c
Cu tr li ca bn cha chnh xc lm. Vn nm sai s. Nh cc bn bit l tt c cc hot ng ca MCU u da trn cc xung nhp. chnh xc
ca cc xung nhp ny quyt nh chnh xc trong hot ng ca MCU. Cc xung nhp ny c th ly ngun t mch dao ng RC ni hay dng thch
anh ngoi. Nu nh ng dng ca cc bn chp nhn sai s xung nhp ny trn 4 or 5% g th cc bn c th dng ngun ni. i vi cc ng dng i
hi s chnh xc cao (thng thng di 3%) th cc bn phi dng thch anh ngoi.

u tin bn cn hiu DCO v VLO l ci g ci i


DCO: Digitally Controlled Oscillator : b dao ng k thut s (ni chung l dao ng RC ni trong con IC)
VLO: Very Low Power : Nng lng cc thp
C th thng tin trong User's Guide MSP430 nhe bn:
DCOCLK: Internal digitally controlled oscillator (DCO).
VLOCLK: Internal very low power, low frequency oscillator with 12-kHz typical frequency.
DCO l ni chung v b dao ng ni trong chip MSP430. N c th to c tn s dao ng t 12kHz ln n 16MHz (hnh nh mnh o n ln ti
20MHz y). Khi hot ng vi tn s cng cao, nng lng tiu th cng ln, v ngc li.
Nu bn mun MSP tiu th cc t nng lng th ngoi cc Low Power Mode (LPMx) ra, bn cn c th set tn s dao ng DCO xung mc thp nht l
96kHz, sau dng b chia tn chia cho 8 s c tn s 12kHz cho MSP430 hot ng vi dng tiu th ch vi nA, cc k tit kim nng lng - khi
nim lun i km vi MSP430.
=> khi nim VLO dng trong trng hp ny
ong gop thm cho cac ban mt s khai nim v ngun xung cua MSP430 va cac mode tit kip in nng.

DCO la b dao ng s bn trong MCU.


ACLK l Auxiliary clock tc xung ph tr. V phn mm c th la chn cho cc modlue ngoi vi s dng. Xung ACLK uc dng ch yu cc mode low
power.
MCLK m Master clock l clock chnh cho MCU hot ng tng dng lnh ca e s chy bng xung ny.
SMCLK l Sub -Main clock thng dng s dng cho cc module ngoi vi.
Cn v 5 mode c th nh sau:
Truc tin ni v nng lung tiu th ca MCU: Ta gi s nh all cc port u l input. vy nng lung tiu th chnh chnh l nng lung ca xung chng
trnh mnh ang thc thi, m chung trnh mun thc thi th phi c xung clock. Xung clock li c nhiu ngun nh: ACLK,MCLK,SMCLK,DCO. vy nu ta
c tt dn cc ngun clock th s chng tn nng lung g na. th l sinh ra cc mode low power.
Chi tit cc mode nh sau:
+Active mode l mode hot ng bnh thung xung u enable.
+Low power mode 0(LPM0). l mode ch c MCLK disable. Nn MCU s b disable. Tc chung trnh s tm dng. Cn cc ngoi vi vn hot ng bt vi
tn s = vi DCO l khong 1-16MHz.
+LPM1: MCLK disable. DCO(ngun dao ng ni) disable. M DCO l ngun cung cp clock chnh cho SMCLK. Nn nu DCO b disable th vi iu khin
ch cn nuc l dng xung ACLK chy ngoi vi, M xung ny tn s thung l 32768Khz ca thch anh ngoi. Nng lung li t l vi tn s thng
thng vi 2553 l 330uA/1MHz.
Ni tm li v th n tit kim hn thng mode 0.
+LPM2: MCLK v SMCLK disable. mode ny th ngoi vi u b mt xung ht v MCU cng tm dng v ngoi vi cng ch dng oc xung t ACLK. ch
cn DCO v ACLK hot ng nn tit kim hn thng trn 1 cht na.
+LPM3:MCLK,SMCLK,DCO disable,ch cn mnh thng ACLK hot ng.Nn cn tit kim na lun. Mode ny thung dng cho nhng ngoi vi ch s dng
xung ACLK. Nh nhng ng dng dm watchdog hoc timer nh k lm vic. Thc dy ci ri ng lun.

+LPM4: Ci ny th kinh khng hn na. All c s tt ht lun, Ch c duy nht ngt ngoi vi, tc ngt IO c th l ngt t cc port mi nh thc uc
MCU. Mode ny thung dng trong nhng chung trnh ch lm nhim v c d liu t IO nu c thay i, ri x l xong ng tip.

Kt hp vi PWM, thay i sng ca led bng ADC (c t bin tr, cm bin nhit ni)

#include <msp430g2553.h>
#define LED
#define INPUT
void main(void)
{

BIT2
BIT0

WDTCTL = WDTPW + WDTHOLD;


P1DIR |= LED;
P1SEL |= LED;

// Stop WDT
// P1.2 output
// P1.2 TA0.1 function

BCSCTL1 = CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ;
TA0CCR0 = 0xffff;
TA0CCTL1 |= OUTMOD_7;
TA0CCR1 = 0;
TACTL = TASSEL_2 + MC_1;

// PWM Period
// CCR1 reset/set
// CCR1 PWM duty cycle
// SMCLK, up mode

ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE; // ADC10ON, interrupt enabled


ADC10CTL1 = INCH_0;
// input A0
ADC10AE0 |= INPUT;
// PA.1 ADC option select
while(1)
{
ADC10CTL0 |= ENC + ADC10SC;
// Sampling and conversion start
__bis_SR_register(CPUOFF + GIE);
// LPM0, ADC10_ISR will force exit
TA0CCR1 = (ADC10MEM*65535)/1024;
}
}
// ADC10 interrupt service routine
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)
{
__bic_SR_register_on_exit(CPUOFF);
}

// Clear CPUOFF bit from 0(SR)

Cho e hi vn c, e ang xi con 28 chn v mun dng PORT3 ca n xut ra LCD th mnh defind file LCD.C nh th no,
e sa P2 thnh P3 trong LCD.C ri, sa trong thanh ghi PSEL trong chng trnh chnh na, nhng n chng ra ci g c. V
cho e hi ngha cc dng ny n c lin quan g ti vic xut ra LCD bng PORT 3 ko?
union reg* P2_dir = (union reg*)0x2a;
union reg* P2_out = (union reg*)0x29;
union reg* P1_dir = (union reg*)0x22;
union reg* P1_out = (union reg*)0x21;

nu xem trong user guide trang 341 ca g2553 th mnh ngh bn c th t


define a ch ca port3dir v port3out. sau c th s dng cc chn mcu
s dng bnh thng.
code c th nh sau (mnh ko c con 28 chn nn ko th c)
union reg* P3_dir = (union reg*)0x1a;
union reg* P3_out = (union reg*)0x19;
v cc dng define chn out v dir di sa tng t
V y l bi tp cho cc bn t luyn:
1. Kt hp ngt ADC vi ngt timer, c ADC theo chu k ngt ca timer.
2. Kt hp vi PWM, thay i sng ca led bng ADC (c t bin tr, cm bin nhit ni)
3. Dng ADC c v x l tn hiu 1 cm bin thng dng: Cm bin nhit LM35, quang tr, ..
c cm bin nhit ni

/******************************************************************************
*
* www.payitforward.edu.vn
*
******************************************************************************/
/******************************************************************************
*
* C7 TRAINING
*

******************************************************************************/
/******************************************************************************
*
* Module
: TEMPERATURE SENSOR
* Description : This file describes API functions that support for
*
temperature sensor on MSP430G2553
*
* Tool
: CCS 5.1
* Chip
: MSP430G2553
* History
: 04-11-2012
* Version
:1
*
* Author
:
* Notes
: To apply these functions, you must include the header file lcd.h and
*
source file lcd.c to your project.
*
*
******************************************************************************/
/****************************************************************************
* IMPORT
******************************************************************************/
#include <msp430g2553.h>
#include "LCD.h"
/****************************************************************************
* DECLARATIONS
******************************************************************************/
unsigned char temp;
/*****************************************************************************
*
SUBROUTINES
******************************************************************************/
//*****************************************************************************
// Initialization for ADC10 module
//*****************************************************************************
void ADC10_Init(void)
{
ADC10CTL0 = SREF_1 + ADC10SHT_3 + ADC10ON + ADC10IE + REFON;
/*
* Vr+ = Vref+
* ADC sample and hold time = 64 ADC clocks: When using the temperature
sensor, the sample period must be greater than 30 s
* Turn on ADC10
* Enable ADC10 Interrupt
* Turn on reference generator
*/
ADC10CTL1 = INCH_10 + ADC10DIV_1 + ADC10SSEL_3 ;
/*
* Select Input chanel: Temperature Sensor
* ADC10DF = 0: The 10-bit conversion results are right justified
* ADC10 Clock divider: 4
* ADC10 clock source select: SMCLK
*/
}
/*****************************************************************************
*
MAIN PROGRAM
******************************************************************************/
void main(void)

{
WDTCTL = WDTPW + WDTHOLD; //Stop Watchdog Timer
ADC10_Init();
//Initialize ADC10
lcd_init();
//Initialize LCD
P2SEL = 0;
//Turn off external crystal
P2SEL2 = 0;
lcd_clear();
//Clear LCD
while (1)
{
ADC10CTL0 |= ENC + ADC10SC;
//Enable ADC10, Start sample - conversion
_bis_SR_register(LPM0_bits + GIE); //Enter LPM0, wait for sample-conversion finish
lcd_clear();
lcd_gotoxy(2,0);
lcd_puts("Temperature:");
lcd_gotoxy(7,1);
lcd_putc((temp / 10) + 48);
lcd_putc((temp % 10) + 48);
_delay_cycles(500000);
}

/*****************************************************************************
*
INTERRUPT PROGRAM
******************************************************************************/
#pragma vector = ADC10_VECTOR
__interrupt void ADC10_Interrupt(void)
{
temp=((ADC10MEM - 673) * 423) / 1024; //Calculate temperature
/*
* VTEMP=0.00355(TEMPC)+0.986
* Vref = 1.5V
*/
_bic_SR_register_on_exit(LPM0_bits); //Exit LPM0
}
/*****************************************************************************
*
END
******************************************************************************/
c bin tr

c bin tr
/******************************************************************************
*
* WWW.PAYITFORWARD.EDU.VN
*
******************************************************************************/
/******************************************************************************
*
* C7 TRAINING
*
******************************************************************************/
/******************************************************************************
*
* Module
: VOLTAGE MESURE
* Description : This file describes API functions that support for
*
ADC module on MSP430G2553
*
* Tool
: CCS 5.1
* Chip
: MSP430G2553

* History
: 04-11-2012
* Version
:1
*
* Author
: NHH
* Notes
: To apply these functions, you must include the header file lcd.h and
*
source file lcd.c to your project.
*
*
******************************************************************************/
/*****************************************************************************
* Pin Description
******************************************************************************
*
*
MSP430G2x53
*
----------------*
/|\|
XIN|*
||
|
*
--|RST
XOUT|*
|
|
* Analog signal input >--|P1.1/A1
|--> ||
*
|
|--> || Out to LCD
*
|
|--> || Described in LCD.c
*
|
|--> ||
*
|
|
*
******************************************************************************/
/*****************************************************************************
* IMPORT
******************************************************************************/
#include <msp430g2553.h>
#include "LCD.h"
/*****************************************************************************
* DECLARATIONS
******************************************************************************/
#define Vref 3.3

//Define Vcc voltage when select Vref = VCC

unsigned long adc_result, volt;


/*****************************************************************************
*
SUBROUTINES
******************************************************************************/
//*****************************************************************************
// Initialization for ADC10 module
//*****************************************************************************
void ADC10_Init(void)
{
ADC10CTL0 = SREF_0 + ADC10SHT_1 + ADC10ON + ADC10IE;
/*
* Vref = VCC
* ADC sample and hold time = 8 ADC clocks
* Turn on ADC10
* Enable ADC10 Interrupt
*/
ADC10CTL1 = INCH_1 + ADC10DIV_1 + ADC10SSEL_3;
/*
* Select Input chanel 1
* ADC10DF = 0: The 10-bit conversion results are right justified

* ADC10 Clock divider: 2


* ADC10 clock source select: SMCLK
*/
ADC10AE0 |= BIT1; //Enable analog input on A1 chanel

/*****************************************************************************
*
MAIN PROGRAM
******************************************************************************/
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //Stop Watchdog Timer
ADC10_Init();
//Initialize ADC10
lcd_init();
//Initialize LCD
P2SEL = 0;
//Turn off external crystal
P2SEL2 = 0;
lcd_clear();
//Clear LCD
while (1)
{
ADC10CTL0 |= ENC + ADC10SC; //Enable ADC10, Start sample - conversion
_bis_SR_register(LPM0_bits + GIE); //Enter LPM0, wait for sample-conversion finish
lcd_clear();
lcd_puts("Result: ");
volt = (adc_result * Vref * 100) / 1024; //Calculate result (= 100 * Voltage)
//Display result
lcd_putc((volt / 100) + 48);
//ASCII code (of a number) = number + 48
lcd_puts(".");
lcd_putc((volt / 10) % 10 + 48);
lcd_putc((volt % 10) + 48);
lcd_puts("V");
_delay_cycles(500000);
}
}
/*****************************************************************************
*
INTERRUPT PROGRAM
******************************************************************************/
#pragma vector = ADC10_VECTOR
__interrupt void ADC10_Interrupt(void)
{
adc_result = ADC10MEM;
//Save Result
_bic_SR_register_on_exit(LPM0_bits); //Exit LPM0
}
/*****************************************************************************
*
END OF MAIN.C
******************************************************************************/

You might also like