ad_sample.c

来自「开发环境为CCS。DSP12个典型例子源码」· C语言 代码 · 共 206 行

C
206
字号
// TI File $Revision: /main/3 $
// Checkin $Date: July 2, 2007   11:33:46 $
//###########################################################################
//
// FILE:   AD_SAMPLE.c
//
// TITLE:  DSP2812 AD_SAMPLE Example Program.
//
// ASSUMPTIONS:
//
//   This program requires the DSP281x V1.00 header files.  
//   As supplied, this project is configured for "boot to H0" operation.
//
//   Make sure the CPU clock speed is properly defined in 
//   DSP281x_Examples.h before compiling this example.
//
//    
//
//###########################################################################
// $TI Release: DSP281x Header Files V1.11 $
// $Release Date: September 26, 2007 $
//###########################################################################

#include "DSP281x_Device.h"     // DSP281x Headerfile Include File
#include "DSP281x_Examples.h"   // DSP281x Examples Include File

// Prototype statements for functions found within this file.
void DA_OUT(unsigned CHANNEL,unsigned int RNG,unsigned int SPI_DATA); 
interrupt void cpu_timer0_isr(void);
void Gpio_select(void); 
void SPI_Init();
void AD_Sample(); 
void Que();
unsigned int t0=0,i=0,j=0;  
int Voltage=0;
unsigned int RESULT_0=0,RESULT_8=0;  
unsigned int AD0[18],AD8[18],AD_0,AD_8,AD_FLAG=0;
float AD_SIG0=0.0,AD_SIG8=0.0; 
main() 
{
   /*初始化系统*/
   InitSysCtrl();

   Gpio_select();
   
   /*关中断*/
   DINT;
   IER = 0x0000;
   IFR = 0x0000;
   
   
   /*初始化PIE*/
   InitPieCtrl();
   
   InitPeripheralClocks();
   
   /*初始化PIE中断矢量表*/
   InitPieVectTable();

   InitAdc(); 
 
   EALLOW;  // This is needed to write to EALLOW protected registers
   PieVectTable.TINT0 = &cpu_timer0_isr;
   EDIS;    // This is needed to disable write to EALLOW protected registers
   
// For this example, only initialize the Cpu Timers
   InitCpuTimers();   
// Configure CPU-Timer 0 to interrupt every second:
   ConfigCpuTimer(&CpuTimer0, 150, 1000);
   StartCpuTimer0();
   
   SPI_Init();

// Enable CPU INT1 which is connected to CPU-Timer 0:
   IER |= M_INT1;

// Enable TINT0 in the PIE: Group 1 interrupt 7
   PieCtrlRegs.PIEIER1.bit.INTx7 = 1;

// Enable global Interrupts and higher priority real-time debug events:
   EINT;   // Enable Global interrupt INTM
   ERTM;   // Enable Global realtime interrupt DBGM
   
    DA_OUT(0,0,192);            //2.475范围0-255对应0-3.3V 
    DA_OUT(1,0,128);            //1.65范围0-255对应0-3.3V
    
   for(;;)
   {
   	if(AD_FLAG==1)                
      	{ 
      		AD_FLAG=0;
      	 	for(i=0;i<18;i++) 
      	 	{ 
      	 		AD_Sample();   
      	 		AD0[i]=RESULT_0;
      	 		AD8[i]=RESULT_8;
      	 	}
      	 	Que();		//排队滤波
      	}
      

   }

}

void DA_OUT(unsigned CHANNEL,unsigned int RNG,unsigned int SPI_DATA)
{  
    unsigned int flag=0;
    SpiaRegs.SPITXBUF=(CHANNEL<<14)|(RNG<<13)|(SPI_DATA<<5) ;  //bit10,9~CHANNEL;bit8~RNG倍数
    for(;;)
    {
    flag=SpiaRegs.SPISTS.all&0x40; 
    if(flag==0x40)     break;       //读中断标志位,判断是否发送完毕
    }
    SpiaRegs.SPIRXBUF=SpiaRegs.SPIRXBUF;/*虚读寄存器以清除中断标志*/ 
     
    GpioDataRegs.GPADAT.bit.GPIOA0=0;   //CS_DA=0,更新模拟信号输出   
   	for(i=0;i<5;i++);              //延时
    GpioDataRegs.GPADAT.bit.GPIOA0=1;   //CS_DA=1,锁存数据   
    
}

interrupt void cpu_timer0_isr(void)
{
   CpuTimer0.InterruptCount++;

   // Acknowledge this interrupt to receive more interrupts from group 1
   PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;

    t0++;  
	if((AD_FLAG==0)&((t0%100)==0))     //定时AD采样
	{  		
	    AD_FLAG=1;
	}
   
 

}
void SPI_Init()             //SPI-DA初始化
{
    GpioDataRegs.GPADAT.bit.GPIOA0=1;  //CS_DA=1
    SpiaRegs.SPICCR.all=0x004a;        //11bit数据
    SpiaRegs.SPICTL.all=0x0006;        //禁止中断
    SpiaRegs.SPISTS.all=0x0000;        //清除SPI中断状态位
    SpiaRegs.SPIBRR=0x0095;            //1M波特率
    SpiaRegs.SPICCR.all=SpiaRegs.SPICCR.all|0x0080; //(关键设置位)使SPI退出复位状态
}

void Gpio_select(void)
{
	EALLOW; 
	GpioMuxRegs.GPFMUX.bit.SPISIMOA_GPIOF0=1; //SPISIMO特殊功能方式 
	GpioMuxRegs.GPFMUX.bit.SPICLKA_GPIOF2=1;  //SPICLK特殊功能方式 	
	GpioMuxRegs.GPAMUX.bit.PWM1_GPIOA0=0;
	GpioMuxRegs.GPADIR.bit.GPIOA0=1;
	EDIS;
}

void AD_Sample()
{   

    AdcRegs.ADCTRL1.all=0x3000;         /* 自由运行,启动/停止模式,双排序器工作模式 */
    AdcRegs.ADCMAXCONV.all=0x0000;
    AdcRegs.ADCCHSELSEQ1.all=0x0000;       
    AdcRegs.ADCTRL2.all=0x4000;
    AdcRegs.ADCTRL2.all = 0x2000; 
    RESULT_0=AdcRegs.ADCRESULT8>>6;
    
    AdcRegs.ADCMAXCONV.all=0x0000;    
	AdcRegs.ADCCHSELSEQ3.all=0x0008;
	AdcRegs.ADCTRL2.all=0x0040;
    AdcRegs.ADCTRL2.all = 0x0020;
    RESULT_8=AdcRegs.ADCRESULT0>>6;          
    
 }
void Que()
{
   unsigned int MaxAD0=0;
   unsigned int MinAD0=AD0[0];
   unsigned int MaxAD8=0;
   unsigned int MinAD8=AD8[0];
   unsigned int tempAD0=0;
   unsigned int tempAD8=0;
   for(j=0;j<18;j++)
   {
      if(AD0[j]>MaxAD0)   MaxAD0=AD0[j];
      else if(AD0[j]<MinAD0)   MinAD0=AD0[j]; 

      if(AD8[j]>MaxAD8)   MaxAD8=AD8[j];
      else if(AD8[j]<MinAD8)   MinAD8=AD8[j];  
     
   }  
   for(j=0;j<18;j++)
   {
      tempAD0=tempAD0+AD0[j];
      tempAD8=tempAD8+AD8[j];
    } 
    AD_0=(tempAD0-MaxAD0-MinAD0)/16; 
    AD_8=(tempAD8-MaxAD8-MinAD8)/16; 
    AD_SIG0=AD_0*4.983/1023;    		//1023~3.3*(10+5.1)/10=4.983V,对应满量程
    AD_SIG8=AD_8*4.983/1023;            //电路中采用的是5.1k和10k的电阻分压
    asm(" NOP ");          //请将光标移到此处设置断点,并用debug->Animate监测数据
}     


⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?