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

📄 main.c

📁 TI TMS320LF2407A A/D 转换程序
💻 C
字号:
/*Main.c*/ 
/*AD采样基本程序,并带有排队滤波函数
  采样结果的精度与稳定性与基准源和信号源有关
  请在项目开发的时候选择稳定的电压基准源*/
#include "global.c" 
void SystemInit();
void Timer1Init(); 
void KickDog();  

void AD_Sample(); 
void Que();
   
unsigned int t0=0,i=0,j=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;   
static int test1=0;

void SCI_Init();
void SCI_Send();

main()
{  

   SystemInit();         		//系统初始化
   
   MCRA=MCRA & 0xC0FF; 	    	//IOPB0-6设为IO口模式
   
   SCI_Init(); 
  
   Timer1Init();          		//定时器初始化
   asm(" CLRC INTM ");
   while(1)
   {
     if(AD_FLAG==1)                
      	{ 
      		AD_FLAG=0;
      	 	for(i=0;i<18;i++) 
      	 	{ 
      	 		AD_Sample();   
      	 		AD0[i]=RESULT_0;
      	 		AD8[i]=RESULT_8;
      	 	}
      	 	Que();			//排队滤波
      	}
    SCI_Send();
   }
   
}

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

void Timer1Init()           
{ 

    EVAIMRA=0x0080;			//  定时器1周期中断使能 
    EVAIFRA=0xFFFF;			//  清除中断标志 
    GPTCONA=0x0000;
	T1PR=2500;				//  定时器1初值,定时25ns*400=10us 			
	T1CNT=0;
	T1CON=0x144E;           //增模式, TPS系数40M/16=2.5M,T1使能
				
}  

void AD_Sample()
{   

    ADCTRL1=0x4000;			/* ADC模块复位 */
    asm(" NOP	");
    ADCTRL1=0x0020;         /* 自由运行,启动/停止模式,双排序器工作模式 */
    
    MAXCONV=0x0000; 
    CHSELSEQ1=0x0000;       //第0通道
    ADCTRL2=0x4000;         //复位使排序器指针指向CONV00
    ADCTRL2=0x2000;			/* 启动ADC转换 */
    while( (ADCTRL2&0x1000)==0x1000);		/*等待转换完成 */
    asm(" NOP ");
    asm(" NOP "); 
    RESULT_0=RESULT0>>6; 
            
    MAXCONV=0x0000;         //第8通道          
    CHSELSEQ3=0x0008;
    ADCTRL2=0x0040;
    ADCTRL2=0x0020;
    while( (ADCTRL2&0x0010)==0x0010);  
    asm(" NOP ");
    asm(" NOP ");
    RESULT_8=RESULT8>>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监测数据
}     

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

    if(PIVR!=0x27)
		{  	asm(" CLRC INTM ");
			return;
		}
	T1CNT=0; 
	t0++;
	
    if((AD_FLAG==0)&((t0%100)==0))     //定时AD采样
	{  
	    AD_FLAG=1;
	}
	EVAIFRA=0x80; 
	asm(" CLRC	INTM ");   
	
}  

void SCI_Init()
{  
    MCRA=MCRA | 0x0003;		//IOPA0, IOPA1为串口

	SCICCR=0x0007;   		//空闲多处理器模式,8位数据

⌨️ 快捷键说明

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