为什么DSP28335ADC采样正弦信号波形失真?
本帖最后由 blues_more 于 2015-1-5 20:48 编辑一个由信号发生器发出的正弦信号,信号频率为220Hz(模仿交流电信号频率,因为最终要采样交流电),方法是将数据由串口传PC,然后matlab绘图,但是结果波形有失真。主要程序和绘图结果如下。请问是什么原因呢?
Configure ADC
AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK;
AdcRegs.ADCMAXCONV.all = 0; // Setup 2 conv's on SEQ1
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x3; // Setup ADCINA3 as 1st SEQ1 conv.
AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1;// Enable SOCA from ePWM to start SEQ1
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;// Enable SEQ1 interrupt (every EOS)
Assumes ePWM1 clock is already enabled in InitSysCtrl();
EPwm1Regs.ETSEL.bit.SOCAEN = 1; // Enable SOC on A group
EPwm1Regs.ETSEL.bit.SOCASEL = 4; // Select SOC from from CPMA on upcount
EPwm1Regs.ETPS.bit.SOCAPRD = 01; // Generate pulse on 1st event
EPwm1Regs.CMPA.half.CMPA = 0x0080;
EPwm1Regs.TBPRD = 0x1D4B; // Set period for ePWM1
EPwm1Regs.TBCTL.bit.CTRMODE = 00; // count up and start
interrupt voidadc_isr(void)
{
VoltageH = AdcRegs.ADCRESULT0 >>12;
VoltageL = AdcRegs.ADCRESULT0 >>4;
// If 40 conversions have been logged, start over
if(ConversionCount == 127)
{
for (ConversionCount=0;ConversionCount<128;ConversionCount++)
{
scib_xmit(VoltageH);
scib_xmit(VoltageL);
}
for(;;);
ConversionCount = 0;
}
else ConversionCount++;
// Reinitialize for next ADC sequence
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // Reset SEQ1
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; // Clear INT SEQ1 bit
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // Acknowledge interrupt to PIE
return;
}
建议你先在CCS的Graph下看看效果
排除在上传等过程造成的影响
zhangmangui 发表于 2015-1-5 23:12 static/image/common/back.gif
建议你先在CCS的Graph下看看效果
排除在上传等过程造成的影响
按照你的说法,用graph看了,依然有畸变,信号发生器的信号应该很光滑的啊,请问是什么其他原因呢。我采样时用epwm触发的,只用一个通道A3,每采一个数,进中断保存一下。下面四我在graph中看的信号。
采样的电路拿示波器勾一下,看看是什么波形? 海中水 发表于 2015-1-7 16:06 static/image/common/back.gif
采样的电路拿示波器勾一下,看看是什么波形?
下面是示波器显示的信号,三个图是一个信号,我调了一下比例,你觉得怎么样,是不是信号发生器的信号本来就有锯齿
blues_more 发表于 2015-1-7 16:36 static/image/common/back.gif
下面是示波器显示的信号,三个图是一个信号,我调了一下比例,你觉得怎么样,是不是信号发生器的信号本来 ...
信号是OK的,采样的保持时间放长一点,而且采完之后清0。实在不行试一下双缓存吧! 海中水 发表于 2015-1-7 17:02 static/image/common/back.gif
信号是OK的,采样的保持时间放长一点,而且采完之后清0。实在不行试一下双缓存吧! ...
改了保持时间,还是不行,请问具体什么是双缓存呢? blues_more 发表于 2015-1-7 17:33 static/image/common/back.gif
改了保持时间,还是不行,请问具体什么是双缓存呢?
你上面的那个波形是勾的信号发生器输出的吗?如果是不要勾那里的,勾AD采样引脚的。双缓存我估计也不行。 双缓存就是读取值的时候有两个缓存值,两个交替转换。一个用来操作数据,一个用来获取AD转换。 海中水 发表于 2015-1-7 17:39 static/image/common/back.gif
你上面的那个波形是勾的信号发生器输出的吗?如果是不要勾那里的,勾AD采样引脚的。双缓存我估计也不行。 ...
勾的就是AD采样引脚 海中水 发表于 2015-1-7 17:41 static/image/common/back.gif
双缓存就是读取值的时候有两个缓存值,两个交替转换。一个用来操作数据,一个用来获取AD转换。 ...
软件或者硬件矫正一下是不是会好 blues_more 发表于 2015-1-7 22:22 static/image/common/back.gif
软件或者硬件矫正一下是不是会好
软件矫正肯定有效果 blues_more 发表于 2015-1-7 22:22 static/image/common/back.gif
软件或者硬件矫正一下是不是会好
AD采样矫正一下应该会好,但是你的是实时的信号。你先试一下吧!这种每个点都要的应用我还真没有做过。 zhangmangui 发表于 2015-1-7 22:26 static/image/common/back.gif
软件矫正肯定有效果
请问你说的软件矫正是adc_cal吗,这个我已经声明了,并且我看在例程的init_adc函数中也调用了啊。还是需呀做别的,另外想请教你一个关于adc_cal的问题,我看到在其中是这么写的
_ADC_cal
MOVW DP, #ADCREFSEL_LOC >> 6
MOV @28, #0xAAAA
MOV @29, #0xBBBB
LRETR
我的理解后两句中0XAAAA和0XBBBB是不是需要根据自己情况去修改? 软件应该这样矫正的吧,或者在程序中加个滤波器看看? zhangmangui 发表于 2015-1-7 22:26 static/image/common/back.gif
软件矫正肯定有效果
版主你好,为什么我结贴给分时候一直提示分数未分配或分配错误啊。。。没法给大家分数,实在不好意思 blues_more 发表于 2015-1-25 13:10 static/image/common/back.gif
版主你好,为什么我结贴给分时候一直提示分数未分配或分配错误啊。。。没法给大家分数,实在不好意思 ...
你说的这种
_ADC_cal
MOVW DP, #ADCREFSEL_LOC >> 6
MOV @28, #0xAAAA
MOV @29, #0xBBBB
LRETR
我也不知道什么原理
软件矫正 我的理解是加各种滤波算法 这就不错了不可能百分百还原的 ,硬件上的干扰还是很容易串进来的 blues_more 发表于 2015-1-25 13:10 static/image/common/back.gif
版主你好,为什么我结贴给分时候一直提示分数未分配或分配错误啊。。。没法给大家分数,实在不好意思 ...
楼主你好,请问你的问题 解决了吗,我用28335 AD 进行采样的时候也遇到类似问题,AD 管脚的电压很好,但是AD 采样出来的数字量 毛刺就很多,百思不得其解 blues_more 发表于 2015-1-7 16:02
按照你的说法,用graph看了,依然有畸变,信号发生器的信号应该很光滑的啊,请问是什么其他原因呢。我采 ...
你好,可以说一下你的graph的具体设置吗?
页:
[1]
2