[MSP430FR2311 EVM] ADC테스트 - 내장 온도 센서 테스트
MSP430FR2311 는 10bit, 12bit ADC가 8채널이 있다. 최대 200ksps 까지 변환 가능하기존 MSP430시리즈와 크게 차이는 없지만 FRAM을 사용하면 장점이 될만한 기능이 있는것 같다.
MSP430FR2311 ADC 블록도
MSP430FR2311 ADC 초기화 코드
// Configure ADC - Pulse sample mode; ADCSC trigger
ADCCTL0 |= ADCSHT_8 | ADCON; // ADC ON,temperature sample period>30us
ADCCTL1 |= ADCSHP; // s/w trig, single ch/conv, MODOSC
ADCCTL2 |= ADCRES; // 10-bit conversion results
ADCMCTL0 |= ADCSREF_1 | ADCINCH_12; // ADC input ch A12 => temp sense
ADCIE |=ADCIE0; // Enable the Interrupt request for a completed ADC_B conversion
// Configure reference
PMMCTL0_H = PMMPW_H; // Unlock the PMM registers
PMMCTL2 |= INTREFEN | TSENSOREN; // Enable internal reference and temperature sensor
MSP430FR2311 온도센서 특성 그래프
MSP430FR2311 ADC 인터럽트 핸들러
// ADC interrupt service routine
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=ADC_VECTOR
__interrupt void ADC_ISR(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(ADC_VECTOR))) ADC_ISR (void)
#else
#error Compiler not supported!
#endif
{
switch(__even_in_range(ADCIV,ADCIV_ADCIFG))
{
case ADCIV_NONE:
break;
case ADCIV_ADCOVIFG:
break;
case ADCIV_ADCTOVIFG:
break;
case ADCIV_ADCHIIFG:
break;
case ADCIV_ADCLOIFG:
break;
case ADCIV_ADCINIFG:
break;
case ADCIV_ADCIFG:
temp = ADCMEM0;
// Temperature in Celsius
// The temperature (Temp, C)=
IntDegC = (temp-CALADC_15V_30C)*(85-30)/(CALADC_15V_85C-CALADC_15V_30C)+30;
// Temperature in Fahrenheit
// Tf = (9/5)*Tc | 32
IntDegF = 9*IntDegC/5+32;
//__bic_SR_register_on_exit(LPM3_bits); // Exit LPM3
break;
default:
break;
}
}