做一个简单的28335ADC采样 但是采样值一直不正确

2019-07-19 16:50发布

只做一个简单的ADC采样,但是才扬州一直不正确,无论输入什么,是接地还是悬空还是接到一个直流电压的正极,ADCRESULT显示一直是FXXX到EXXX跳动,到底是为什么呢   ADCLO也接地试过 输出并没有变化  
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
江心秋月白
1楼-- · 2019-07-19 18:15
#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File

interrupt void adc_isr(void);

Uint16 LoopCount;
Uint16 ConversionCount;
Uint16 Voltage1[10];



main()
{


   InitSysCtrl();


   EALLOW;
   #if (CPU_FRQ_150MHZ)     // Default - 150 MHz SYSCLKOUT
     #define ADC_MODCLK 0x3 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 150/(2*3)   = 25.0 MHz
   #endif
   #if (CPU_FRQ_100MHZ)
     #define ADC_MODCLK 0x2 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 100/(2*2)   = 25.0 MHz
   #endif
   EDIS;

   DINT;

   InitPieCtrl();

// Disable CPU interrupts and clear all CPU interrupt flags:
   IER = 0x0000;
   IFR = 0x0000;

   InitPieVectTable();


   EALLOW;  
   PieVectTable.ADCINT = &adc_isr;
   EDIS;   

   InitAdc();  // For this example, init the ADC

// Step 5. User specific code, enable interrupts:

// Enable ADCINT in PIE
   PieCtrlRegs.PIEIER1.bit.INTx6 = 1;
   IER |= M_INT1; // Enable CPU Interrupt 1
   EINT;          // Enable Global interrupt INTM
   ERTM;          // Enable Global realtime interrupt DBGM

   LoopCount = 0;
   ConversionCount = 0;

   AdcRegs.ADCMAXCONV.all = 0x0000;       // Setup 1 conv's on SEQ1
   AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x7; // Setup ADCINA0 as 1st SEQ1 conv.
   AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1;// Enable SOCA from ePWM to start SEQ1
   AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;  // Enable SEQ1 interrupt (every EOS)


       EPwm1Regs.ETSEL.bit.SOCAEN = 1;        // Enable SOC on A group  ADC转换序列A启动使能位 1使能
   EPwm1Regs.ETSEL.bit.SOCASEL = 4;       // Select SOC from from CPMA on upcount  EPWMxSOCA脉冲生成选择位
                                                       //100:计数器增加时,TBCTR=CMPA
   EPwm1Regs.ETPS.bit.SOCAPRD = 1;        // Generate pulse on 1st event  该位决定发生多少个事件后产生EPWMxSOCA
                                                   
   
   EPwm1Regs.TBPRD = 0xFFFF;              // Set period for ePWM1 确定定时器的周期,设置PWM的频率
                                              //2^16=65536
                                              //PWM的周期也就是采样周期为[1/(75*1000000)]*65536
   EPwm1Regs.TBCTR=0X0000;                 //清除TB计数器
   
   EPwm1Regs.TBCTL.bit.CTRMODE = 0;                  // count up and start定时器计数模式  00:连续增模式
   


// Wait for ADC interrupt
   for(;;)
   {
      LoopCount++;
   }

}


interrupt void  adc_isr(void)
{

  Voltage1[ConversionCount] = AdcRegs.ADCRESULT0 >>4;

  // If 40 conversions have been logged, start over
  if(ConversionCount == 9)
  {
     ConversionCount = 0;
  }
  else ConversionCount++;

  // Reinitialize for next ADC sequence
  AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;         // Reset SEQ1
  AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;       // Clear INT SEQ1 bit
  PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;   // Acknowledge interrupt to PIE

  return;
}


江心秋月白
2楼-- · 2019-07-19 22:50
这是源程序 就是官网例程简单修改   在板上输入是接的A7也没有接错
江心秋月白
3楼-- · 2019-07-19 23:05
 精彩回答 2  元偷偷看……
zhangmangui
4楼-- · 2019-07-19 23:29
刷新时寄存器值跳动说明配置应该是对的
下载controlSUITE里面的例子先试试

一周热门 更多>