配色: 字号:
ad
2012-10-28 | 阅:  转:  |  分享 
  
///Copyright(C),2008-2009,力天电子,LiTianTech.Co.Ltd.??????????//??ModuleName??:????????????????????????????????????????????????//??FileName????:main.c????????????????????????????????????????????/??????/??Author????????:??????????????????????????????????/????/??CreateDate??:????????????????????????????????/????/??Version????????:????????????????????????????????/??????/??Function????:??????????????????????????????????????????/????????????????/??Description??:??????????????????????????????????????????/????????/??Support????:????????????????????????????????????/????????///头文件/??#include"DSP281x_Device.h"#include"System.h"floatadc[16];//用于存储A/D转换结果floatadclo;//A/D转换的模拟参考电平floatinput0,input1,input2,input3;//用于保存这4个通道的实际输入数据floatoutput0,output1,output2,output3;//4个通道滤波处理后的采样结果floatadcresulta0[10];//用于保存ADCINA0通道的10次采样结果floatadcresulta1[10];//用于保存ADCINA1通道的10次采样结果floatadcresulta2[10];//用于保存ADCINB0通道的10次采样结果floatadcresulta3[10];//用于保存ADCINB1通道的10次采样结果intsamplecount;/端口宏定义//常量宏定义//全局变量定义//函数声明/voidInitEv(void);voidInitADC(void);voidsequence(float[],intn);//排序算法/------------------------------------------//形式参数:void??????????????????//返回值:void????????????????????????????//函数描述:主函数????????????????????????//------------------------------------------/voidmain(void){??????inti;????InitSysCtrl();??//系统初始化子程序,在DSP28_sysctrl.c中????adclo=0;????input0=0;????input1=0;????input2=0;????input3=0;????for(i=0;i<10;i++)????{??????adcresulta0[i]=0;????adcresulta1[i]=0;??????adcresulta2[i]=0;??????adcresulta3[i]=0;??????}??????samplecount=0;??????PieCtrlRegs.PIEIER1.bit.INTx6=1;//使能PIE模块中的ADC采样中断??????IER|=M_INT1;//开CPU中断??????EINT;//使能全局中断;??????ERTM;//使能实时中断??????EvaRegs.T1CON.bit.TENABLE=1;//启动T1计数??????while(1);}voidInitEv(void){??EvaRegs.T1CON.all=0x0842;//连续增减计数模式,使能定时器,比较使能????EvaRegs.GPTCONA.bit.T1TOADC=2;//周期中断启动ADC????EvaRegs.EVAIMRA.bit.T1PINT=1;//使能定时器T1的周期中断????EvaRegs.EVAIFRA.bit.T1PINT=1;//清除定时器T1的中断标志位????EvaRegs.T1PR=18750;//采样频率为1KHz????EvaRegs.T1CNT=0;//初始化计数器寄存器}voidInitADC(void){??unsignedinti;????AdcRegs.ADCTRL1.bit.RESET=1;//复位整个ADC模块????for(i=0;i<100;i++){};//写数据需要必要的延时????AdcRegs.ADCTRL1.bit.RESET=0;//对复位没有影响????AdcRegs.ADCTRL1.bit.SUSMOD=3;//仿真暂停时,序列发生器和其他数字电路立即停止????AdcRegs.ADCTRL1.bit.ACQ_PS=3;//采样窗口大小,SOC脉冲宽度为4个ADCLK????AdcRegs.ADCTRL1.bit.CPS=1;//核时钟预订标器,将时钟进行2分频????AdcRegs.ADCTRL1.bit.CONT_RUN=0;//运行于启动/停止模式????AdcRegs.ADCTRL1.bit.SEQ_CASC=1;//级联方式????AdcRegs.ADCTRL3.bit.ADCBGRFDN=3;//电路的间隙越来越大??for(i=0;i<1000;i++){};??AdcRegs.ADCTRL3.bit.ADCPWDN=1;??for(i=0;i<1000;i++){};??AdcRegs.ADCTRL3.bit.ADCCLKPS=15;//ADCCLK=HSPCLK/30??AdcRegs.ADCTRL3.bit.SMODE_SEL=0;//采用顺序采样模式??AdcRegs.ADCMAXCONV.all=0x0011;//总共采样4路??AdcRegs.ADCCHSELSEQ1.bit.CONV00=0;//对ADCINA0通道进行采样??AdcRegs.ADCCHSELSEQ1.bit.CONV01=1;//对ADCINA1通道进行采样??AdcRegs.ADCCHSELSEQ1.bit.CONV02=2;//对ADCINA2通道进行采样??AdcRegs.ADCCHSELSEQ1.bit.CONV03=3;//对ADCINA3通道进行采样??AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;//清除SEQ1的中断标志位INT_SEQ1??AdcRegs.ADCST.bit.INT_SEQ2_CLR=1;//清除SEQ2的中断标志位INT_SEQ2??AdcRegs.ADCTRL2.bit.EVB_SOC_SEQ=0;??AdcRegs.ADCTRL2.bit.RST_SEQ1=0;??AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1;//SEQ1的中断使能??AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1=0;??AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=1;//EVA事件启动A/D转换??AdcRegs.ADCTRL2.bit.EXT_SOC_SEQ1=0;??AdcRegs.ADCTRL2.bit.RST_SEQ2=0;??AdcRegs.ADCTRL2.bit.SOC_SEQ2=0;??AdcRegs.ADCTRL2.bit.INT_ENA_SEQ2=0;??AdcRegs.ADCTRL2.bit.INT_MOD_SEQ2=0;??AdcRegs.ADCTRL2.bit.EVB_SOC_SEQ2=0;??AdcRegs.ADCTRL2.bit.SOC_SEQ1=0;}voidsequence(floata[],intn){????inti=0;??intj=0;??floattemp=0;??for(i=0;ia[j])????????{????????temp=a[i];????????a[i]=a[j];????????a[j]=temp;????????}??????}????}}interruptvoid??ADCINT_ISR(void)????//ADC{??{??samplecount++;//采样计数器计数??//读取转换结果??adc[0]=((float)AdcRegs.ADCRESULT0)3.0/65520.0+adclo;//读取ADCINA0通道采样结果??adc[1]=((float)AdcRegs.ADCRESULT1)3.0/65520.0+adclo;//读取ADCINA1通道采样结果??adc[2]=((float)AdcRegs.ADCRESULT8)3.0/65520.0+adclo;//读取ADCINA8通道采样结果??adc[3]=((float)AdcRegs.ADCRESULT9)3.0/65520.0+adclo;//读取ADCINA9通道采样结果??adcresulta0[samplecount-1]=adc[0];//将ADCINA0通道采样到的数据存入数组adcresulta0[]中,等待数据处理??adcresulta1[samplecount-1]=adc[1];//将ADCINA1通道采样到的数据存入数组adcresulta1[]中,等待数据处理??adcresulta2[samplecount-1]=adc[2];//将ADCINB0通道采样到的数据存入数组adcresulta2[]中,等待数据处理??adcresulta3[samplecount-1]=adc[3];//将ADCINB1通道采样到的数据存入数组adcresulta3[]中,等待数据处理??if(samplecount==10)//采样之后,需要进行滤波处理{??inti;??i=0;??output0=0;??output1=0;??output2=0;??output3=0;??sequence(adcresulta0,10);//对采样10次得到的数据进行排序??sequence(adcresulta1,10);//对采样10次得到的数据进行排序??sequence(adcresulta2,10);//对采样10次得到的数据进行排序??sequence(adcresulta3,10);//对采样10次得到的数据进行排序??for(i=3;i<=7;i++){??output0=output0+adcresulta0[i];//中值滤波法,去掉最小的3个和最大的3个,取中间的4个数据进行求和??output1=output1+adcresulta1[i];??output2=output2+adcresulta2[i];??output3=output3+adcresulta3[i];}??samplecount=0;//清采样计数器,进行新的10次连续采样??output0=output0/4;??output1=output1/4;??output2=output2/4;??output3=output3/4;}??PieCtrlRegs.PIEACK.bit.ACK1=1;//响应PIE同组中断??AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;//清除AD中断的标志位??AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;//立即启动下一次转换??EINT;//使能全局中断}??//InsertISRCodehere??//ToreceivemoreinterruptsfromthisPIEgroup,acknowledgethisinterrupt??//PieCtrlRegs.PIEACK.all=PIEACK_GROUP1;????//Nexttwolinesfordebugonlytohalttheprocessorhere??//RemoveafterinsertingISRCode??asm("????ESTOP0");??for(;;);}

献花(0)
+1
(本文系立达911首藏)