打印

求助2812AD采样到的电压值为什么总是1.5V?

[复制链接]
2528|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
thf2008|  楼主 | 2009-8-16 14:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
linhai2009| | 2009-8-16 18:02 | 只看该作者
AD采样总是1.5,应该从你的输入模拟量来考虑为什么是1.5啦
如果输入在变化,就看看寄存器,也许没有使能什么的

使用特权

评论回复
板凳
thf2008|  楼主 | 2009-8-17 10:16 | 只看该作者
我试试过了,输入变化时也不能正常采样。
下面是我主程序和ad中断程序,基本上都是例程,运行后能进入中断,但不能正确采样,我查看计算后的采样值a1[0]、a1[1]又都为1.3V,而且始终不变。我使用了两通道,有输入电压的通道是A1。
这几天被这个问题搞的郁闷死了,请帮我看下问题出在哪?
谢谢~
void main(void)
{
        InitSysCtrl();
        EALLOW;
           SysCtrlRegs.HISPCP.all = 0x3;        // HSPCLK = SYSCLKOUT/6
           EDIS;
        DINT;
        IER = 0x0000;
        IFR = 0x0000;

        InitPieCtrl();

        InitPieVectTable();        
        
        InitAdc();
        EALLOW;        // This is needed to write to EALLOW protected registers
        PieVectTable.ADCINT=&ad;
        EDIS;   // This is needed to disable write to EALLOW protected registers

    // Enable INT14 which is connected to CPU-Timer 2:
    PieCtrl.PIEIER1.bit.INTx6=1;
        IER |= M_INT1;
        EINT;   // Enable Global interrupt INTM
        ERTM;        // Enable Global realtime interrupt DBGM

// Configure ADC
    AdcRegs.MAX_CONV.all = 0x0001;       // Setup 2 conv's on SEQ1
    AdcRegs.CHSELSEQ1.bit.CONV00 = 0x0; // Setup ADCINA0 as 1st SEQ1 conv.
    AdcRegs.CHSELSEQ1.bit.CONV01 = 0x1; // Setup ADCINA1 as 2nd SEQ1 conv.
    AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1 = 1;  // Enable EVASOC to start SEQ1
    AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;  // Enable SEQ1 interrupt (every EOS)

    // Configure EVA
    // Assumes EVA Clock is already enabled in InitSysCtrl();
    EvaRegs.T1CMPR = 0x0080;               // Setup T1 compare value
    EvaRegs.T1PR = 0xFFFF;                 // Setup period register
    EvaRegs.GPTCONA.bit.T1TOADC = 1;       // Enable EVASOC in EVA
    EvaRegs.T1CON.all = 0x1042;            // Enable timer 1 compare (upcount mode)
while(1)
        {}
}         

interrupt void ad(void)
{
         a2++;
        a1[0]=(AdcRegs.RESULT0)*3.0/65536.0+adclo;
        a1[1]=(AdcRegs.RESULT1)*3.0/65536.0+adclo;
        
    AdcRegs.ADCTRL2 .bit.RST_SEQ1=1;
    AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR=1;
        PieCtrl.PIEACK.all=0xffff;
        return;
}

使用特权

评论回复
地板
linhai2009| | 2009-8-17 10:27 | 只看该作者
根据你的要求,拿一个试验程序一改不就好了么
半小时的事

使用特权

评论回复
5
thf2008|  楼主 | 2009-8-18 16:00 | 只看该作者
这个就是实验程序了,而且我用的是AD的例程,但就是采样不了
不知道问题出在哪

使用特权

评论回复
6
linhai2009| | 2009-8-18 16:09 | 只看该作者
ADCLO接地了吗?

使用特权

评论回复
7
angelguard| | 2009-8-19 20:05 | 只看该作者
晕死,AD初始化时有个上电时序的,你的那个上电时序对不对啊,是不是时间不够长啊,我估计十有**是这个问题

使用特权

评论回复
8
thf2008|  楼主 | 2009-8-21 20:34 | 只看该作者
如果是这样的话,应该在那里加延时?

使用特权

评论回复
9
thf2008|  楼主 | 2009-8-23 13:15 | 只看该作者
回复6楼:接了的~~~~

使用特权

