2019-03-24 10:23发布
labixiaojing 发表于 2014-7-11 19:20 定时器周期中断启动,而且发现频率高于50Hz时没有问题,频率低于40Hz会出现这种现象
ltbytyn 发表于 2014-7-12 23:30 不同频率的信号,你是一个周波采样几个点,还是20ms采样几个点算的?
ltbytyn 发表于 2014-7-14 19:59 基本上一个周期采10个点左右。难道每个周期周期采样点有可能不确定吗? 不要搞太复杂。先把程序优化成单一 ...
最多设置5个标签!
不同频率的信号,你是一个周波采样几个点,还是20ms采样几个点算的?
不同频率改变采样率,基本上一个周期采10个点左右,关键导师要求实际信号频率只有几Hz到十几Hz
我本来就是单一频率信号采样的,只是因为有断层现象试一下不同频率输入会不会有什么不同。附上程序,麻烦帮忙看下
void main(void)
{
InitSystem(); //初始化DSP内核寄存器
InitPieCtrl();
InitDIDO(); //调用PIE控制单元初始化函数
InitPieVectTable(); // 调用PIE向量表初始化函数
InitAdc(); //调用ADC模块的基本初始化函数
EALLOW;
PieVectTable.ADCINT=&adc_isr; //重新设置PIE向量表中ADc的中断入口向量
EDIS;
PieCtrlRegs.PIEIER1.bit.INTx6=1; //使能PIE中断分组1中的ADC中断
GpioDataRegs.GPASET.bit.GPIOA0=1;
GpioDataRegs.GPACLEAR.bit.GPIOA0=1;
IER=1; //使能和ADC中断相连的CPU INT1中断
EINT; //使能全局中断位INTM
ERTM; // 使能全局实时调试中断DBGM
/* SET ADC*/
AdcRegs.ADCTRL3.bit.SMODE_SEL=0;
AdcRegs.ADCTRL1.bit.SEQ_CASC=0;//双排序器工作模式
AdcRegs.ADCTRL1.bit.CONT_RUN=0;//启动-停止模式
AdcRegs.ADCTRL1.bit.CPS=0; //FCLK=CLK/1
AdcRegs.ADCMAXCONV.all=2;
AdcRegs.ADCCHSELSEQ1.bit.CONV00=0x0;
AdcRegs.ADCCHSELSEQ1.bit.CONV01=0x01;
AdcRegs.ADCCHSELSEQ1.bit.CONV02=0x02;
AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=1; //使能EVA引起的中断
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1;
AdcRegs.ADCTRL3.bit.ADCCLKPS=2; //ADc模块的核心时钟频率=HSPCLK/4
/* SET EVA*/
EvaRegs.GPTCONA.bit.TCMPOE=0; //禁止比较输出
EvaRegs.GPTCONA.bit.T1PIN=0;
EvaRegs.GPTCONA.bit.T1TOADC=2; //设置周期中断标志启动ADC
EvaRegs.T1CON.bit.FREE=0; //防真挂起时,定时器1立即停止工作
EvaRegs.T1CON.bit.SOFT=0;
EvaRegs.T1CON.bit.TMODE=2; //连续增计数模式
EvaRegs.T1CON.bit.TPS=7; //设置定时器时钟频率为HSPCLK/128
EvaRegs.T1CON.bit.TENABLE=1; //允许定时器操作
EvaRegs.T1CON.bit.TCLKS10=0; //内部时钟
EvaRegs.T1CON.bit.TCLD10=0; //计数器为0时重载
EvaRegs.T1CON.bit.TECMPR=0; //禁止比较操作
EvaRegs.T1PR=2000;//300hz
while(1)
{
}
}
void InitSystem(void)
{
EALLOW;
SysCtrlRegs.WDCR=0x00E8; //禁止看门狗模块
SysCtrlRegs.PLLCR.bit.DIV=10; //将CPU的PLL倍频系数设为5
SysCtrlRegs.HISPCP.all=0x1; //高速时钟的预定标器设置成除以2
SysCtrlRegs.LOSPCP.all=0x2; //低速时钟的预定标器设置成除以4
//根据需要时能各种外设模块的时钟
SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;
SysCtrlRegs.PCLKCR.bit.ADCENCLK=1;
EDIS;
}
interrupt void adc_isr(void)
{
EALLOW;
temp0[x]=AdcRegs.ADCRESULT0>>4;
temp1[x]=AdcRegs.ADCRESULT1>>4;
temp2[x]=AdcRegs.ADCRESULT2>>4;
x++;
if(x==512)
{
x=0;
}
//重新初始化ADC采样序列
AdcRegs.ADCTRL2.bit.RST_SEQ1=1; //复位SEQ1
AdcRegs.ADCST.bit.INT_SEQ1_CLR=1; //清除中断位INT SEQ1
PieCtrlRegs.PIEACK.all=PIEACK_GROUP1; //清除PIE1的中断响应位
EDIS;
}
一周热门 更多>