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:采样频率为10k 的 FIR 实现

Guru**** 2394075 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/703367/tm4c129xnczad-fir-implementation-with-sampling-freq-10k

器件型号:TM4C129XNCZAD

您好!

 我之前发布过、但到现在为止、我无法解决问题。

下面对我的问题进行了说明

我有一个添加了1KHz 和10kHz 的波形。 我想使用 fir 滤波器去除10kHz。 在 MATLAB 中使用 fdataool 的有符号滤波器。 它为我提供了27个系数。 现在,我尝试使用 DAC 7731在 tm4c129x 板上实现它。 我没有按我的需要获得输出。 您能不能建议我在程序中犯的任何错误或错误。

/*
main.c
*/
#include "stdbool.h"
#include "stdint.h"
#include "gpio.h"
#include "rom_map.h"
#include "driverlib/sysctL.h"
#include "hw_memmap.h"
#include "crinc/包含





"nectid.h"#mbrand.md.包含



"ng小时


#include "drivers/包含"nech"#brand.md.md.md.md.htm#include "#include "#include "#brand.md.md.htm#include "#include "#include "#tid.md.htm#include "#include "#g小时#include "#include "#tid.dl.md.md.md.md.md.htm#include "#include "#include "#include "#tid.md.md.md.md.md.htm#include "#include "#include "#grech"#include "#tid.md.md.md.md.md.md.md.md.md.md.md.md.md.htm#include

"

#include "driverlib/rom.h"
#include "driverlib/udma.h"
#include "driverlib/timer.h"
#include "driverlib/interrupt.h"
//#include "inc/hw_ints.h"

#define GPIO_PA2_SSI0CLK 0x0000080F
#define GPIO_PA3_SSI0FSS 0x00000C0F
#define GPIO_PA4_SSI0TX 0x0000100F
#define GPIO_PA5_SSI0RX 0x0000140F
void MT_SSIConfigure (void);
void MT_ADCConfigure (void);
//void Timer0IntHandler (void);
float xval[61]、DAC_count、value;
float sum、temp、voltage、value;
uint32_t pui32ADC0Value[2];
void DAC_LDAC (void);
uint32_t ui32Period;
uint32_t ui32SysClock;
uint32_t pui32DataTx;
const double Coeffs32[26]={

0.00042786716307723429、
0.002919136775687219、
0.0087411768920698726、
0.01728389646188545、
0.023790092406399139、
0.020625746649647263、
0.0026178235631764959、
-0.025784577131922413、
-0.047619527772776261、
-0.039756341015621199、
0.012766667411548112、
0.10310658429302662、
0.20045692369728618、
0.26366156038852501、
0.26366156038852501、
0.20045692369728618、
0.10310658429302662、
0.012766667411548112、
-0.039756341015621199、
-0.047619527772776261、
-0.025784577131922413、
0.0026178235631764959、
0.020625746649647263、
0.023790092406399139、
0.01728389646188545、
0.0087411768920698726、
0.002919136775687219、
0.00042786716307723429、





};
void MT_ADCConfigure()
{
SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOK);
GPIOPinTypeADC (GPIO_PORTK_base、GPIO_PIN_1);
ADCSequenceConfigure (ADC0_BASE、3、ADC_TRIGGER_TIMER、0);
ADCSequenceStepConfigure (ADC0_BASE、3、0、ADC_CTL_CH17 | ADC_CTL_IE |
ADC_CTL_END);
ADCSequenceEnable (ADC0_BASE、3);
ADCIntClear (ADC0_BASE、3);
}
void 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);
}

int main (void)
{
int i、k;
float xval[27]、dac_count、value;
浮点和、温度、电压;
uint32_t ui32SysClock、l;
ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |SYSCTL_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_TIMER0);
ROM_TimerConfigure (TIMER0_BASE、TIMER_CFG_PERIODICASE);
ui32Period =(SysCtlClockGet ()/10000);
TimerLoadSet (TIMER0_BASE、TIMER_A、ui32Period -1);
TimerControlTrigger (TIMER0_BASE、TIMER_A、TRUE);
MT_ADCConfigure();
MT_SSIConfigure();
DAC_LDAC ();
for (i=0;i<=26;i++)
{
xval[i]=0;
}

