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

📄 dac.c

📁 F2812详细的AD,DA转换源码,完整的工程,直接可用.
💻 C
字号:
//2008-5-23,ADC-DAC联合测试

//实验目的:学习DSP内部AD转换器,掌握它的所有寄存器功能配置,这是比较重要的在控制行业中

//硬件电路讲解:这实验我们是通过前面所讲的DA实验获取的模拟信号,选择了其中的两路做为AD
//             的输入.在板子上我们把零位调整端(ADCL0)引了出来,并且在这里接了地,大家
//             可以根据需要,以后在实际中来改变进行调整.J16和J17需短接
//        注意:DSP2812芯片中的AD的模拟输入范围为:0~3V

//实验效果:

//在本实验中用了TLV5620的DAC转换芯片,且它是一''8''bit的4个模拟信号输出口的DA芯片
//而输入DSP的ADC是一''12''bit的转化,所以注意DSP输出到DA芯片的数字量和经DSP的AD接收
//到的数字量是不一样的。

//测试时将ADC的零位调整端接到模拟地。
//ADCA通道分别对应DSP的AD寄存器为0,2,4,...,12,14
//ADCB通道分别对应DSP的AD寄存器为1,3,5,...,13,15
//目前源码里temp=46,如果想改变DAC输出值,改变变量temp的值即可,
//DAC的输出四个通道分别输出为0.40V,0.80V,1.19V,1.60V。

//在ADC初始化程序中可看到选者的是(级联,顺序)采样模式,
//然后将J12和J13短接之后,则ADCA0通道接到了DAC的输出通道0,电压在0.80V左右;
//ADCA1通道接到DAC的相互出通道1,电压在0.40V左右


#include "DSP28_Device.h"

float	a1[16];//0~15信道经过DAAD转换后,在用ADC转换公式得到的模拟值。本程序只针对了a1[0]和a1[1]两信道
unsigned int a2=0;//采样次数的统计
float	adclo=0.0;//0位调整

interrupt void ad(void);//AD中断子程序
void delay();
void WriteDAC(unsigned char add,unsigned char rng,unsigned char vol);//DA转换程序
main()
{	
    unsigned int temp;
    InitSysCtrl();

	DINT;
	IER = 0x0000;
	IFR = 0x0000;

	InitPieCtrl();

    InitPieVectTable();	
	
	InitPeripherals();
	
	InitGpio();
	
	EALLOW;	// This is needed to write to EALLOW protected registers
	PieVectTable.ADCINT=&ad;////中断向量表中的ADCINT中断指向AD中断函数
	EDIS;   // This is needed to disable write to EALLOW protected registers
    
    InitAdc();

    // Enable INT14 which is connected to CPU-Timer 2:
	IER |= M_INT1;///使能中断第一组
	PieCtrl.PIEIER1.bit.INTx6=1;//第一组的第6位正好ADINT
	//KickDog();
    // Enable global Interrupts and higher priority real-time debug events:
	
	EINT;   // Enable Global interrupt INTM
	ERTM;	// Enable Global realtime interrupt DBGM
	while(AdcRegs.ADC_ST_FLAG.bit.SEQ1_BSY==0)///读排序器1的忙状态位,为0是空闲
		{			

			AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;///启动SEQ1开始转换

		}


	 GpioDataRegs.GPASET.all|=0x8000;////设置串行数据载入控制,具体可查看TLV5620英文资料,
	                                 ////这里是先置高

     temp=46;
	 
	for(;;)
	{
	   KickDog();
	   
	   /*下面这里输出的四个电压值可在DA输出口,即J15分别对应测到0.4V,0.8V,1.2V,.1.6V*/
       WriteDAC(0,0,temp);	  ///0.4V 
	   WriteDAC(1,0,temp*2);  ///0.8V	   
	   WriteDAC(2,0,temp*3);  ///1.2V
	   WriteDAC(3,0,temp*4);  ///1.6V
	}

} 	

void WriteDAC(unsigned char add,unsigned char rng,unsigned char vol)
{unsigned short int data;
  data = 0x0000;
  data = ((add<<14) | (rng<<13) | (vol<<5));

     
  if(Spi_TxReady() == 1)
     SpiaRegs.SPITXBUF = data; 
     delay(50000);
     
     GpioDataRegs.GPACLEAR.all|=0x8000;////产生一突变负脉冲,锁定串行数据
	 delay(1000);
     GpioDataRegs.GPASET.all|=0x8000;
		
}

void delay(unsigned int t)
{
 while(t>0)
    t--;
}


interrupt void ad(void)
{
    adclo=0;//每块板的零位不一样,在这儿设一个合适的数以扣掉零位
	IFR=0x0000;

	PieCtrl.PIEACK.all=0xffff;
	a2++;
	a1[0]=((AdcRegs.RESULT0>>4)*3)/4095.0+adclo;////采集0.4V的DA输入电压后转换值,也为0.4V左右
	a1[1]=((AdcRegs.RESULT1>>4)*3)/4095.0+adclo;////0.8V左右
	a1[2]=((AdcRegs.RESULT2>>4)*3)/4095.0+adclo;
	a1[3]=((AdcRegs.RESULT3>>4)*3)/4095.0+adclo;
	a1[4]=((AdcRegs.RESULT4>>4)*3)/4095.0+adclo;
	a1[5]=((AdcRegs.RESULT5>>4)*3)/4095.0+adclo;
	a1[6]=((AdcRegs.RESULT6>>4)*3)/4095.0+adclo;
	a1[7]=((AdcRegs.RESULT7>>4)*3)/4095.0+adclo;
	a1[8]=((AdcRegs.RESULT8>>4)*3)/4095.0+adclo;
	a1[9]=((AdcRegs.RESULT9>>4)*3)/4095.0+adclo;
	a1[10]=((AdcRegs.RESULT10>>4)*3)/4095.0+adclo;
	a1[11]=((AdcRegs.RESULT11>>4)*3)/4095.0+adclo;
	a1[12]=((AdcRegs.RESULT12>>4)*3)/4095.0+adclo;
	a1[13]=((AdcRegs.RESULT13>>4)*3)/4095.0+adclo;
	a1[14]=((AdcRegs.RESULT14>>4)*3)/4095.0+adclo;
	a1[15]=((AdcRegs.RESULT15>>4)*3)/4095.0+adclo;
	AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR=1;
	AdcRegs.ADCTRL2.bit.SOC_SEQ1=1; //在这儿设一断点,程序执行到这儿停下后,查看变量数组a1即可看到ADC各通道的采样值。
	EINT;
	
}



//===========================================================================
// No more.
//===========================================================================

⌨️ 快捷键说明

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