加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

从实验例程学习DSP之ADC

(2011-11-11 19:45:02)
标签:

通道

t1

定时器

中断服务程序

寄存器

分类: DSP

#include "DSP281x_Device.h"
#include "DSP281x_Examples.h"
// Prototype statements for functions found within this file.

void Gpio_select(void);
void SpeedUpRevA(void);
void InitSystem(void);    
void show_ADC(int result);
interrupt void adc_isr(void); // Prototype for ADC result ISR   ADC中断服务程序声明
 
// Global variables used in this example:

int Voltage_A0;
int Voltage_B0;   

void main(void)
{
 unsigned long i;
 InitSystem();  // Initialize the DSP's core Registers
 
 // Speed_up the silicon A Revision.
 // No need to call this function for Rev. C  later silicon versions
 SpeedUpRevA();
 
 Gpio_select();  // Setup the GPIO Multiplex Registers
 
 InitPieCtrl();  // Function Call to init PIE-unit ( code : DSP281x_PieCtrl.c)
 
 InitPieVectTable(); // Function call to init PIE vector table ( code : DSP281x_PieVect.c )
 
 InitAdc();   // Function call for basic ADC initialisation
   
 // re-map PIE - entry for GP Timer 1 Compare Interrupt
 EALLOW;  // This is needed to write to EALLOW protected registers
    PieVectTable.ADCINT = &adc_isr;
 //将中断程序首地址放在中断向量表上   

EDIS;    // This is needed to disable write to EALLOW protected registers
 
 // Enable ADC interrupt: PIE-Group1 , interrupt 6
 PieCtrlRegs.PIEIER1.bit.INTx6 = 1;                    
//使能ADC中断 
 // Enable CPU INT1 which is connected to ADC interrupt:
    IER = 1;
   
 // Enable global Interrupts and higher priority real-time debug events:
    EINT;   // Enable Global interrupt INTM
    ERTM;   // Enable Global realtime interrupt DBGM
    
    // Configure ADC
    AdcRegs.ADCTRL1.bit.SEQ_CASC = 0;    // Dual Sequencer Mode 双排序器操作(即两个八通道)
    AdcRegs.ADCTRL1.bit.CONT_RUN = 0;    // No Continuous run 非连续运行
    AdcRegs.ADCTRL1.bit.CPS = 0;     // prescaler = 1  预订标系数1
    AdcRegs.ADCMAXCONV.all = 0x0001;       // Setup 2 conv's on SEQ1  设置两个转换
    AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; // Setup ADCINA0 as 1st SEQ1 conv.

 //设置ADCINA0为第一个转换

// Assumes EVA Clock is already enabled in InitSysCtrl();
    AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x8; // Setup ADCINB0 as 2nd SEQ1 conv.

//设置ADCINB0为第二个转换

// Drive T1PWM / T2PWM by T1/T2 - logic
    AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1 = 1;  // Enable EVASOC to start SEQ1

//允许事件管理器A的触发信号启动SEQ1

// Polarity of GP Timer 1 Compare = Active low
 AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; 

// Enable SEQ1 interrupt every EOEvaRegs.GPTCONA.bit.T1PIN = 1;

//使能SEQ1产生的中断申请(在T1比较输出低有效的时候)
    AdcRegs.ADCTRL3.bit.ADCCLKPS = 2;    // Divide HSPCLK by 4  ADC时钟为高速时钟的的1/4

   // Configure EVA
    // Assumes EVA Clock is already enabled in InitSysCtrl();
    // Disable T1PWM / T2PWM outputs
    EvaRegs.GPTCONA.bit.TCMPOE = 0; //禁止比较输出
    // Polarity of GP Timer 1 Compare = forced low
 EvaRegs.GPTCONA.bit.T1PIN = 0;//T1比较输出一直强制低电平
 EvaRegs.GPTCONA.bit.T1TOADC = 2;       // Enable EVASOC in EVA 

//T1计数周期中断启动ADC
 
 
    EvaRegs.T1CON.bit.FREE = 0;    // Stop on emulation suspend
    EvaRegs.T1CON.bit.SOFT = 0;    // Stop on emulation suspend
   //仿真挂起则停止

    EvaRegs.T1CON.bit.TMODE = 2;   // Continuous up count mode  连续增计数模式
    EvaRegs.T1CON.bit.TPS = 7;    // prescaler = 128  T1计数的时钟周期为高速时钟的1/128
    EvaRegs.T1CON.bit.TENABLE = 1;   // enable GP Timer 1 使能定时操作
    EvaRegs.T1CON.bit.TCLKS10 = 0;   // internal clock 使用内部时钟,如HSPCLK
    EvaRegs.T1CON.bit.TCLD10 = 0;   // Compare Reload when zero 重新计数时立即装载定时器比较寄存器
    EvaRegs.T1CON.bit.TECMPR = 0;   // Disable Compare operation  禁止定时器比较
                                          
    EvaRegs.T1PR = 58594;     //定时器周期寄存器计数个数

    while(1)
   
       for(i=0;i<1500000;i++)
       {
       EALLOW;
     SysCtrlRegs.WDKEY = 0xAA;  // and serve watchdog #2  
     EDIS;
      show_ADC(Voltage_A0>>8); 
     }
     for(i=0;i<1500000;i++)
       {
       EALLOW;
     SysCtrlRegs.WDKEY = 0xAA;  // and serve watchdog #2  
     EDIS;
      show_ADC(Voltage_B0>>8); 
    }
    }
}   
  


  
void Gpio_select(void)
{
 EALLOW;
 GpioMuxRegs.GPAMUX.all = 0x0; // all GPIO port Pin's to I/O  
    GpioMuxRegs.GPBMUX.all = 0x0;  
    GpioMuxRegs.GPDMUX.all = 0x0;
    GpioMuxRegs.GPFMUX.all = 0x0;  
    GpioMuxRegs.GPEMUX.all = 0x0;
    GpioMuxRegs.GPGMUX.all = 0x0;   
          
    GpioMuxRegs.GPADIR.all = 0x0; // GPIO PORT  as input
    GpioMuxRegs.GPBDIR.all = 0x00FF;// GPIO Port B15-B8 input , B7-B0 output
    GpioMuxRegs.GPDDIR.all = 0x0; // GPIO PORT  as input
    GpioMuxRegs.GPEDIR.all = 0x0; // GPIO PORT  as input
    GpioMuxRegs.GPFDIR.all = 0x0; // GPIO PORT  as input
    GpioMuxRegs.GPGDIR.all = 0x0; // GPIO PORT  as input

    GpioMuxRegs.GPAQUAL.all = 0x0; // Set GPIO input qualifier values to zero
    GpioMuxRegs.GPBQUAL.all = 0x0;
    GpioMuxRegs.GPDQUAL.all = 0x0;
    GpioMuxRegs.GPEQUAL.all = 0x0;
    EDIS;
   

void SpeedUpRevA(void)
{
// On TMX samples, to get the best performance of on chip RAM blocks M0/M1/L0/L1/H0 internal
// control registers bit have to be enabled. The bits are in Device emulation registers.
    EALLOW;
  
    EDIS;
}

void InitSystem(void)
{
    EALLOW;
    SysCtrlRegs.WDCR= 0x00AF;  // Setup the watchdog
            // 0x00E8  to disable the Watchdog , Prescaler = 1
            // 0x00AF  to NOT disable the Watchdog, Prescaler = 64
    SysCtrlRegs.SCSR = 0;    // Watchdog generates a RESET 
    SysCtrlRegs.PLLCR.bit.DIV = 10; // Setup the Clock PLL to multiply by 5
   
    SysCtrlRegs.HISPCP.all = 0x1; // Setup Highspeed Clock Prescaler to divide by 2
    SysCtrlRegs.LOSPCP.all = 0x2; // Setup Lowspeed CLock Prescaler to divide by 4
       
    // Peripheral clock enables set for the selected peripherals.  
    SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;
    SysCtrlRegs.PCLKCR.bit.EVBENCLK=0;
    SysCtrlRegs.PCLKCR.bit.SCIAENCLK=0;
    SysCtrlRegs.PCLKCR.bit.SCIBENCLK=0;
    SysCtrlRegs.PCLKCR.bit.MCBSPENCLK=0;
    SysCtrlRegs.PCLKCR.bit.SPIENCLK=0;
    SysCtrlRegs.PCLKCR.bit.ECANENCLK=0;
    SysCtrlRegs.PCLKCR.bit.ADCENCLK=1;
    EDIS;
}
       
void show_ADC(int result)


{
 switch(result) {
  case 0 : GpioDataRegs.GPBDAT.all=0x0000;break;
  case 1 : GpioDataRegs.GPBDAT.all=0x0001;break;
  }
 result>>=1;
 switch(result) {
  case 1 : GpioDataRegs.GPBDAT.all=0x0003;break;
  case 2 : GpioDataRegs.GPBDAT.all=0x0007;break;
  case 3 : GpioDataRegs.GPBDAT.all=0x000F;break;
  case 4 : GpioDataRegs.GPBDAT.all=0x001F;break;
  case 5 : GpioDataRegs.GPBDAT.all=0x003F;break;
  case 6 : GpioDataRegs.GPBDAT.all=0x007F;break;
  case 7 : GpioDataRegs.GPBDAT.all=0x00FF;break;
  }
   

interrupt void adc_isr(void) 
{
    // Serve the watchdog every Timer 0 interrupt
    EALLOW;
 SysCtrlRegs.WDKEY = 0x55;  // Serve watchdog #1
 EDIS; 
   
    Voltage_A0 = AdcRegs.ADCRESULT0>>4;//ADCINA0的转换结果放在ADCRESULT0中
    Voltage_B0 = AdcRegs.ADCRESULT1>>4;//ADCINB0的转换结果放在ADCRESULT1中

  // Reinitialize for next ADC sequence
  AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;         // Reset SEQ1  排序器复位到CONV00状态
  AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;  // Clear INT SEQ1 bit 清除SEQ1中断标志
  PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;   // Acknowledge interrupt to PIE
         
//===========================================================================
// End of SourceCode.
//===========================================================================

//T1计数,溢出中断时触发启动ADC进行模数转换,转换结果后进入ADC中断服务程序,将转换结果赋值为Voltage_A0 ,Voltage_B0 ,将电压转换结果以LED方式显示。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有