⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 tmw320lf2407的ad采样代码。
💻 C
字号:
/*Main.c*/ 
/*AD采样基本程序,并带有排队滤波函数
  采样结果的精度与稳定性与基准源和信号源有关
  请在项目开发的时候选择稳定的电压基准源*/
#include "global.c" 
#include "math.h" 

void SystemInit();
void Timer1Init(); 
void KickDog();  
void SPI_Init(); 
void DA_OUT(unsigned CHANNEL,unsigned int RNG,unsigned int SPI_DATA);
void AD_Sample(); 
void Que();
int numled0=200;   
unsigned int t0=0,i=0,j=0;   
unsigned int RESULT_L[8];  
int  AD0[300],AD_0,lo[512];
//signed int RESULT_0=0;  
//float  AD0[2000],AD_0,lo[512];
unsigned int AD_FLAG=0;
float AD_SIG0=0.0,AD_SIG8=0.0;   
ioport unsigned int port8,port1,port2;
unsigned int *addr=(unsigned int *)0xa000;

void main(void)
{     
   SystemInit();         		//系统初始化
   for(i=0;i<256;i++)
   {
     lo[i]=100*cos((2*3.1415926*i)/256);
   }
   for(i=0;i<300;i++)
   {
     AD0[i]=0;
   }   
   
   MCRA=0x0003; 	    	//IOPA2-7,B0-7设为IO口模式
  // PBDATDIR=0xFFC2;   	    	//所有LED=0 
   //PBDATDIR=PBDATDIR |0x003D;  	//所有LED=1   
   
   port8=0xff;
   
 //  SPI_Init(); 
   
 //  DA_OUT(0,0,192);            	//2.475V,Voltage范围0-255对应0-3.3V
 //  DA_OUT(1,0,128);           	//1.65V,Voltage范围0-255对应0-3.3V
//   DA_OUT(2,0,192);            	//2.475V,Voltage范围0-255对应0-3.3V
//   DA_OUT(3,0,128);           	//1.65V,Voltage范围0-255对应0-3.3V
     
     i=0;
     
 //  Timer1Init();          		//定时器初始化
 //  asm(" CLRC INTM ");
   //EINT;
  // DINT;
  ///////////////////////////////////
    ADCTRL1=0x4000;			/* ADC模块复位 reset*/
    asm(" NOP ");
    ADCTRL1=0x0020;         /* 自由运行,启动/停止模式,双排序器工作模式 3*/
   // ADCTRL1 =0x0060;         /* 自由运行,cont,双排序器工作模式 3*/
    MAXCONV=0x0007;          //max  channal number
    CHSELSEQ1=0x3210;       //第0通道
    CHSELSEQ2=0x7654;       //第0通道
    ADCTRL2=0x4000;         //复位使排序器指针指向CONV00
    ADCTRL2=0x2000;			/* 启动ADC转换 */
   while(i<8)
   { // 	 PADATDIR=PADATDIR & 0xFFFE;    //IOPA0=0;LED灭  
	  //   PADATDIR=PADATDIR |0x0101;     //IOPA0=1;LED亮  
   for(i=0;i<8;i++)
   {
     AD0[i]=0;
   } 
    AD_Sample();  
    for(i=0;i<8;i++)
    {          
	  AD0[i]=RESULT_L[i];
	}  
// T1CNT=0;
	EVAIFRA=0x80;       
   } 
   
   PADATDIR=0xE808;  //PA3,5,6,7输出。3=1。5,6,7=0,选择AV0作为AD输入。
    
   while(1)
   {
       port2=0xff;        //地址线=0x0002,ADCONV=0,启动片外AD。
       for(i=0;i<1000;i++);
      *addr=port1;        //读端口1数据,此时ADCS有效。
      addr++;  
   }      
}

void AD_Sample()
{ // PADATDIR=PADATDIR & 0xFFFE;    //IOPA0=0;LED灭  
	
	port8=0xff;     
   // ADCTRL1=0x4000;			/* ADC模块复位 reset*/
   // asm(" NOP ");
    //ADCTRL1=0x0020;         /* 自由运行,启动/停止模式,双排序器工作模式 3*/
    //ADCTRL1 =0x0060;         /* cont,*/
    
   //MAXCONV=0x0007;          //max  channal number
   // CHSELSEQ1=0x3210;       //第0通道
   // CHSELSEQ2=0x7654;       //第0通道
    ADCTRL2=0x4000;         //复位使排序器指针指向CONV00
    ADCTRL2=0x2000;			/* 启动ADC转换 */
    while((ADCTRL2&0x1000)==0x1000);		/*等待转换完成 */
    asm(" NOP ");
    asm(" NOP "); 
    for(i=0;i<8;i++)
    {
       RESULT_L[i]=0;       
    }
    i=0;
    RESULT_L[0]=RESULT0>>6;
    RESULT_L[1]=RESULT1>>6;
    RESULT_L[2]=RESULT2>>6;
    RESULT_L[3]=RESULT3>>6;
    RESULT_L[4]=RESULT4>>6;
    RESULT_L[5]=RESULT5>>6;
    RESULT_L[6]=RESULT6>>6;
    RESULT_L[7]=RESULT7>>6;
    port8=0x00;
//    PADATDIR=PADATDIR |0x0101;     //IOPA0=1;LED亮 

  //  MAXCONV=0x0000;         //第8通道          
 //   CHSELSEQ3=0x0008;
 //   ADCTRL2=0x0040;
 //   ADCTRL2=0x0020;
   // while( (ADCTRL2&0x0010)==0x0010);  
   // asm(" NOP ");
 //   asm(" NOP ");
  //  RESULT_8=RESULT8//>>6;       
}

