TI中文支持网
TI专业的中文技术问题搜集分享网站

为何一个50Hz的交流信号经过28335的内置A/D转换后变成了一个100Hz的交流信号?

最近使用28335在线调试时遇到了一个问题,百思不得其解,使用28335的内置A/D采样一个50Hz的交流信号,转换后的结果却变成了100Hz的交流信号,但信号幅度是正确的,只是频率加倍了。为了排除干扰,通过示波器观察可得传感器输出的电压信号为50Hz,则排除了传感器的问题。A/D采样频率为100kHz,与A/D转换有关的程序如下所示:

ConfigCpuTimer(&CpuTimer0,150,10); //设置10微秒的定时器,每次定时器中断进行一次A/D转换

ConfigADC();//A/D转换初始化子程序

interrupt void cpu_timer0_isr(void) //定时器中断子程序
{

ReadADC_Results();//读取A/D转换值子程序

}

void ConfigADC(void) //A/D转换初始化子程序
{
    InitAdc();
    EALLOW;
        SysCtrlRegs.HISPCP.all = ADC_MODCLK;//25MHz
    EDIS;
    AdcRegs.ADCTRL1.bit.ACQ_PS = 0x0;//启动脉冲宽度: ACQ_PS+1 个ADCLK周期
    AdcRegs.ADCTRL1.bit.CPS = 0; //0:不分频, 1:二分频
    AdcRegs.ADCTRL3.bit.ADCCLKPS = 0x1;//分频系数:2*ADCCLKPS
    AdcRegs.ADCTRL3.bit.SMODE_SEL = 0;//顺序采样
    AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 4;//转换通道数量: 5个
    AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;//级联模式
    AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;
    AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1;
    AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x2;
    AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x3;
    AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 0x4;
}

void ReadADC_Results(void) //读取A/D转换结果子程序
{
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; //重置序列发生器
AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1; //开始本次转换
while(AdcRegs.ADCST.bit.INT_SEQ1 == 0); //等待本次转换结束
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; //清除中断标志位
Vpv = AdcRegs.ADCRESULT0>>4; //12位A/D,左对齐的结果右移四位,变成右对齐的结果
Vc1 = AdcRegs.ADCRESULT1>>4;
Vc2 = AdcRegs.ADCRESULT2>>4;
Ig = AdcRegs.ADCRESULT3>>4;
Vg = AdcRegs.ADCRESULT4>>4;
ConvVpv = (Vpv*temp1-1.687)*160.0; //换算为真实值
ConvVc1 = (Vc1*temp1-1.691)*1600.0;
ConvVc2 = (Vc2*temp1-1.669)*1600.0;
ConvIg = (Ig*temp1-1.68)*16.0;
ConvVg = (Vg*temp1-1.665)*160.0;
}

user5994389:

回复 Green Deng:

我通过graph看的,闹了个乌龙,我找到问题所在了,不是A/D的问题,是我的控制器太复杂,10微秒不够我的控制程序执行,需要20微秒,所以就相当于20微秒才进一次定时器中断,所以才出现100Hz的波形。是我粗心了,打扰大家了。

最近使用28335在线调试时遇到了一个问题,百思不得其解,使用28335的内置A/D采样一个50Hz的交流信号,转换后的结果却变成了100Hz的交流信号,但信号幅度是正确的,只是频率加倍了。为了排除干扰,通过示波器观察可得传感器输出的电压信号为50Hz,则排除了传感器的问题。A/D采样频率为100kHz,与A/D转换有关的程序如下所示:

ConfigCpuTimer(&CpuTimer0,150,10); //设置10微秒的定时器,每次定时器中断进行一次A/D转换

ConfigADC();//A/D转换初始化子程序

interrupt void cpu_timer0_isr(void) //定时器中断子程序
{

ReadADC_Results();//读取A/D转换值子程序

}

void ConfigADC(void) //A/D转换初始化子程序
{
    InitAdc();
    EALLOW;
        SysCtrlRegs.HISPCP.all = ADC_MODCLK;//25MHz
    EDIS;
    AdcRegs.ADCTRL1.bit.ACQ_PS = 0x0;//启动脉冲宽度: ACQ_PS+1 个ADCLK周期
    AdcRegs.ADCTRL1.bit.CPS = 0; //0:不分频, 1:二分频
    AdcRegs.ADCTRL3.bit.ADCCLKPS = 0x1;//分频系数:2*ADCCLKPS
    AdcRegs.ADCTRL3.bit.SMODE_SEL = 0;//顺序采样
    AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 4;//转换通道数量: 5个
    AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;//级联模式
    AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;
    AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1;
    AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x2;
    AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x3;
    AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 0x4;
}

void ReadADC_Results(void) //读取A/D转换结果子程序
{
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; //重置序列发生器
AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1; //开始本次转换
while(AdcRegs.ADCST.bit.INT_SEQ1 == 0); //等待本次转换结束
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; //清除中断标志位
Vpv = AdcRegs.ADCRESULT0>>4; //12位A/D,左对齐的结果右移四位,变成右对齐的结果
Vc1 = AdcRegs.ADCRESULT1>>4;
Vc2 = AdcRegs.ADCRESULT2>>4;
Ig = AdcRegs.ADCRESULT3>>4;
Vg = AdcRegs.ADCRESULT4>>4;
ConvVpv = (Vpv*temp1-1.687)*160.0; //换算为真实值
ConvVc1 = (Vc1*temp1-1.691)*1600.0;
ConvVc2 = (Vc2*temp1-1.669)*1600.0;
ConvIg = (Ig*temp1-1.68)*16.0;
ConvVg = (Vg*temp1-1.665)*160.0;
}

Green Deng:

回复 user5994389:

非常感谢你的反馈

赞(0)
未经允许不得转载:TI中文支持网 » 为何一个50Hz的交流信号经过28335的内置A/D转换后变成了一个100Hz的交流信号?
分享到: 更多 (0)