This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C129XNCZAD:FIR 滤波器实现问题

Guru**** 2412100 points
Other Parts Discussed in Thread: TM4C129XNCZAD

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/649732/tm4c129xnczad-fir-filter-implementation-problem

器件型号:TM4C129XNCZAD

尊敬的所有人

 我想使用 tm4c129xnczad 设计 FIR 滤波器。 我从函数发生器获取数据,应用算法后,我想将数据发送到 DAC。 尽管 DAC 和 ADC 工作正常、但不知怎么说、我不会获得输出。 我认为问题在算法部分。 请帮助我查找问题。 我正在发布代码。

uint32_t pui32ADC0Value[2];
void DAC_LDAC (void);
const float firCoeffs32[40]={
+0.0088、0.0108、0.0130、+0.0151、0.0173、 0.0195、0.0217、0.0238、
0.0259、0.0279、0.0298、0.0316、0.0333、 0.0348、0.0361、0.0373、
0.0382、0.0390、0.0396、0.0399、0.0400、 0.0399、0.0396、0.0390、
+0.0382、0.0373、0.0361、0.0348、0.0333、 0.0316、0.0298、0.0279、
0.0259、0.0238、0.0217、0.0195、0.0173、 0.0151、0.0130、0.0108、0.0088
};
空 MT_ADCConfigure()

SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);
GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_3);
ADCSequenceConfigure (ADC0_BASE、3、ADC_TRIGGER_PROCESSOR、0);
ADCSequenceStepConfigure (ADC0_BASE、3、0、ADC_CTL_CH0 | ADC_CTL_IE |
ADC_CTL_END);
ADCSequenceEnable (ADC0_BASE、3);
ADCIntClear (ADC0_BASE、3);

空 MT_SSIConfigure()

SysCtlPeripheralEnable (SYSCTL_Periph_SSI0);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
GPIOPinConfigure (GPIO_PA2_SSI0CLK);
GPIOPinConfigure (GPIO_PA3_SSI0FSS);
GPIOPinConfigure (GPIO_PA4_SSI0TX);
GPIOPinConfigure (GPIO_PA5_SSI0RX);
GPIOPinTypeSSI (GPIO_Porta_base、GPIO_PIN_5 | GPIO_PIN_4 | GPIO_PIN_3 | GPIO_PIN_2);
SSIConfigSetExpClk (SSI0_BASE、SysCtlClockGet ()、SSI_FRF_MOTO_MOTO_MODE_3、
SSI_MODE_MASTER、10000、16);
SSIEnable (SSI0_BASE);