void c_int2()               /*定时器1中断服务程序*/
{

 /*   if(PIVR!=0x27)
		{  	asm(" CLRC INTM ");
			return;
		}
	T1CNT=0; 
	t0++;
	numled0--;
	if(numled0==0)
	{
		numled0=200;
		if((PBDATDIR & 0x0001)==0x0001) 
			PBDATDIR=PBDATDIR & 0xFFFE;    	//IOPB0=0;LED灭  
		else
			PBDATDIR=PBDATDIR |0x0101;     	//IOPB0=1;LED亮 
	}
	if((AD_FLAG==0)&((t0%100)==0))     //定时AD采样
	{  
	    AD_FLAG=1;
	}*/
	AD_Sample();
	AD0[i++]=RESULT_L[i];
	T1CNT=0;
	EVAIFRA=0x80; 
	asm(" CLRC	INTM ");   	
}  

void SystemInit() 
{   
	asm(" SETC	INTM ");	/* 关闭总中断 */
	asm(" CLRC  SXM  ");	/* 禁止符号位扩展 */ 
	asm(" CLRC  CNF  ");    /* B0块映射为 on-chip DARAM*/
	asm(" CLRC  OVM  ");    /* 累加器结果正常溢出*/
//	SCSR1=0x87FE;         	/* 系统时钟CLKOUT=20*2=40M */PLL=1*clk
//	SCSR1=0x83FE;         	/* 系统时钟CLKOUT=20*2=40M */
    SCSR1=0x81FE;         	/* 系统时钟CLKOUT=6*4=40M */
	   						/* 打开ADC,EVA,EVB,CAN和SCI的时钟*/
	WDCR=0x006F;			/* 禁止看门狗,看门狗时钟64分频 */ 
//	KickDog();    			/* 初始化看门狗 */  
    IFR=0xFFFF;				/* 清除中断标志 */
    IMR=0x0002;				/* 打开中断2*/        
}  

void Timer1Init()           
{ 
    EVAIMRA=0x0080;			//  定时器1周期中断使能 
    EVAIFRA=0xFFFF;			//  清除中断标志 
    GPTCONA=0x0000;
//	T1PR=2500;				//  定时器1初值,定时0.4us*2500=1ms 			
    T1PR=40;			
	T1CNT=0;                  //clear T1
//	T1CON=0x144E;           //增模式, TPS系数40M/16=2.5M,T1使能
   T1CON=0x144E;           //增模式, TPS系数20M/1=20M,T1使能
	
//	KickDog();    			/* 初始化看门狗 */  				
}  

void SPI_Init()             //SPI-DA初始化
{
    MCRB=MCRB | 0x0014;     //SPISIMO,SPICLK特殊功能方式 
    PBDATDIR=PBDATDIR | 0x0002;    	//CS_DA=1
    SPICCR=0x004a;          //11bit数据
    SPICTL=0x0006;          //禁止中断
    SPIBRR=0x0027;          	//1M波特率,40M/40=1M
    SPICCR=SPICCR | 0x80;   

}

void DA_OUT(unsigned CHANNEL,unsigned int RNG,unsigned int SPI_DATA)
{  
    unsigned char flag=0;
    SPITXBUF=(CHANNEL<<14)|(RNG<<13)|(SPI_DATA<<5) ;     	//bit10,9~CHANNEL;bit8~RNG倍数
    while(1)
    {
    flag=SPISTS&0x40;
    if(flag==0x40)     break;
    }
    SPIRXBUF=SPIRXBUF;/*虚读寄存器以清除中断标志*/      

   	PBDATDIR=PBDATDIR & 0xFFFD;		//CS_DA=0,更新模拟信号输出   
   	for(i=0;i<5;i++);              //延时
    PBDATDIR=PBDATDIR | 0x0002;    	//CS_DA=1,锁存数据   
}

void KickDog()				/*踢除看门狗 */
{
	WDKEY=0x5555;
	WDKEY=0xAAAA;
}

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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -