📄 msp430f2274adc10.txt
字号:
MSP430F2274中ADC10 系列通道单次采样
/**************************************************************************************************************
* 功能: ADC10 多通道系列单次采样
*
* 描述: 对A0 A1 A2 三个通道进行电压检测,ADC结果存于 ad_value[3] 数组中.并 *
* 用 result[X]= ((Avcc * ad_value[X] )/ 1023 的公式来计算电压值 .
*
* 程序中写到的 "*1000" 是将结果扩大1000倍,保留3位小数点
*
***************************************************************************************************************/
#include <MSP430x22x4.h>
unsigned char ADC10FLAG=0;
unsigned int result[3],ad_value[3];
void TIMER_A_SETTINGS( void )
{
TACTL=TASSEL1+TACLR+MC1;
CCR0=50000;
TACCTL0 |= CCIE;
}
void ADC10_SETTINGS ( void )
{
ADC10CTL0 &=~ ENC; // 设置ADC10CTL 先将此位清0,丧失ADC10功能 才修能改
ADC10DTC0 |= ADC10CT; // 选择连续转移数据
ADC10CTL0 |= SREF_0; // AVSS 为负参考电压,AVCC为正参考电压
ADC10CTL0 |= ADC10SHT_3; // ADC10 采样保持时间为64个ADC10CLKs
ADC10CTL0 &=~ ADC10SR; // 采样速率 选用 200KSPS
ADC10CTL0 &=~ REFOUT; // 关闭内部参考电压输出
ADC10CTL0 &=~ REFBURST; // 内部参考电压连续补足
ADC10CTL0 |= MSC; // 系列采样时,此位须置位
ADC10CTL0 &=~ REF2_5V; // 选择内部 1.5V 参考电压
ADC10CTL0 &=~ REFON; // 不启用内部参考电压
ADC10CTL0 |= ADC10IE; // 允许 ADC10 采样中断
ADC10CTL0 &=~ ADC10IFG; // 初始先清楚 ADC10中断标记位
ADC10CTL0 |= ADC10ON; // 开启 ADC10 采样功能
ADC10CTL1 |= INCH_2; // AD 采样通道选择从A2开始 到A0
ADC10CTL1 |= SHS_0; // 选启 ADC10 内部采样时时钟发生器 ADC10OSC
ADC10CTL1 &=~ ADC10DF; // 采样结果以二进制格式存放
ADC10CTL1 &=~ ISSH; // 采样输入信号不反转
ADC10CTL1 |= ADC10DIV_1; // 对采样时钟源进行 2分频
ADC10CTL1 |= CONSEQ_1; // 多通道单次采样
ADC10DTC1 = 3; // 连续采样3次中断一次
ADC10SA = (unsigned int)ad_value+1; // ADC10 数据转移起始地址
}
void START_ADC10( void )
{
ADC10CTL0 |= ADC10SC + ENC;
}
void FORMAT_DATA( void )
{
unsigned char count,j=2;
for(count=0;count<3;count++)
{
result[j] = (unsigned int)((2.99 * ad_value[count] / 1023
)*1000);
j=j-1;
}
_NOP(); // 在此设断点查看 RESULT 数组的值
}
void main( void )
{
WDTCTL=WDTPW+WDTHOLD;
BCSCTL1 =CALBC1_1MHZ;
DCOCTL =CALBC1_1MHZ;
ADC10_SETTINGS();
TIMER_A_SETTINGS();
_BIS_SR(GIE+LPM1_bits);
while(1)
{
if(ADC10FLAG==1)
{
FORMAT_DATA();
ADC10FLAG = 0;
}
_BIS_SR(GIE+LPM1_bits);
}
}
#pragma vector = ADC10_VECTOR
__interrupt void ADC10_ISR(void)
{
ADC10FLAG=1;
}
#pragma vector = TIMERA0_VECTOR
__interrupt void TIMER_A_ISR(void)
{
_BIC_SR_IRQ(LPM1_bits);
CCR0=50000;
START_ADC10();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -