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

📄 ae_sp_2812xadc.c

📁 适合TMS320F2812芯片AD采样转换使用
💻 C
字号:
//*************************************************************************************
//TMS320F2812 ADC数模转换应用程序
//文件名称:AE_SP_2812xAdc.c
//设置PLL工作在x10/2模式,SYSCLKOUT经过6分频得到25MHz的HSPCLK
//ADC内部进行2x6分频,分频后的时钟再进行(ACTRL1[7]+1)分频,从而产生ADC的内核时钟ADCCLK
//EVA为SEQ1产生ADCSOC信号,EVB为SEQ2产生ADCSOC信号,转换ADCINA0和ADCINB0两个通道
//**************************************************************************************


#include"DSP28_Device.h"

interrupt void adc_isr(void);
void InitAdc(void);

//全局变量定义:


Uint16 ConversionCount;
Uint16 Voltage1[10];
Uint16 Voltage2[10];

main()
{

//step1, 初始化系统控制寄存器、PLL、看门狗和时钟
   
   InitSysCtrl();
   //时钟初始化HSPCLK=SYSCLKOUT/6=25MHz
   
   EALLOW;  //写保护
   SysCtrlRegs.HISPCP.all=0x0003;  //HSPCLK=SYSCLKOUT/6
   EDIS;  //取消写保护
//Step2,GPIO配置

  //InitGpio();   //不使用
  
//Step3, 初始化PIE向量表
   //禁止和清除所有CPU中断:
   DINT;
   IER=0x0000;              //中断使能寄存器清零
   IFR=0x0000;               //中断标志
   InitPieCtrl();
   InitPieVectTable();
   
//Step4,初始化外设模块
   InitAdc();  //DSP28_Adc.c
   
//Step5,重新分配中断向量

   EALLOW;
   PieVectTable.ADCINT=&adc_isr;
   EDIS;
   
  //使能PIE中的ADCINT中断
  PieCtrl.PIEIER1.bit.INTx6=1;
  
  //使能CPU中断
  IER|=M_INT1;  //使能全局中断INT1
  
  //使能全局中断和高优先级适时调适功能
  
  EINT;    //使能全局中断INTM
  ERTM;    //使能全局适时调适中断DBGM
  
  
  ConversionCount=0;
  
  //ConfigureADC
  AdcRegs.MAX_CONV.bit.MAX_CONV=0x0000; //设置SEQ1和SEQ2转换通道数量
  AdcRegs.CHSELSEQ1.bit.CONV00=0x0000;  //设置ADCINA0作为SEQ1的第一个转换
  AdcRegs.CHSELSEQ3.bit.CONV08=0x0008;  //设置ADCINAB0作为SEQ2的第一个转换
  AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=1;     //EVASOC启动SEQ1 
  AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1;   //使能SEQ1中断   
  AdcRegs.ADCTRL2.bit.EVB_SOC_SEQ2=1;     //EVBSOC启动SEQ1 
  AdcRegs.ADCTRL2.bit.INT_ENA_SEQ2=1;   //使能SEQ2中断  
  
  //配置事件管理器EVA
  EvaRegs.T1CMPR=0x0080;                //设置T1比较器
  EvaRegs.T1PR=0xFFFF;                  //设置周期寄存器
  EvaRegs.GPTCONA.bit.T1TOADC=1;    //使能事件管理器A的EVASOC
  EvaRegs.T1CON.all=0x1062;       //使能定时器1比较(递增计数模式)
   
  EvbRegs.T3CMPR=0x0080;                //设置T3比较器
  EvbRegs.T3PR=0xFFFF;                  //设置周期寄存器
  EvbRegs.GPTCONB.bit.T3TOADC=1;    //使能事件管理器B的EVBSOC
  EvbRegs.T3CON.all=0x1062;       //使能定时器3比较(递增计数模式)
  
  //等待ADC中断
    while (AdcRegs.ADC_ST_FLAG.bit.SEQ1_BSY==0)
    {
        AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;
    }
    
    for (;;)
    {
    
       KickDog();
    }
    
    
 }
 
 
  
 interrupt void adc_isr(void)
 {
 
    
    Voltage1[ConversionCount]=AdcRegs.RESULT0;
    Voltage2[ConversionCount]=AdcRegs.RESULT1; 
    
    if(ConversionCount==9)
    {
    
      ConversionCount=0;
    }
    else ConversionCount++;
    
    //重新初始化下一个ADC排序
    AdcRegs.ADCTRL2.bit.RST_SEQ1=1;   //复位SEQ1
    AdcRegs.ADCTRL2.bit.RST_SEQ2=1;   //复位SEQ2
    AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR=1;  //清除INT SEQ1位
    AdcRegs.ADC_ST_FLAG.bit.INT_SEQ2_CLR=1;  //清除INT SEQ2位
    PieCtrl.PIEACK.all=PIEACK_GROUP1;     //响应中断
    
    
    return;
 }
 
 void InitAdc(void)
{
	unsigned int i;
	
	

	
	AdcRegs.ADCTRL1.bit.RESET=1;  //复位整个ADC模块,ADC控制逻辑该位清零
	NOP;                          //空操作
	
	AdcRegs.ADCTRL1.bit.RESET=0;   //无影响
	AdcRegs.ADCTRL1.bit.SUSMOD=3;  //仿真挂起时排序器和其他逻辑立即停止
	AdcRegs.ADCTRL1.bit.ACQ_PS=0;  //采集窗口宽度为一个ADCLK周期数
	AdcRegs.ADCTRL1.bit.CPS=1;     //内核时钟对外设时钟分频/2
	AdcRegs.ADCTRL1.bit.CONT_RUN=1;//连续运转模式,产生EOS信号后,排序器从CONV00
	                               //或CONV08状态开始
	AdcRegs.ADCTRL1.bit.SEQ_CASC=0; //双排序模式,SEQ1和SEQ2作为两个8状态排序器工作
	
	AdcRegs.ADCTRL3.bit.ADCBGRFDN=3; //带隙和参考电路上电
	for(i=0;i<10000;i++)	NOP;    //等待延时
	AdcRegs.ADCTRL3.bit.ADCPWDN=1;  //除带隙和参考电路外的ADC其他模拟电路上电
	for(i=0;i<5000;i++)	NOP;        //等待延时
	AdcRegs.ADCTRL3.bit.ADCCLKPS=6; // ADC内核时钟分频数为6,获得采样频率为104.2KHz
	AdcRegs.ADCTRL3.bit.SMODE_SEL=1; //选择同步采样模式
	
	AdcRegs.MAX_CONV.bit.MAX_CONV=0x0000; //最大转换通道数为2
	
	AdcRegs.CHSELSEQ1.bit.CONV00=0;  //通道ADCINA0
	
	
	AdcRegs.CHSELSEQ3.bit.CONV08=8;  //通道ADCINB0 
	
	
	AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR=1; //清除中断标志位
	AdcRegs.ADC_ST_FLAG.bit.INT_SEQ2_CLR=1;	//清除中断标志位
	
	AdcRegs.ADCTRL2.bit.EVB_SOC_SEQ=0;  //不起作用
	AdcRegs.ADCTRL2.bit.RST_SEQ1=0;     //排序器SEQ1不起作用
	AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1; //使能SEQ1中断申请
	AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1=0; //每个SEQ1序列结束时INT SEQ1置位
	AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=1; //允许EVA的触发事件启动SEQ1
	AdcRegs.ADCTRL2.bit.EXT_SOC_SEQ1=0; //SEQ1外部信号启动转换位无效
	AdcRegs.ADCTRL2.bit.RST_SEQ2=0;     //排序器SEQ2不起作用
	AdcRegs.ADCTRL2.bit.SOC_SEQ2=1;     //序列2(SEQ2)转换触发启动有效
	AdcRegs.ADCTRL2.bit.INT_ENA_SEQ2=0;// 禁止INT SEQ1产生中断申请
	AdcRegs.ADCTRL2.bit.INT_MOD_SEQ2=0;//每个SEQ2序列结束时INT SEQ2置位
	AdcRegs.ADCTRL2.bit.EVB_SOC_SEQ2=1;// 允许事件管理器B的触发信号启动SEQ2 
	AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;  //从当前停止位启动SEQ1
	
 }	
   

⌨️ 快捷键说明

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