📄 fet140_adc12_11.c
字号:
//*****************************************************************************
// MSP-FET430P140 Demo - ADC12, Single Channel Rpt Mode, TA1 as Sample Trigger
//
// Description: Sample and convert A0 using Timer_A as sample trigger in
// Pulse Sample mode. Put "Num_of_Results" ADC12MEM0 values in results[]
// and Light LED (P1.0) when done.
//
// MSP430F149
// ---------------
// | |
// Vin -->|P6.0/A0 |
// | |
//
// H. Grewal
// Texas Instruments Inc.
// Feb 2005
// Built with IAR Embedded Workbench Version: 3.21A
//*****************************************************************************
利用P6.0为ADC输入,用CCR1产生ADC12所需的采样触发信号源。
P6.0采用单通道多次采方式采样,共采样512次后进入LPM3模式。
TACLK = ACLK
#include <msp430x14x.h>
#define Num_of_Results 512
int results[Num_of_Results] = {0};
void ADC_Init(void);
void main(void)
{
WDTCTL = WDTPW | WDTHOLD; // 停止看门狗
ADC_Init(); // 初始化ADC12
ADC12CTL0 |= ENC; // ADC开始转换
_BIS_SR(LPM0_bits); // 进入LPM0模式
}
void ADC_Init(void)
{
P1DIR = 0xff; // 设P1方向为输出
P1OUT = 0; // P1口输出0
P6SEL |= 0x01; // P6.0设为AD0输入功能
ADC12CTL0 = ADC12ON+SHT0_1+REF2_5V+REFON; // 设置ADC12
//ADC12内核开+采样保持时间系数(2)+选择内部参考电压+打开内部参考电压发生器
ADC12CTL1 = SHP+CONSEQ_2+SHS_1;
//采样触发源来自采样定时器,由采样输入信号(ADC12CLK)的上升沿触发采样定时器
//+单通道多次采样+采样触发源为Timer_A的输出单元out1输出的信号(由CCR1定时产生)
ADC12MCTL0 = INCH_0 + SREF_1;
//选择AD通道0+正参考电压=Vref+,负参考电压=AVss
ADC12IE = 0x0001; // 开中断允许-ADC12IFG.0
TACCR0 = 1500; // 延时,允许有足够时间用于整理
TACCTL0 |= CCIE; // TA为比较模式(TA与CCRO比较),TA开中断允许
TACTL = TASSEL_1 | MC_1; // TACLK = ACLK,定时器A为增计数模式工作.
_BIS_SR(LPM3_bits + GIE); // 进入LPM3模式,开总中断允许,等待延时时间结束
TACCTL0 &= ~CCIE; // 关闭CCR0捕获比较寄存器的中断
P2SEL |= BIT3; // 设P2.3为TimerA out1输出功能
P2DIR |= 0x08; // 设p2.3为输出
TACCR0 = 7; // 初始化TACCR0,采样时钟源周期=CCR0+1
TACCR1 = 4; // 初始化TACCR1,用于产一个TimerA.out1信号给ADC12做采样触发信号源
TACCTL1 = OUTMOD_3; // CCR1捕获比较寄存器的OUT1输出单元输出为置位/复位模式
TACTL = TACLR | MC_1 | TASSEL_1; // 定时器时钟=ACLK, 清除TA,增计数模式
}
// Timer_A0 CCR0中断服务程序
#pragma vector=TIMERA0_VECTOR
__interrupt void ta0_isr(void)
{
TACTL = 0; // TA控制寄存器清零
LPM3_EXIT; // 在返回时退出LPM3模式
}
// ADC12中断服务程序
#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR (void)
{
static unsigned int index = 0; //静态变量
results[index++] = ADC12MEM0; // 移动ADC结果往results数组
if (index == 512) //是否转换了512次?
{
ADC12CTL0 &= ~ENC; // 是,则停止转换
index = 0;
P1OUT |= 0x01; // P1.0=1
_BIS_SR(LPM3_bits); // 进入LPM3模式
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -