ADC
Ensaios para verificar funcionamento do ADC
GERAL:
1) Não precisa ativar o PxSEL, o ADC funciona, mas se for ativado, economiza energia.
1) Single-Channel Single-Conversion e Disparo pelo ADC12SC
1) Repeat Single-Channel e Disparo pelo ADC12SC
• CONSEQ = 0 ou 2 e SHS = 0
• EOS não fez diferença;
• ADC12 permaneceu habilitado durante todo o tempo;
• Flanco positivo em ADC12SC inicia conversão;
• Mesmo resultado com CONSEQ = 0 ou = 2.
// AD-01
//
// Ensaios para verificar funcionamento do AD
//
// SHS=0 --> Disparar por software usando ADC12SC
// CONSEQ=0 --> Modo Single
#include <msp430.h>
#define TRUE 1
#define FALSE 0
void config_adc(void);
int main(void){
volatile int dado=0x1234;
WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
config_adc();
ADC12CTL0 &= ~ADC12SC; //ADC12SC = 0
while (TRUE){
ADC12CTL0 |= ADC12SC; //ADC12SC = 1
ADC12CTL0 &= ~ADC12SC; //ADC12SC = 0
while ( (ADC12IFG&ADC12IFG0) == 0); //Esperar conversão
dado = ADC12MEM0; //Ler resultado
}
return 0;
}
void config_adc(void){
ADC12CTL0 &= ~ADC12ENC; //Desabilitar para configurar
ADC12CTL0 = ADC12SHT0_3 | //ADC tempo amostragem ADCMEM[0-7]
ADC12ON; //Ligar ADC
ADC12CTL1 = ADC12CSTARTADD_0 | //Resultado em ADC12MEM0
ADC12SHS_0 | // Selecionar ADC12SC bit
ADC12SHP | // S/H usar timer
ADC12DIV_0 | //Clock ADC Divisor = 1
ADC12SSEL_3 | //Clock ADC = SMCLK
ADC12CONSEQ_0; //Modo Single
ADC12CTL2 = ADC12TCOFF | // Desligar sensor temperatura
ADC12RES_2; // Resolução 12-bit
ADC12MCTL0 = ADC12EOS | //Fim de sequência
ADC12SREF_0 | //VR+ = AVCC e VR- = AVSS
ADC12INCH_0; //(P6.0) A0 = Canal 0 (?P6SEL |=
BIT0?)
ADC12CTL0 |= ADC12ENC; //Habilitar ADC12
P6SEL |= BIT0;
}
2) Single-Channel Single-Conversion e Disparo pelo TA0.1, TB0.0, TB0.1
• CONSEQ = 0 e SHS = 1
• EOS não fez diferença;
• Próxima conversão só é iniciada após ser autorizada com ADC12ENC = 1 e quando o
relógio TA0.1 bate;
• Com o CCS não foi possível ver ADC12ENC = 0; ele permaneceu sempre = 1;
• Parecer que, na verdade, ADC12ENC fica em 1, mas uma nova conversão só é iniciada
quando se escreve ADC12ENC = 1 (apesar de ele já estar em 1);
• Após fazer ADC12EC = 1, a conversão inicia com o timer TA0.1;
• Mesmo resultado com CONSEQ = 0 ou = 2.
// AD-02
//
// Ensaios para verificar funcionamento do AD
//
// SHS=1 --> Disparar com TA0.1
// CONSEQ=0 --> Modo Single
#include <msp430.h>
#define TRUE 1
#define FALSE 0
void config_adc(void);
int main(void){
volatile int dado=0x1234;
WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
config_timer();
config_adc();
while (TRUE){
ADC12CTL0 |= ADC12ENC; //Hab ADC12ENC e esperar TA0.1
while ( (ADC12IFG&ADC12IFG0) == 0); //Esperar conversão
dado = ADC12MEM0; //Ler resultado
}
return 0;
}
void config_adc(void){
ADC12CTL0 &= ~ADC12ENC; //Desabilitar para configurar
ADC12CTL0 = ADC12SHT0_3 | //ADC tempo amostragem ADCMEM[0-7]
ADC12ON; //Ligar ADC
ADC12CTL1 = ADC12CSTARTADD_0 | //Resultado em ADC12MEM0
ADC12SHS_1 | // Selecionar TA0.1
ADC12SHP | // S/H usar timer
ADC12DIV_0 | //Clock ADC Divisor = 1
ADC12SSEL_3 | //Clock ADC = SMCLK
ADC12CONSEQ_0; //Modo Single
ADC12CTL2 = ADC12TCOFF | // Desligar sensor temperatura
ADC12RES_2; // Resolução 12-bit
ADC12MCTL0 = ADC12EOS | //Fim de sequência
ADC12SREF_0 | //VR+ = AVCC e VR- = AVSS
ADC12INCH_0; //(P6.0) A0 = Canal 0 (?P6SEL |=
BIT0?)
ADC12CTL0 |= ADC12ENC; //Habilitar ADC12
P6SEL |= BIT0;
}
void config_timer(void){
TA0CTL = TASSEL_1 | MC_1;
TA0CCTL1 = OUTMOD_6;
TA0CCR0 = 3276; //0,1 seg
TA0CCR1 = TA0CCR0/2; //50%
}