我用430f149的A0到A6通道采集Ia-Ua-Ib-Ub-Ic-UC,由定时器A定时采样,初步为1ms采样1次。当P1.0口有上升沿时触发定时器,下一个上升沿关闭定时器,再下一个开启定时器,再下一个关闭......我单步能采集到电压值,为什么连续时就观察不到采样值呢?
语言描述太差,不知道说清楚了没?没的话在补充
#include "msp430x14x.h"
#include "global.h"
uchar flag1=0; //脉冲标志位
void init_clk();
void init_port();
void main()
{
WDTCTL = WDTPW + WDTHOLD;
init_clk();
init_port();
init_adc12();
init_
timerA();
_EINT();
while(1);
}
void init_clk()
{
int i;
BCSCTL1 &= ~XT2OFF;
for (i=0;i<1024;i++) _NOP();
do
{
IFG1 &= ~OFIFG;
for (i = 0xFF; i > 0; i--);
}
while ((IFG1 & OFIFG) != 0);
BCSCTL2 |= SELM1+SELS;
}
void init_port()
{
//设置P1.0上升沿中断检测频率起始和结束
P1DIR&=~BIT0; //P1.0输入
P1IE|=0x01; //P1.0中断允许
P1IES&=~BIT0; //P1.0上升沿出发
P1IFG&=~BIT0; //P1.0中断标志清除
P6SEL|=0x3F; //使能AD通道A0-A5
}
#pragma vector=PORT1_VECTOR
__interrupt void Port_1()
{
flag1=(flag1+1)%2;
if(flag1==1)
{
start_timerA();
}
else
{
stop_timerA();
}
}
*******************************************adc12.c*******************************************
#include "msp430x14x.h"
#include "global.h"
unsigned char index=0;
unsigned int IAresults[20];
unsigned int UAresults[20];
unsigned int IBresults[20];
unsigned int UBresults[20];
unsigned int ICresults[20];
unsigned int UCresults[20];
/*******************************************
函数名称: ADC12初始化
功 能: 采样变频电压电流的瞬时值
参 数: 无
返 回 值: 无
说 明: 采用430内部2.5V参考电压,序列通道单次转换
********************************************/
void init_adc12()
{
uint i;
ADC12CTL0&=~ENC;
ADC12CTL0|=ADC12ON+REFON+REF2_5V+SHT0_2+MSC; //打开AD内核,启动内部2.5V参考电压,设置采样时钟,多次采样
for(i=0;i<0x3600;i++) //为参考源启动提供延时
{
}
ADC12CTL1|=SHP+CONSEQ_1; //SAMPCON来自采样定时器,序列通道单次转换
ADC12MCTL0=INCH_0+SREF_1; //VR+=Vref+,VR-=AVss,通道A0
ADC12MCTL1=INCH_1+SREF_1; //VR+=Vref+,VR-=AVss,通道A0
ADC12MCTL2=INCH_2+SREF_1; //VR+=Vref+,VR-=AVss,通道A0
ADC12MCTL3=INCH_3+SREF_1; //VR+=Vref+,VR-=AVss,通道A0
ADC12MCTL4=INCH_4+SREF_1; //VR+=Vref+,VR-=AVss,通道A0
ADC12MCTL5=INCH_5+SREF_1+EOS; //VR+=Vref+,VR-=AVss,通道A0,最后序列
ADC12IE|=0x20; //使能中断ADC12IFG.5
ADC12CTL0|=ENC;
}
void start_adc12()
{
// ADC12CTL0|=ENC;
ADC12CTL0|=ADC12SC; //开始转换
}
#pragma vector=ADC_VECTOR
__interrupt void adc_int(void)
{
IAresults[index]=ADC12MEM0;
UAresults[index]=ADC12MEM1;
IBresults[index]=ADC12MEM2;
UBresults[index]=ADC12MEM3;
ICresults[index]=ADC12MEM4;
UCresults[index]=ADC12MEM5;
index++;
}
*******************************************timerA.c*******************************************
#include "msp430x14x.h"
#include "global.h"
/*******************************************
函数名称: 定时器A初始化
功 能: 利用定时器产出1ms的定时,定时启动ADC12采样
参 数: 无
返 回 值: 无
说 明: 定时器时钟SMCLK,赠计数模式工作
********************************************/
void init_timerA()
{
TACTL|=TASSEL1+TACLR; //SMCLK.清除TAR.
CCTL0|=CCIE; //比较模式.允许中断
CCR0=8000; //定时时间1ms
}
void start_timerA() //赠计数模式
{
TACTL|=TASSEL1+TACLR+ID_3;
TACTL|=MC_1;
}
void stop_timerA()
{
TACTL|=MC_0;
}
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A(void)
{
start_adc12();
}
一周热门 更多>