评论回复
10
thf2008|  楼主 | 2009-8-23 13:16 | 只看该作者
我看了下AdcRegs.RESULT(从0到15)都有数,而且都一样,但是我没有给输入电压啊。

使用特权

评论回复
11
thf2008|  楼主 | 2009-8-23 13:18 | 只看该作者
程序如下:
//编译前确保CPU时钟频率在DSP281x_Examples.h 中正确定义
#include "DSP281x_Device.h"     
#include "DSP281x_Examples.h"   
interrupt void adc_isr(void);
//全局变量定义
Uint16 LoopCount;
Uint16 ConversionCount;
Uint16 Voltage1[3];
Uint16 Voltage2[3];
main()
{
   InitSysCtrl();
   //高速外围时钟定标寄存器,配置:系统时钟/6=25Mhz (系统时钟150Mhz)
   EALLOW;
   SysCtrlRegs.HISPCP.all = 0x3;  //外围高速时钟HSPCLK = 系统时钟/(2*HISPCP)
   EDIS;
   DINT;
   InitPieCtrl();
   IER = 0x0000;
   IFR = 0x0000;
   InitPieVectTable();
   EALLOW;  
   PieVectTable.ADCINT = &adc_isr;
   EDIS;   
   InitAdc();             //初始化ADC
   //在PIE中使能ADCINT
   PieCtrlRegs.PIEIER1.bit.INTx6 = 1;
   IER |= M_INT1;         //使能CPU中断1
   EINT;                  //使能全局中断INTM
   ERTM;                  //使能全局实时中断 DBGM
   LoopCount = 0;
   ConversionCount = 0;
   //配置ADC
   AdcRegs.ADCTRL3.bit.ADCCLKPS =0;        
   AdcRegs.ADCTRL1 .bit.CPS =0;            //配置ADClk 时钟

   AdcRegs.ADCMAXCONV.all = 0x0008;        //最大转换通道寄存器
   AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;  //输入通道选择排序寄存器
  // AdcRegs.ADCCHSELSEQ1.all = 0x1110;  //输入通道选择排序寄存器
  // AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x2;  //输入通道选择排序寄存器
   AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1 = 1;   //使能 EVASOC 启动 SEQ1
   //AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1;     //软件启动 SEQ1
   AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;   //使能 SEQ1 中断
   AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;       //级联排序器操作,双(0)单(1)
   //配置EVA
   EvaRegs.T1CMPR = 0x0080;               //Timer1比较寄存器(当前的比较值)
   EvaRegs.T1PR = 0xFFFF;                 //Timer1周期寄存器(当前的周期值)
   EvaRegs.GPTCONA.bit.T1TOADC = 1;       //使能 EVASOC in EVA
   EvaRegs.T1CON.all = 0x1042;            //Timer1控制寄存器;TMODE 连续增;Timer 使能;Timer 比较使能
   //等待ADC中断
   while(1)
   {
      LoopCount++;
    }
}
interrupt void  adc_isr(void)
{

     Voltage1[ConversionCount] = AdcRegs.ADCRESULT0 >>4;
     Voltage2[ConversionCount] = AdcRegs.ADCRESULT1 >>4;
     if(ConversionCount == 2)
         {
            ConversionCount = 0;
    }
       else ConversionCount++;
      //重新初始化,等待下一个 ADC 结果
       AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;         //重启 SEQ1
       AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;       //清除 INT SEQ1 位
       PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;   //允许 PIE 中断
    return;
}
请教 为什么一直是2048呢,(AdcRegs.ADCRESULT(0~15)都是32768)程序哪有问题?

使用特权