/*
* main.c
*
int main (空)

uint32_t xval[40]、dac_count;
浮点和、温度、电压;
uint32_t ui32SysClock;
uint32_t pui32DataTx;
int i、k;
ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |SYSCTL_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_320)、
120000000);
MT_ADCConfigure();
MT_SSIConfigure();
DAC_LDAC ();

对于(i=0;i<40;i++)

xval[i]=0;


while (1)

MAP_GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_3、GPIO_PIN_3);//复位信号
MAP_GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_5、GPIO_PIN_5);//LDAC 信号
ADCProcessorTrigger (ADC0_BASE、3);

while (!ADCIntStatus (ADC0_BASE、3、false))

ADCIntClear (ADC0_BASE、3);
ADCSequenceDataGet (ADC0_BASE、3、pui32ADC0Value);
// xval[0]=*pui32ADC0Value;
voltion=(pui32ADC0Value[0]*3.3)/4096;
xval[0]=电压;
总和= 0;

for (k=0;k<40;k++)

temp =(xval[k])*(firCoeffs32[k]);

sum = sum + temp;


DAC_count=(sum*10000)/4;
pui32DataTx=DAC_COUNT;
SSIDataPut (SSI0_BASE、pui32DataTx);
while (SSIBusy (SSI0_BASE))


MAP_GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_5、0);
SSIIntClear (SSI0_BASE、SSI_RXFF);
SysCtlDelay (10);

MAP_GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_5、GPIO_PIN_5);

for (i=40;i>=0;i---)

xval[i+1]= xval[i];



void DAC_LDAC ()

/// LDAC 信号
MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
MAP_GPIOPinTypeGPIOOutput (GPIO_PORTB_BASE、GPIO_PIN_5);
MAP_GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_5、GPIO_PIN_5);
//复位信号
MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
MAP_GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、GPIO_PIN_3);
MAP_GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_3、0);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    两条注释

    1. 使用粘贴代码( )。 您在这里的内容几乎无法读取、我甚至没有尝试读取它。
    2. " 我认为问题出在算法部分。" -然后在 PC 上进行测试。 您在 PC 上有很多空间和工具可供测试。 您可以轻松地将数百万个数据点数据馈送到您的筛选器中以进行测试。

    Robert

    侧注:40个系数听起来像是一个非常大的滤波器。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Robert Adsett"]侧注:40个系数听起来像是一个非常大的滤波器。[/quot]

    您认为吗?    而且,与以往一样,"这种需要"从未解释过,也从未解释过。     糟糕的吻-脚踢到路边-仍然伸出一只擦伤的手...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我发布的 while 循环代码请查看此代码中的错误

    while (1)

    ADCProcessorTrigger (ADC0_BASE、3);
    while (!ADCIntStatus (ADC0_BASE、3、false))



    ADCIntClear (ADC0_BASE、3);
    ADCSequenceDataGet (ADC0_BASE、3、pui32ADC0Value);
    voltion=(pui32ADC0Value[0]*3.3)/4096;
    xval[0]=电压;
    总和= 0;
    for (k=0;k<40;k++)

    temp =(xval[k])*(firCoeffs32[k]);
    sum = sum + temp;

    DAC_count=(sum*10000)/4;
    pui32DataTx=DAC_COUNT;
    SSIDataPut (SSI0_BASE、pui32DataTx);
    while (SSIBusy (SSI0_BASE))


    MAP_GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_5、0);
    SSIIntClear (SSI0_BASE、SSI_RXFF);
    SysCtlDelay (10);
    for (i=40;i>=0;i---)

    xval[i+1]= xval[i];


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    首先、什么使您认为 while 环路中存在问题?
    第二次使用粘贴代码、所显示的代码基本上是不可读的。

    Robert
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    问题在于 while 循环、效率较低的分段、因此如果我将其倍数、则它会提供 DAC 无法理解的极低值 


    while (1) { MAP_GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_3、GPIO_PIN_3); //复位信号 MAP_GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_5、GPIO_PIN_5); //LDAC 信号 ADCProcessorTrigger (ADC0_BASE、3); while (!ADCIntStatus (ADC0_BASE、3、false)) { } ADCIntClear (ADC0_BASE、3); ADCSequenceDataGet (ADC0_BASE、3、pui32ADC0Value); // xval[0]=*pui32ADC0Value; voltion=(pui32ADC0Value[0]*3.3)/4096; xval[0]=电压; 总和= 0; for (k=0;k<40;k++) { temp =(xval[k])*(firCoeffs32[k]); 总和=总和+温度; } DAC_count=(sum*10000)/4; pui32DataTx=DAC_COUNT; SSIDataPut (SSI0_BASE、pui32DataTx); while (SSIBusy (SSI0_BASE)) { } MAP_GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_5、0); SSIIntClear (SSI0_BASE、SSI_RXFF); SysCtlDelay (10); MAP_GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_5、GPIO_PIN_5); for (i=40;i>=0;i---) { xval[i+1]= xval[i]; } }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您使用粘贴代码、这确实很有帮助。 但是、这句话应放在粘贴的代码之外、以便正确换行。

    [引用 user="gurpreet singh96"]问题在于 while 循环中的问题是、效率较低的分段、因此如果我将其多个、则它将提供 DAC 无法理解的极低值

    这似乎不会使其成为 while 环路的问题、而是滤波器的问题。 我强烈建议您在 PC 上测试这一点。 实际上、我建议您使用电子表格进行测试。

    您尚未回答的问题、为什么要用40个术语? 这似乎太过分了。

    我有以下建议

    1. 将筛选器作为函数而不是内联实现
    2. 减少术语数。 从一个或两个开始、然后从该值开始增加
    3. 使用 STEP 函数在电子表格上进行仿真。 这为您提供了一定程度的交互性、有助于您了解滤波器。
    4. 在 PC 上使用 C 语言进行测试/仿真。 当您修改行为时、TDD 是您的真正朋友

    Robert

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    海报可能不太熟悉"TDD"(测试驱动型开发)。

    这是一份出色的纸质背板(Robert 和我自己拥有)、James W. Grenning 著的"嵌入式 C 的测试驱动开发"。

    抓住该滤波器(单独使用)可能不会证明是增强功能的最佳方法。    当然、40个术语的筛选条件决定仍处于"神秘状态"。   (很高兴这样的"海报口授"受到了仔细检查、"很好、反复"挑战!)