这是我写的一个AD采样的程序,目的是采样NUM个点之后停止,但是结果有一些问题,想请教问题出在什么地方。
#include "DSP28_Device.h"
#define NUM 1800
interrupt void adc_isr(void);
float fIn[NUM];
int count=0;
int k;
int flag=0;
void main(void)
{
InitSysCtrl();
DINT;
IER = 0x0000;
IFR = 0x0000;
InitPieCtrl();
InitPieVectTable();
InitPeripherals();
EvaRegs.T1CNT=0;
EvaRegs.T1PR=18;
EvaRegs.GPTCONA.bit.T1TOADC=1; //下溢中断启动AD
EvaRegs.T1CON.all=0x1242; //TMODE=10,TCLKS=00,TPS=2,EVACLK=75M/4=18.75MHz,装载条件计数器值为0,使能定时器比较操作,定时器使能
InitAdc();
AdcRegs.ADCTRL3.bit.SMODE_SEL=0;
AdcRegs.ADCTRL1.bit.SEQ_CASC=1;
AdcRegs.MAX_CONV.all=0x0;
AdcRegs.CHSELSEQ1.bit.CONV00=0x2;
AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=1; //使能EVASOC启动SEQ1
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1; //使能SEQ1中断
EALLOW;
PieVectTable.ADCINT=&adc_isr;
EDIS;
PieCtrl.PIEIER1.bit.INTx6=1;
IER|=0x0001; //CPU级中断
EINT;
ERTM;
while ( 1 )
{
if(flag==1)
{
for(k=0;k<NUM;k++)
{
fIn[k]=fIn[k]*3/4095.0/16.0;
}
flag=0;
}
}
}
interrupt void adc_isr(void)
{
fIn[count]=AdcRegs.RESULT0;
PieCtrl.PIEACK.all=PIEACK_GROUP1;
AdcRegs.ADCTRL2.bit.RST_SEQ1=1;
AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR=1;
count++;
if(count==NUM)
{
flag=1;
AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=0;
}
}
此帖出自
小平头技术问答
{
unsigned int i;
AdcRegs.ADCTRL1.bit.RESET=1; //ADC模块软件复位
NOP;
AdcRegs.ADCTRL1.bit.RESET=0; //无影响
AdcRegs.ADCTRL1.bit.SUSMOD=3;
AdcRegs.ADCTRL1.bit.ACQ_PS=1; //采样窗的宽度,范围0-15
AdcRegs.ADCTRL1.bit.CPS=0; //ADC内核时钟定标
AdcRegs.ADCTRL1.bit.CONT_RUN=0; //0表示启动/停止模式,写1表示连续转换模式
AdcRegs.ADCTRL1.bit.SEQ_CASC=1; //1为级联(单排序)模式,0为双排序模式
AdcRegs.ADCTRL3.bit.ADCBGRFDN=3; //0表示带限和参考电源关,3表示带限和参考电源开
for(i=0;i<10000;i++) NOP;
AdcRegs.ADCTRL3.bit.ADCPWDN=1; //ADC内核的模拟电路的电源开
for(i=0;i<5000;i++) NOP;
AdcRegs.ADCTRL3.bit.ADCCLKPS=1; //内核时钟定标,配合AdcRegs.ADCTRL1.bit.CPS
AdcRegs.ADCTRL3.bit.SMODE_SEL=0; //0为顺序采样模式,1为同时采样模式
AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR=1;//写1清SEQ1中断标志位,写0无影响
AdcRegs.ADC_ST_FLAG.bit.INT_SEQ2_CLR=1;//写1清SEQ2中断标志位,写0无影响
AdcRegs.ADCTRL2.bit.EVB_SOC_SEQ=0;
AdcRegs.ADCTRL2.bit.RST_SEQ1=0;
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1; //SEQ1中断使能
AdcRegs.ADCTRL2.bit.SOC_SEQ1=1; //选择排序器1软件触发
AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1=0; //每一个SEQ1结束时置位中断标志
AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=0; //禁止EVA触发SEQ1
AdcRegs.ADCTRL2.bit.EXT_SOC_SEQ1=0; //禁止外部触发SEQ1
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;
}
SysCtrlRegs.HISPCP.all = 0x0001;
一周热门 更多>