评论回复
12
linhai2009| | 2009-8-23 13:33 | 只看该作者
void Init_adc()
{
        unsigned int i;
        
        AdcRegs.ADCTRL1.bit.RESET=1;//复位adc模块
        for(i=0;i<5000;i++)        ;
        AdcRegs.ADCTRL1.bit.RESET=0;

        AdcRegs.ADCTRL1.bit.SUSMOD=3; //仿真暂停时,序列发生器和其他数字电路逻辑立即停止
        AdcRegs.ADCTRL1.bit.ACQ_PS=0; //采集窗口大小,决定SOC脉冲宽度
        AdcRegs.ADCTRL1.bit.CPS=0;    //fckl=clk/1 clk=hspclk
        AdcRegs.ADCTRL1.bit.CONT_RUN=0; // 启动停止方式 如果是1,连续转换方式
        AdcRegs.ADCTRL1.bit.SEQ_CASC=1;  //级联方式,如果是0就是双序列发生器方式
        
        AdcRegs.ADCTRL3.bit.ADCBGRFDN=3; //带隙和参考电路加电
        for(i=0;i<10000;i++)        ;  //延时
        AdcRegs.ADCTRL3.bit.ADCPWDN=1;  //核中的模拟电路加电
        for(i=0;i<5000;i++)        ;   //延时
        AdcRegs.ADCTRL3.bit.ADCCLKPS=15; //核时钟分频器 hspclk/[30*(adctrl1[7]+1]
        AdcRegs.ADCTRL3.bit.SMODE_SEL=0;  //序列采样方式
        
        AdcRegs.ADCMAXCONV.bit.MAX_CONV1 =0x0f;  //16通道;实际用到12通  
        
        AdcRegs.ADCCHSELSEQ1.bit.CONV00=0;   //设置adcina0
        AdcRegs.ADCCHSELSEQ1.bit.CONV01=1;  ////设置adcina1
        AdcRegs.ADCCHSELSEQ1.bit.CONV02=2;
        AdcRegs.ADCCHSELSEQ1.bit.CONV03=3;
        AdcRegs.ADCCHSELSEQ2.bit.CONV04=4;   
        AdcRegs.ADCCHSELSEQ2.bit.CONV05=5;
        AdcRegs.ADCCHSELSEQ2.bit.CONV06=6;
        AdcRegs.ADCCHSELSEQ2.bit.CONV07=7;
    AdcRegs.ADCCHSELSEQ3.bit.CONV08=8;   
        AdcRegs.ADCCHSELSEQ3.bit.CONV09=9;
        AdcRegs.ADCCHSELSEQ3.bit.CONV010=10;
        AdcRegs.ADCCHSELSEQ3.bit.CONV011=11;
        AdcRegs.ADCCHSELSEQ4.bit.CONV12=12;   
        AdcRegs.ADCCHSELSEQ4.bit.CONV13=13;
        AdcRegs.ADCCHSELSEQ4.bit.CONV14=14;
        AdcRegs.ADCCHSELSEQ4.bit.CONV15=15;
        
        AdcRegs.ADCST.bit.INT_SEQ1_CLR=1; //清除seq1中断标志
        AdcRegs.ADCST.bit.INT_SEQ2_CLR=1;        //清除seq2中断标志
        
        AdcRegs.ADCTRL2.bit.EVB_SOC_SEQ=0;  //1是设置允许序列发生器被事件管理器B启动 0不起作用
        AdcRegs.ADCTRL2.bit.RST_SEQ1=0;  //1是复位序列发生器1 0不起作用
        AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1; //INT_ENA_SEQ1中断请求使能
        AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1=0;  //在每一个seq1结束时置位INT FLAG SEQ1
        AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=0;  //不能通过EVA触发启动SEQ1
        AdcRegs.ADCTRL2.bit.EXT_SOC_SEQ1=0;  //外部信号启动转换位不起作用
        AdcRegs.ADCTRL2.bit.RST_SEQ2=0;   //如果为1 复位SEQ2
        AdcRegs.ADCTRL2.bit.SOC_SEQ2=0;  //如果为1,启动SEQ2的转换触发
        AdcRegs.ADCTRL2.bit.INT_ENA_SEQ2=0;  //SEQ2中断请求无效
        AdcRegs.ADCTRL2.bit.INT_MOD_SEQ2=0;  
        AdcRegs.ADCTRL2.bit.EVB_SOC_SEQ2=0;
        AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;   //启动SEQ1转换
               
}

使用特权

评论回复
13
linhai2009| | 2009-8-23 13:34 | 只看该作者
我看你程序里好多地方都没有设置,不知道是不是设置有错误

使用特权

评论回复
14
thf2008|  楼主 | 2009-8-24 10:59 | 只看该作者
谢谢楼上的,改了一些设置后就好了

使用特权

评论回复
15
linhai2009| | 2009-8-24 11:07 | 只看该作者
果然是这个问题

使用特权

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

本版积分规则

221

主题

2024

帖子

2

粉丝