// IntEnable (INT_TIMER0A); //
// TimerIntEnable (TIMER0_BASE、TIMER_TINA_TIMEOUT); //
//
ROM_IntEnable (INT_TIMER0A);
ROM_TimerIntEnable (TIMER0_BASE、TIMER_TINA_TIMEOUT);
ROM_IntEnable (INT_ADC0SS3);
ROM_ADCIntEnable (ADC0_BASE、3);

ROM_IntMasterEnable();
ROM_TimerEnable (TIMER0_BASE、TIMER_A);
while (1)
{
MAP_GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_5、GPIO_PIN_5);
MAP_GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_3、GPIO_PIN_3);
// SysCtlDelay (8000);
// ADCProcessorTrigger (ADC0_BASE、3);

// while (!ADCIntStatus (ADC0_BASE、3、false))
// {
//}

// ADCIntClear (ADC0_BASE、3);

总和= 0;
for (k=0;k<=26;k++)
{
temp =(xval[k])*(firCoeffs32[k]);
总和=总和+温度;

}

for (i=27;i>=1;i---)
{
xval[i]= xval[i-1];
}
xval[0]=值;

DAC_count=(sum*8190);
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);
//

MAP_GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_5、GPIO_PIN_5);

}

//return 0;
}
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);
}

void ADC0SS3IntHandler (void)
{

ADCIntClear (ADC0_BASE、3);
ADCSequenceDataGet (ADC0_BASE、3、pui32ADC0Value);
Value=(*pui32ADC0Value*3.3)/4096;


}
void Timer0IntHandler (void)
{
ROM_TimerIntClear (TIMER0_BASE、TIMER_TINA_TIMEOUT);
}

请帮助我完成该操作。 现在我要吃果味。 我看到了很多 YouTube 视频。 但仍缺少所需的输出

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我很抱歉。 我的帮助能力主要限于如何使用 TM4C 微控制器和 TivaWare 库。 您的问题更像是需要应用调试帮助。 如果在进一步调试后您对特定外设的操作有疑问、请启动新帖子。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能告诉我为什么我的 ADC 没有获得我想要以10kHz 采样的正确数据吗
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    否、但我在您的其他帖子中提供了一个工作示例:
    e2e.ti.com/.../703645
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感受您的痛苦-但供应商代理"已"帮助-您独特的"全面、定制解决方案"(确实如此)落在您的...

    我是否可以建议您使用"kiss"、这种做法通常能够"加快、简化和增强"这种复杂的诊断工作?

    您说您的 ADC 是"无法获取正确的数据"-尽管这(可能)是真的-它提供(很少)诊断值!     

    相反-建议:

    • 您希望接收的 ADC 数据
    • 然后、它如何与您接收到的数据进行比较/对比!

    这种诊断价值要大得多-您不同意吗?

    为了进一步指导/协助-我建议您:

    • 向 ADC 提供已知的恒定模拟电压
    • 然后观察这是否"正确测量和记录"。

    这为您提供了"关键开始(以及非常需要的)参考点。   只有在这(第一)实现之后-您才能进一步冒险。   

    一系列小  步骤-始终"可衡量且检查的小步骤" -证明是"更好的途径"  -取得成功的结果...    (如您所述-您的"共同"方法-"机会少!")

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您的回复 thnak、因为我已经给出了稳定电压、所以它提供了准确的输出、但当我通过10K 采样时间的计时器提供1kHz 的正弦波时、我无法获得获取正弦波的准确值
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您以多快的速度运行 ADC? 我在上面显示的代码中看不到您对 ADCClockConfigSet()的调用。 如果您具有高(>50欧姆)源阻抗、则可能需要增加采样时间以获得准确的结果。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您似乎有两个线程在同一个问题上运行。 为了避免混淆和浪费时间、我将锁定此线程、让我们继续使用另一个线程:
    e2e.ti.com/.../2597054