打印

AD转换问题

[复制链接]
1447|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yxldianqi2|  楼主 | 2013-3-20 10:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我使用MSP430f1611周期性采集交流电压 每个500us采集一次 当程序运行设置断点在定时中断里面 前面6次能正常进行到了第7次程序就不按照先前6次运行的那样运行  ADC12CTL0的值前6次都是0892到了第7次开始就乱变了  求大神帮忙看看程序是哪儿没对
  void main(void)
{
P6DIR&=~BIT0;//P6。0为输入,ADC0
P6SEL|=BIT0;//P6.0 用于模拟输入通道A0
P6DIR|=BIT6;//P6.6为输出,DAC0
P1DIR|=0xFF;//P1为输出(接74HC595、CD4051地址位、数码管位选择)

P2DIR&=~0x0F;//P2为输入 (接按键)
P2IES=0xff;//设置 P2 口中断是下降沿触发
P2IE=0xff;//允许 P2 口中断
P3DIR|=0xFF;
P3OUT|=BIT0; P3OUT|=BIT3; P3OUT|=BIT4; P3OUT|=BIT5;
Init_CLK();
Adcvolt();
Init_TimerA();  //AD 定时器 时钟初始化
_EINT();
for(;;)
{
}
}
void Init_TimerA(void)
{
        // 选择SMCLK,清除TAR
    TACTL = TASSEL1 + TACLR;
        // 1/8 SMCLK
    TACTL += ID1;
    TACTL += ID0;             
        // CCR0 中断允许
    CCTL0 = CCIE;
       
        // 时间间隔为 500us
    CCR0 = 500;
        // 增记数模式
    TACTL |= MC0;                       
    return;
}
void Init_CLK(void)
{
    unsigned int i;
    BCSCTL1 = 0X00;        //将寄存器的内容清零
                                        //XT2震荡器开启
                                        //LFTX1工作在低频模式
                                        //ACLK的分频因子为1
                                       
    do
    {
        IFG1 &= ~OFIFG;                       // 清除OSCFault标志
        for (i = 0x20; i > 0; i--);               
    }
    while ((IFG1 & OFIFG) == OFIFG);      // 如果OSCFault =1   
                                       
    BCSCTL2 = 0X00;                        //将寄存器的内容清零
    BCSCTL2 += SELM1;                //MCLK的时钟源为TX2CLK,分频因子为1
    BCSCTL2 += SELS;                //SMCLK的时钟源为TX2CLK,分频因子为1
}

void Adcvolt(void)                         //进行电压转换时 ADC12 的初始化
{
    ADC12CTL0 &= ~(ENC);         
    //设置参考电压分别为AVSS和AVCC,输入通道为A0
    ADC12MCTL0 = INCH_0 + EOS;            
    //转换的起始地址为:ADCMEM0
    ADC12CTL1 = 0X00;
    ADC12CTL1 += CSTARTADD_0;
        //采样脉冲由采用定时器产生
    ADC12CTL1 += SHP;       
        //转换模式为:多通道、多次转换
    ADC12CTL1 += CONSEQ_1;       
        //内部时钟源
    ADC12CTL1 += ADC12SSEL_0;
        //时钟分频为1
    ADC12CTL1 += ADC12DIV_0;               
   
    ADC12CTL0 += 8 * 0x100;
    ADC12CTL0 += MSC;
    ADC12CTL0 += ADC12ON;
   
    ADC12IE = 0;
        //关闭各个通道的转换中断
               
    //使能ADC转换
    ADC12CTL0 |= ENC;                       
    return;


}

// ADC12 interrupt service routine
  #pragma vector=TIMERA0_VECTOR

__interrupt void TIMERA_ISR(void)
{
    int results;
        // 关闭转换
    ADC12CTL0 &= ~ENC;                       
    // 读出转换结果
    results = ADC12MEM0;                                          
    ADC_BUF[index] = results;
    // 计数器加1
    index += 1;
        // 采集完40个点
    if(index == 40)
    {
                // 设置标志
        nADC_Flag = 1;
                // 计数器清0
        index = 0;
    }         
        // 开启转换
    ADC12CTL0 |= ENC + ADC12SC;       

}

相关帖子

沙发
Socrazyman| | 2013-3-20 15:03 | 只看该作者

使用特权

评论回复
板凳
yang0302| | 2013-4-24 10:11 | 只看该作者
是不是到了第七次就是一个周期然后就乱咯! 我大学里了解了一点儿!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

8

帖子

0

粉丝