📄 msp430xg46x_adc12_03.c
字号:
//******************************************************************************
// MSP430xG461x Demo - ADC12, Sample A10 Temp, Set P5.1 if Temp ++ ~2C
//
// Description: Use ADC12 and the integrated temperature sensor to detect
// temperature gradients. The temperature sensor output voltage is sampled
// ~ every 80ms and compared with the defined delta values using an ISR.
// (ADC12OSC/256)/ determines sample time which needs to be greater than
// 30us for temperature sensor.
// ADC12 is operated in repeat-single channel mode with the sample and
// convert trigger sourced from Timer_A CCR1. The ADC12MEM0_IFG at the end
// of each conversion will trigger an ISR.
// ACLK = 32kHz, MCLK = SMCLK = default DCO 1048576Hz, ADC12CLK = ADC12OSC
//
// MSP430xG461x
// -----------------
// /|\| XIN|-
// | | | 32kHz
// --|RST XOUT|-
// | |
// | P5.1|-->LED
//
//
// A. Dannenberg/ M. Mitchell
// Texas Instruments Inc.
// October 2006
// Built with IAR Embedded Workbench Version: 3.41A
//******************************************************************************
#include "msp430xG46x.h"
#define ADC_DELTA_ON 12 // ~ 2 Deg C delta for LED on
unsigned int ADCResult;
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog
ADC12CTL1 = SHS_1 + SHP + CONSEQ_2; // TA trig., rpt conv
ADC12MCTL0 = SREF_1 + INCH_10; // Channel A10, Vref+
ADC12IE |= 0x001; // Enable ADC12IFG.0
ADC12CTL0 = SHT0_8 + REF2_5V + REFON + ADC12ON; // Config ADC12
TACCR0 = 13600; // Delay for reference start-up
TACCTL0 |= CCIE; // Compare-mode interrupt.
TACTL = TACLR + MC_1 + TASSEL_2; // up mode, SMCLK
__bis_SR_register(LPM0_bits + GIE); // Enter LPM0, Enable interrupts
TACCTL0 &= ~CCIE; // Disable timer interrupt
__disable_interrupt(); // Disable Interrupts
ADC12CTL0 |= ENC; // Config ADC12
TACCTL1 = OUTMOD_4; // Toggle on EQU1 (TAR = 0)
TACTL = TASSEL_2 + MC_2; // SMCLK, cont-mode
while (!(ADC12IFG & 0x0001)); // First conversion?
ADCResult = ADC12MEM0; // Read out 1st ADC value
ADCResult += ADC_DELTA_ON;
P5OUT = 0; // Clear P5
P5DIR |= 0x02; // P5.1 as output
__bis_SR_register(LPM0_bits + GIE); // LPM0
}
#pragma vector = TIMERA0_VECTOR
__interrupt void TA0_ISR(void)
{
TACTL = 0; // Clear Timer_A control registers
__bic_SR_register_on_exit(LPM0_bits); // Exit LPM0
}
#pragma vector = ADC12_VECTOR
__interrupt void ADC12_ISR(void)
{
if (ADC12MEM0 >= ADCResult) // ADC12MEM = A0 > ADCResult?
P5OUT |= 0x02; // P5.1 = 1
else
P5OUT &= ~0x02; // P5.1 = 0
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -