DSP2812 AD转换后结果存到了哪里?怎么读出来? 我需要根据AD 的结果由2812发出不同的指令!程序如下。 2812怎么读出结果 是在某个寄存器里吗?怎么读
/*********************************************************************
** Module Name: ADC **
** Author: Cbq **
** Version: 1.0 **
** CreateDate: 2008-05-23 **
** Description: **
** Remark: Huozq **
** Revision History: 2008-11-10 **
**********************************************************************/
/*********************************************************************
** 实验目的:学习DSP内部AD转换器,掌握它的所有寄存器功能配置,这是比 **
** 较重要的在控制行业中. **
** 实验说明:外接信号进行采集 **
** 注意:DSP2812芯片中的AD的模拟输入范围为:0~3V,切勿超过,**
** 否则可能烧毁DSP芯片! **
** 实验结果:观测a1,由于AD本身精度问题,可能会有一些误差。 **
**********************************************************************/
#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=57;
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.
//===========================================================================
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>