ad_sample.c
来自「开发环境为CCS。DSP12个典型例子源码」· C语言 代码 · 共 206 行
C
206 行
// TI File $Revision: /main/3 $
// Checkin $Date: July 2, 2007 11:33:46 $
//###########################################################################
//
// FILE: AD_SAMPLE.c
//
// TITLE: DSP2812 AD_SAMPLE Example Program.
//
// ASSUMPTIONS:
//
// This program requires the DSP281x V1.00 header files.
// As supplied, this project is configured for "boot to H0" operation.
//
// Make sure the CPU clock speed is properly defined in
// DSP281x_Examples.h before compiling this example.
//
//
//
//###########################################################################
// $TI Release: DSP281x Header Files V1.11 $
// $Release Date: September 26, 2007 $
//###########################################################################
#include "DSP281x_Device.h" // DSP281x Headerfile Include File
#include "DSP281x_Examples.h" // DSP281x Examples Include File
// Prototype statements for functions found within this file.
void DA_OUT(unsigned CHANNEL,unsigned int RNG,unsigned int SPI_DATA);
interrupt void cpu_timer0_isr(void);
void Gpio_select(void);
void SPI_Init();
void AD_Sample();
void Que();
unsigned int t0=0,i=0,j=0;
int Voltage=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;
main()
{
/*初始化系统*/
InitSysCtrl();
Gpio_select();
/*关中断*/
DINT;
IER = 0x0000;
IFR = 0x0000;
/*初始化PIE*/
InitPieCtrl();
InitPeripheralClocks();
/*初始化PIE中断矢量表*/
InitPieVectTable();
InitAdc();
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.TINT0 = &cpu_timer0_isr;
EDIS; // This is needed to disable write to EALLOW protected registers
// For this example, only initialize the Cpu Timers
InitCpuTimers();
// Configure CPU-Timer 0 to interrupt every second:
ConfigCpuTimer(&CpuTimer0, 150, 1000);
StartCpuTimer0();
SPI_Init();
// Enable CPU INT1 which is connected to CPU-Timer 0:
IER |= M_INT1;
// Enable TINT0 in the PIE: Group 1 interrupt 7
PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
// Enable global Interrupts and higher priority real-time debug events:
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
DA_OUT(0,0,192); //2.475范围0-255对应0-3.3V
DA_OUT(1,0,128); //1.65范围0-255对应0-3.3V
for(;;)
{
if(AD_FLAG==1)
{
AD_FLAG=0;
for(i=0;i<18;i++)
{
AD_Sample();
AD0[i]=RESULT_0;
AD8[i]=RESULT_8;
}
Que(); //排队滤波
}
}
}
void DA_OUT(unsigned CHANNEL,unsigned int RNG,unsigned int SPI_DATA)
{
unsigned int flag=0;
SpiaRegs.SPITXBUF=(CHANNEL<<14)|(RNG<<13)|(SPI_DATA<<5) ; //bit10,9~CHANNEL;bit8~RNG倍数
for(;;)
{
flag=SpiaRegs.SPISTS.all&0x40;
if(flag==0x40) break; //读中断标志位,判断是否发送完毕
}
SpiaRegs.SPIRXBUF=SpiaRegs.SPIRXBUF;/*虚读寄存器以清除中断标志*/
GpioDataRegs.GPADAT.bit.GPIOA0=0; //CS_DA=0,更新模拟信号输出
for(i=0;i<5;i++); //延时
GpioDataRegs.GPADAT.bit.GPIOA0=1; //CS_DA=1,锁存数据
}
interrupt void cpu_timer0_isr(void)
{
CpuTimer0.InterruptCount++;
// Acknowledge this interrupt to receive more interrupts from group 1
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
t0++;
if((AD_FLAG==0)&((t0%100)==0)) //定时AD采样
{
AD_FLAG=1;
}
}
void SPI_Init() //SPI-DA初始化
{
GpioDataRegs.GPADAT.bit.GPIOA0=1; //CS_DA=1
SpiaRegs.SPICCR.all=0x004a; //11bit数据
SpiaRegs.SPICTL.all=0x0006; //禁止中断
SpiaRegs.SPISTS.all=0x0000; //清除SPI中断状态位
SpiaRegs.SPIBRR=0x0095; //1M波特率
SpiaRegs.SPICCR.all=SpiaRegs.SPICCR.all|0x0080; //(关键设置位)使SPI退出复位状态
}
void Gpio_select(void)
{
EALLOW;
GpioMuxRegs.GPFMUX.bit.SPISIMOA_GPIOF0=1; //SPISIMO特殊功能方式
GpioMuxRegs.GPFMUX.bit.SPICLKA_GPIOF2=1; //SPICLK特殊功能方式
GpioMuxRegs.GPAMUX.bit.PWM1_GPIOA0=0;
GpioMuxRegs.GPADIR.bit.GPIOA0=1;
EDIS;
}
void AD_Sample()
{
AdcRegs.ADCTRL1.all=0x3000; /* 自由运行,启动/停止模式,双排序器工作模式 */
AdcRegs.ADCMAXCONV.all=0x0000;
AdcRegs.ADCCHSELSEQ1.all=0x0000;
AdcRegs.ADCTRL2.all=0x4000;
AdcRegs.ADCTRL2.all = 0x2000;
RESULT_0=AdcRegs.ADCRESULT8>>6;
AdcRegs.ADCMAXCONV.all=0x0000;
AdcRegs.ADCCHSELSEQ3.all=0x0008;
AdcRegs.ADCTRL2.all=0x0040;
AdcRegs.ADCTRL2.all = 0x0020;
RESULT_8=AdcRegs.ADCRESULT0>>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监测数据
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?