想问一下大家,在File: Example_F2802xAdcSoc.c中,我通过改变Voltage1[10] 中数组的长度来实现采样次数的改变,同时在adc_isr函数中,ConversionCount,我也相应的修改了。可是每次采样出来的值只有10组是符合要求的。想问问大家为什么,我应该在什么地方修改了?能给个详细的指导吗?刚学dsp,因为要做一个采样系统:信号频率1hz,采样频率100hz。我应该怎样在TI的File: Example_F2802xAdcSoc.c上修改?有点急,谢谢大家了。
囧:
你指的采样次数是指对于1hz的信号需要在信号的一个周期内采100次吗?如果是的话,需要改的是触发ADC采样的PWM触发条件,需要将PWM频率改成100hz,然后设置0点采样就可以
想问一下大家,在File: Example_F2802xAdcSoc.c中,我通过改变Voltage1[10] 中数组的长度来实现采样次数的改变,同时在adc_isr函数中,ConversionCount,我也相应的修改了。可是每次采样出来的值只有10组是符合要求的。想问问大家为什么,我应该在什么地方修改了?能给个详细的指导吗?刚学dsp,因为要做一个采样系统:信号频率1hz,采样频率100hz。我应该怎样在TI的File: Example_F2802xAdcSoc.c上修改?有点急,谢谢大家了。
xingyi zhao:
回复 囧:
谢谢你。经过几天的琢磨,已经大致搞清楚采样程序各个部分的含义了。我原来的问题原因也找到了,也想和你分享一下。我在Voltage数组中将数组长度改变后,程序就报错,且错误原因链接到cmd文件中了。是因为,关于程序在数据段的内存不够,RAM1中的内存才1k,(真心感觉好少)这里可以在cmd文件中,数据段内存分配中看到:RAMM1 : origin = 0x000400, length = 0x000400 /* on-chip RAM block M1 */,而且程序在分配堆栈段的内存过多,导致采集数据变少。堆栈数据可以在,右键工程项目properties中的C2000 linker 目录下的basic option查找到。改小堆栈段,并采用单通道,现在我可以采样500个点了。不过还有一个问题想请教你,对于采样频率的问题。ADC时钟,应该是EPWM触发的,也就是说PWM的频率就是采样频率?不知道我这样的理解对不对。如果这样那么设置EPWM的触发时间是由:EPwm1Regs.TBPRD = 0xFFFF; 决定。而且PWM周期=(TBPRD+1)*TBCLK,TBCLK=SYSCLKOUT/(HSPCLKDIV*CLKDIV),那么我现在的问题来了,(1)SYSCLOUT是60M对吗(由振荡器10M 12倍频 2分频得到),还是说CPU是60M,系统时钟还要经过pll分频,我现在不确定SYSCLOUT是多少?希望你能指点我。
(2)系统时钟是不是在InitSysCtrl()就已经确定了?
(3)HSPCLKDIV和CLKDIV的值在什么地方规定?我没有找到。是不是使用默认值啊?
谢谢您的解答了。
想问一下大家,在File: Example_F2802xAdcSoc.c中,我通过改变Voltage1[10] 中数组的长度来实现采样次数的改变,同时在adc_isr函数中,ConversionCount,我也相应的修改了。可是每次采样出来的值只有10组是符合要求的。想问问大家为什么,我应该在什么地方修改了?能给个详细的指导吗?刚学dsp,因为要做一个采样系统:信号频率1hz,采样频率100hz。我应该怎样在TI的File: Example_F2802xAdcSoc.c上修改?有点急,谢谢大家了。
Jason Wu4:
回复 xingyi zhao:
SYSCLOUT是60M没问题,在InitSysCtrl()中确定了,HSPCLKDIV和CLKDIV是使用默认值
想问一下大家,在File: Example_F2802xAdcSoc.c中,我通过改变Voltage1[10] 中数组的长度来实现采样次数的改变,同时在adc_isr函数中,ConversionCount,我也相应的修改了。可是每次采样出来的值只有10组是符合要求的。想问问大家为什么,我应该在什么地方修改了?能给个详细的指导吗?刚学dsp,因为要做一个采样系统:信号频率1hz,采样频率100hz。我应该怎样在TI的File: Example_F2802xAdcSoc.c上修改?有点急,谢谢大家了。
xingyi zhao:
回复 Jason Wu4:
按照这样TBCLK=SYSCLKOUT/(HSPCLKDIV*CLKDIV) SYSCLKOUT=60MHZ HSPCLKDIV默认值为2 CLKDIV默认值为1
那么TBCLK 频率为30MHz。
又PWM周期=(TBPRD+1)*TBCLK , TBPRD=0xFFFF=65535(D) f(PWM)=30MHZ/65536 所以计算下来PWM的频率为457HZ 。
我刚刚做了实验了我采用2.4hz的信号发生源,采样点数是500个,差不多踩了一个周期,也即是采样频率=500*2.4=1200HZ;我又采用了24hz的信号,采样了500个点结果采了10个周期,每个周期50个点,说明采样周期还是1200hz左右,这与计算出来的457hz矛盾。
我想问一下,是PWM触发哪个地方计算有误吗?谢谢大家解答了。
想问一下大家,在File: Example_F2802xAdcSoc.c中,我通过改变Voltage1[10] 中数组的长度来实现采样次数的改变,同时在adc_isr函数中,ConversionCount,我也相应的修改了。可是每次采样出来的值只有10组是符合要求的。想问问大家为什么,我应该在什么地方修改了?能给个详细的指导吗?刚学dsp,因为要做一个采样系统:信号频率1hz,采样频率100hz。我应该怎样在TI的File: Example_F2802xAdcSoc.c上修改?有点急,谢谢大家了。
囧:
回复 xingyi zhao:
你用信号发生器发出来的是什么样的信号源?你的PWM是一周前触发几次ADC采样?
PWM周期=(TBPRD+1)*TBCLK , TBPRD=0xFFFF=65535(D) f(PWM)=30MHZ/65536 所以计算下来PWM的频率为457HZ 。
这种计算方法只适用于单增或者单减计数的模式,增减计数不是这样算
想问一下大家,在File: Example_F2802xAdcSoc.c中,我通过改变Voltage1[10] 中数组的长度来实现采样次数的改变,同时在adc_isr函数中,ConversionCount,我也相应的修改了。可是每次采样出来的值只有10组是符合要求的。想问问大家为什么,我应该在什么地方修改了?能给个详细的指导吗?刚学dsp,因为要做一个采样系统:信号频率1hz,采样频率100hz。我应该怎样在TI的File: Example_F2802xAdcSoc.c上修改?有点急,谢谢大家了。
xingyi zhao:
回复 囧:
我用的信号源产生的信号是正弦信号,频率为24hz,采样500个点,刚好实现10个周期信号的采样。
可是程序里面设置的计数模式为单增计数,EPwm1Regs.TBCTL.bit.CTRMODE = 0; // 递增计数开始 ,所以我就按照这样的方法计算了。比较器是128个时基时钟。EPwm1Regs.CMPA.half.CMPA = 0x0080; // 比较器A=128个TBCLK
我的ADC配置 和EPWM的配置程序都在下面(和TI给的程序一样)。我不知道PWM触发几次ADC采样,应该从哪个寄存器看呀?谢谢指导。
EALLOW;
AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1; AdcRegs.INTSEL1N2.bit.INT1E = 1; //使能 ADCINT1 AdcRegs.INTSEL1N2.bit.INT1CONT = 0; AdcRegs.INTSEL1N2.bit.INT1SEL = 2; AdcRegs.ADCSOC0CTL.bit.CHSEL = 4; AdcRegs.ADCSOC1CTL.bit.CHSEL = 4; AdcRegs.ADCSOC2CTL.bit.CHSEL = 2; //顺序采样模式选择通道A2进行电压采集 AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 5; AdcRegs.ADCSOC1CTL.bit.TRIGSEL = 5; AdcRegs.ADCSOC2CTL.bit.TRIGSEL = 5; //选择出发源 AdcRegs.ADCSOC0CTL.bit.ACQPS = 6; // AdcRegs.ADCSOC1CTL.bit.ACQPS = 6; // AdcRegs.ADCSOC2CTL.bit.ACQPS = 6; //以上三行都是决定采样窗口大小,以调整采样时间大小 EDIS;
EPwm1Regs.ETSEL.bit.SOCAEN = 1; // 使能ADCSOC脉冲 EPwm1Regs.ETSEL.bit.SOCASEL = 4; // 在定时器递增时,当时基计数器等于CMPA时使能事件 EPwm1Regs.ETPS.bit.SOCAPRD = 1; // 在第一个事件是产生EPWMxSOCA脉冲 EPwm1Regs.CMPA.half.CMPA = 0x0080; // 比较器A=128个TBCLK EPwm1Regs.TBPRD = 0xFFFF; // 设置EPWM的周期(TBCLK=SYSCLKOUT/(HSPCLKDIV*CLKDIV)时基时钟与系统时钟的关系) EPwm1Regs.TBCTL.bit.CTRMODE = 0; // 递增计数开始