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.

[参考译文] TMS320F28377D:Σ-Δ 滤波器有符号和无符号问题的数据输出、通过数据处理每200个样本产生高峰值

Guru**** 2579025 points
Other Parts Discussed in Thread: TMS320F28379D, AMC1305M05, CONTROLSUITE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/719775/tms320f28377d-data-out-of-sigma-delta-filter-signed-and-unsigned-problem-and-high-peaks-every-200-samples-through-data-processing

器件型号:TMS320F28377D
主题中讨论的其他器件:TMS320F28379DAMC1305M05controlSUITE

社区好、我在从 Σ-Δ 滤波器模块中获取正确数据时遇到了问题。 该位流由 TI 的 AMC1305M05生成。 为了进行滤波、我使用 TMS320F28379D 的集成 SDFM (具有集线站的 controlCARD 版本)。
两侧都需要一个 CLK 才能正常工作、为此、我在 TMS320F28379D 上配置了一个 ePWM 模块。 以20MHz 运行的 CLK 以最快速度获取详细数据。
现在、硬件已调整为正常工作、滤波信号上的噪声尽可能小。

在第一个测试中、我使用 了 controlSUITE "sdfm_PWM_SYNC"中的一个项目。  每个 SDFM-数据滤波器的基本配置是64的 OSR 和4位的位移、让我得到准确的值、但所有数据都是有符号整数(对吗?) 二´s 补码。

在 CodeComposerStudio 中使用原始代码时、我还可以看到、此数据类型存在问题、因为 CCS 将所有内容解释为无符号整数。 当数据从 CCS 保存到 csv 文件中时、也会发生这种错误的解释。 (只有 binaräy 代码是正确的。)
如何轻松地将数据转换为正确的非 sigend 整数以尽可能快地使用数据? 例如、在错误中断中、将数据添加到 DAC 的寄存器或其他内容。

下一个是 SDFM 的~ 200个采样后、数据中出现峰值、并且可以跳至最大值或最小值。 起初、我认为保存数据是一个问题、因为我决定保存200个以上的样本(原始代码中最多保存200个数据点)。 我更改了代码、这样数据就不会保存在电路板上、而是从数字数据中重新生成原始波形。 我认为这将对峰值有帮助、但峰值仍然存在。 我估计每200个样本后仍会出现峰值。
2.我的数据处理有什么问题? 如何停止峰值?

我将从示波器中给出一个 scrrrrrrrrrrrrshot 示例、您可以在其中看到 DAC 产生的三个信号。 DAC 通过来自 TMS320F28379D SDFM 的数据进行馈送、位流来自三个 AMC1305M05 IC。 AMC1305M05 IC 测量的信号来自分压器上的单个信号发生器。



代码也将在此处。

//######################################################################################################################
//
////文件:sdfm_PWM_SYNC_CPU_cpu01.c
//
//标题:F2837xD 的 SDFM PWM 同步示例。
//
//! addtogroup cpu01_example_list
//! 

SDFM PWM 同步

//! //! 在此示例中、SDFM 滤波器数据由 CPU 在 SDFM ISR 例程中读取。 //! SDFM 配置如下所示: //! -本例中使用了 SDFM1 //! -选择 MODE0输入控制模式 //! -比较器设置 //! -选择了 SinC3滤波 器//! - OSR = 32 //! - HLT = 0x7FFF (阈值上限设置) //! - LLT = 0x0000 (阈值下限设置) //! -数据过滤器设置 //! -启用所有4个滤波器模块 //! -选择了 SinC3滤波 器//! - OSR = 256 //! -所有4个滤波器均通过使用 PWM //! (主滤波器使能位) //! -以16位格式表示的滤波器输出 //! -为了转换25位数据过滤器 //! 转换为16位格式用户需要为 //右移9位! OSR = 256 //!的 Sinc3滤波器 - SDFM 滤波 器的中断模块设置//! -所有4个阈值更高的比较器中断被禁用 //! -所有4个阈值下限比较器中断被禁用 //! -禁用所有4个调制器故障中断 //! -所有4个滤波器将在新的滤波器数据 //! 可用 //! // //########################################################################################################################## //$TI 发行版:F2837xD 支持库 V210 $// $发行 日期:星期二11月1日14:46:15 CDT 2016 $// 版权所有:版权所有(C) 2013-2016德州仪器(TI)公司-// http://www.ti.com/保留所有权利$ //############################################################################################################ // //包含的文件 // #include "F28x_Project.h" #include "F2837xD_struct.h" #include "F2837xD_sdfm_drivers.h" // 定义 // #define MAX_SAples 200 #define SDFM_PIN_MUX_OPTION1 1 #define SDFM_PIN_MUX_Option2 2 #define SDFM_PIN_MUX_OPTION3. 3 #define ePWM_TIMER_TBPRD 65535 // ePWM 周期寄存器 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //define für ePWM #define DB_UP 1//define für DAC #define reference_VDAC 0 #define reference_VREF 1 #define DACA 1 #define DACB 2 #define DACC 3 #define reference reference_VREF #define DAC_NUM DACA/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // //全局 // uint16_t gPeripheralNumber,gPWM_Number = 11; uint16_t Filter1_result[MAX_Samples]; uint16_t Filter3_Result[MAX_Samples]; uint16_t Filter2_resultsamples];uint16_t Filter2_Result [MAX_Samples]; uint16_t filter4_result[MAX_samples]; ////////////////////////////////////////////////////////////////////////////////////////////////////////////// //Globales für ePWM UINT16 EPwm7_DB_DIRECTION; UINT16 EPwm6_DB_DIRECTION; UINT16 EPwm5_DB_DIRECTION; UINT16 EPwm4_DB_DIRECTION; UINT32 EPwm7TZIntCount; uint32 EPwm6TZIntCount; uint32 EPwm5TZIntCount; uint32 EPwm4TZIntCount; //Glaobales für DAC volatile struct DAC_regs* DAC_PTR[4]={0x0、DacaRegs、DacbRegs、& Dacces、//////////////////////////////////////////////////////////////////////////////// void #configma DATA_SECTION (Filter1_Result、"Filter1_RegsFile"); #pragma DATA_SECTION (Filter2_Result、"Filter2_RegsFile"); #Filterma DATA_SECTION (Filter3_Result、"Filter3_RegsFile"); #pragma DATA_SECTION (Filter4_Result、"Filter4_Regsfile");_ pragma INSD/ INDIRECT_INU16 ( void); void pragma NOT_pragma (void) pragma INSD/ INSDT/ INDIRECTPLISRISR/ IND16);void (void (void) ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //函数原型 für ePWM void InitEPwm7Examples(); void InitEPwm6Examples(); void InitEPwm5Examples(); void InitEPwm4Examples(); __interrupt void epwm7_ISR (void); __interrupt void epwm6_ISR (void); __interrupt void epwm5_ISR (void); __interrupt void epwm4_ISR (void); void InitEPwmGpio_TZ (void); //函数原型 für DAC void configureDAC (uint16 DAC_num); //////////////////////////////////////////////////////////////////////////////////////// // // Main // void main (void) { uint16_t pinMuxoption; uint16_t HLT、LLT; // 初始化系统控制: // PLL、看门狗、启用外设时钟 //此示例函数可在 F2837xD_sysctrl.c 文件中找到。 // InitSysCtrl(); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// InitGpio(); // Einschalten der CLK der PWM 模块 // CpuSysRegs.PCLKCR2.bit.EPWM7=1; CpuSysRegs.PCLKCR2.bit.EPWM6=1; CpuSysRegs.PCLKCR2.bit.EPWM5=1; CpuSysRegs.PCLKCR2.bit.EPWM4=1; InitEPwmGpio_TZ (); //////////////////////////////////////////////////////////////////////////////////////////////// // //清除所有__interrupts 并初始化 PIE 矢量表: //禁用 CPU __interrupts // Dint; // //将 PIE 控制寄存器初始化为默认状态。 //默认状态是禁用所有 PIE _interrupts 并 清除标志//。 //此函数位于 F2837xD_PIECTRL.c 文件中。 // InitPieCtrl(); // 禁用 CPU __interrupts 并清除所有 CPU __interrupt 标志: // IER = 0x0000; IFR = 0x0000; // //初始化 PIE 矢量表,其中包含指向 shell 中断 //服务例程(service routines,ISR)的指针。 //这将填充整个表,即使在 本示例中未使用__interrupt //也是如此。 这对于调试很有用。 //可以在 F2837xD_SYSCTRL.c 中找到 shell ISR 例程 //此函数位于 F2837xD_SYSCTRL.C.中 // InitPieVectTable(); // //此示例中使用的中断被重新映射到 这个文件中的// ISR 函数。 // EALLOW; PieVectTable.SD1_INT =&Sdfm1_ISR; PieVectTable.SD2_INT =&Sdfm2_ISR; ////////////////////////////////////////////////////////////////////////////////////////// PieVectTable.EPWM7_TZ_INT =&epwm7_ISR; PieVectTable.EPWM6_TZ_INT =&epwm6_ISR; PieVectTable.EPWM5_TZ_INT =&epwm5_ISR; PieVectTable.EPWM4_TZ_INT =&epwm4_ISR; ////////////////////////////////////////////////////////////////////////////////// EDIS; EALLOW; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Alles zwischen ***** Wird 同步 ausgeführt durch 裸片同步裸片 EALLOW; CpuSysRegs.PCLKCR0.bit.TBCLKSYNC =0; EDIS; //Intitialisierung/Einstellung der EPWM2 und der EPWM7 InitEPwm7Examples(); InitEPwm6Examples(); InitEPwm5Examples(); InitEPwm4Examples(); EALLOW; CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1; EDIS; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // //启用连接到 SDFM INT 的 CPU INT5 // IER |= M_INT5; IER |= M_INT6;//中断 für ePWM7 IER |= M_INT4; IER |= M_INT3; // //在 PIE 中启用 SDFM INTn:组5 __interrupt 9-10 // PieCtrlRegs.PIEIER5.bit.INTx9=1;// SDFM1中断被启用 //PieCtrlRegs.PIEIER5.bit.INTx10 = 1;// SDFM2中断被启用 PieCtrlRegs.PIEIER2.bit.INTx7=1; PieCtrlRegs.PIEIER2.bit.INTx6=1; PieCtrlRegs.PIEIER2.bit.INTx5 = 1; PieCtrlRegs.PIEIER2.bit.INTx4 = 1; EINT; #ifdef CPU1 PinMuxoption = SDFM_PIN_MUX_OPTION1; // 将 GPIO 引脚配置为 SDFM 引脚 // Sdfm_configurePins (pinMuxoption); #endif // //选择 SDFM1 // gPeripheralNumber = SDFM1; // //输入控制模块 // //配置输入控制模式:调制器时钟速率=调制器数据速率 // Sdfm_configureInputCtrl (gPeripheralNumber、filter1、mode_0); Sdfm_configureInputCtrl (gPeripheralNumber、Filter2、mode_0); Sdfm_configureInputCtrl (gPeripheralNumber、FILTER3、MODE_0); Sdfm_configureInputCtrl (gPeripheralNumber、FILTER4、MODE_0); // //比较器模块 // HLT = 0x7FFF;//过值阈值设置 LLT = 0x0000;//欠值阈值设置 // //配置比较器模块的比较器滤波器类型和比较器的 OSR //值,更高的阈值,更低的阈值 // Sdfm_configureComparator (gPeripheralNumber、filter1、SINC3、OSR_32、 HLT、LLT); Sdfm_configureComparator (gPeripheralNumber、Filter2、SINC3、OSR_32、 HLT、LLT); Sdfm_configureComparator (gPeripheralNumber、FILTER3、SINC3、OSR_32、 HLT、LLT); Sdfm_configureComparator (gPeripheralNumber、FILTER4、SINC3、OSR_32、 HLT、LLT); // //启用主过滤器位:除非该位置位 ,否则所有过滤器模块//都不能启用。 当主滤波器//位在单个滤波器模块被启用后被启用时、所有滤波器模块被同步。 当在 启用//单个滤波器模块之前启用主滤波器位时,所有的滤波器//模块都异步。 // Sdfm_enableMFE (gPeripheralNumber); // 数据过滤器模块 // //配置数据过滤器模块过滤器类型、OSR 值和 //启用/禁用数据过滤器 // Sdfm_configureData_filter (gPeripheralNumber、filter1、filter_enable、SINC3、 OSR_64、DATA_16_BIT、SHIFT_4_BIits); Sdfm_configureData_filter (gPeripheralNumber、Filter2、filter_enable、SINC3、 OSR_64、DATA_16_BIT、SHIFT_4_BIits); Sdfm_configureData_filter (gPeripheralNumber、FILTER3、FILTER_ENABLE、SINC3、 OSR_64、DATA_16_BIT、SHIFT_4_BIits); Sdfm_configureData_filter (gPeripheralNumber、FILTER4、FILTER_ENABLE、SINC3、 OSR_64、DATA_16_BIT、SHIFT_4_BIits); // PWM11.CMPC、PWM11.CMPD、 PWM12.CMPC 和 PWM12.CMPD 信号不能同步 //滤波器。 此示例中未使用此选项。 // Sdfm_configureExternalreset (gPeripheralNumber、filter_1_EXT_RESET_ENABLE、 FILTER_2_EXT_RESET_ENABLE、 FILTER_3_EXT_RESET_ENABLE、 FILTER_4_EXT_RESET_ENABLE); // //初始化 ePWM // InitEPwm (); // //启用中断 // //可以使用此函数启用/禁用以下 SDFM 中断。 //启用/禁用比较器高阈 值//启用/禁用比较器低阈值 //启用/禁用调制器时钟故障 //启用/禁用滤波器确认 // Sdfm_configureInterrupt (gPeripheralNumber、filter1、IEH_DISABLE、 IEL_DISABLE、MFIE_ENABLE、AE_ENABLE); Sdfm_configureInterrupt (gPeripheralNumber、Filter2、IEH_DISABLE、 IEL_DISABLE、MFIE_ENABLE、AE_ENABLE); Sdfm_configureInterrupt (gPeripheralNumber、FILTER3、IEH_DISABLE、 IEL_DISABLE、MFIE_ENABLE、AE_ENABLE); Sdfm_configureInterrupt (gPeripheralNumber、FILTER4、IEH_DISABLE、 IEL_DISABLE、MFIE_ENABLE、AE_ENABLE); while ((* ePWM[gPWM_Number]).TBCTR < 550); // 启用主中断,以便任何滤波器中断都可以通过 SDFM 中断触发//到 CPU // Sdfm_enableMIE (gPeripheralNumber); ////////////////////////////////////////////////////////////////////////////////////// //Konfiguration von DAC Auf configureDAC (DAC_NUM); //////////////////////////////////////////////////////////////////////////////////////////////// while (1); } // // Sdfm1_ISR - SDFM 1 ISR // _中断 void Sdfm1_ISR (void) { //uint32_t sdfmReadFlagRegister = 0; //静态 uint16_t loopCounter1 = 0; // //读取 SDFM 标志寄存器(SDIFLG) // //sdfmReadFlagRegister = Sdfm_readFlagRegister (gPeripheralNumber); /* if (loopCounter1 <= MAX_SAples) { // //读取每个 SDFM 滤波器输出并将其存储在相应的滤波器中 //结果数组 // filter1_Result[loopCounter1]= SDFM1_READ_filter1_DATA_16BIT; Filter2_Result[loopCounter1]= SDFM1_READ_Filter2_DATA_16BIT; Filter3_Result[loopCounter1]= SDFM1_READ_FILTER3_DATA_16BIT; Filter4_Result [loopCounter1++]= SDFM1_READ_FILTER4_DATA_16BIT; // //清除 SDFM 标志寄存器 // Sdfm_clearFlagRegister (gPeripheralNumber、sdfmReadFlagRegister); sdfmReadFlagRegister = Sdfm_readFlagRegister (gPeripheralNumber); if (sdfmReadFlagRegister!= 0x0) { ESTOP0; } } 其他 { ESTOP0; Done (); } * //********* //Neue Datenverarbeitung Ausmit gabe über DAC while (1) { //filter1_Result[1]= SDFM2_READ_filter1_DATA_16BIT; DAC_PTR[DACA]->DACVALS.ALL = SDFM1_READ_filter1_DATA_16BIT; DAC_PTR[DACB]->DACVALS.ALL = SDFM1_READ_Filter2_DATA_16BIT; DAC_PTR[DACC]->DACVALS.ALL = SDFM1_READ_FILTER3_DATA_16BIT; //unsigned int val =(unsigned char) SDFM1_READ_FILTER3_DATA_16BIT[0]<< 16 |(unsigned char) SDFM1_READ_FILTER3_DATA_16BIT[1]; //DAC_PTR[DACC]->DACVALS.all = val; } //********* // //确认此__interrupt 以接收更多来自组5的__interrupts // PieCtrlRegs.PIEACK.all = PIEACK_group5; } // Sdfm2_ISR - SDFM 2 ISR // _中断 void Sdfm2_ISR (void) { //uint32_t sdfmReadFlagRegister; //静态 uint16_t loopCounter1 = 0; // //读取 SDFM 标志寄存器(SDIFLG) // //sdfmReadFlagRegister = Sdfm_readFlagRegister (gPeripheralNumber); /* if (loopCounter1 <= MAX_SAples) { // //读取每个 SDFM 滤波器输出并将其存储在相应的滤波器中 //结果数组 // filter1_Result[loopCounter1]= SDFM2_READ_filter1_DATA_16BIT; Filter2_Result[loopCounter1]= SDFM2_READ_Filter2_DATA_16BIT; Filter3_Result[loopCounter1]= SDFM2_READ_FILTER3_DATA_16BIT; Filter4_Result [loopCounter1++]= SDFM2_READ_FILTER4_DATA_16BIT; // //清除 SDFM 标志寄存器 // Sdfm_clearFlagRegister (gPeripheralNumber、sdfmReadFlagRegister); sdfmReadFlagRegister = Sdfm_readFlagRegister (gPeripheralNumber); if (sdfmReadFlagRegister!= 0x0) { ESTOP0; } } 其他 { ESTOP0; Done (); } * //********* //Neue Datenverarbeitung Ausmit gabe über DAC //filter1_Result[1]= SDFM2_READ_filter1_DATA_16BIT; DAC_PTR[DACA]->DACVALS.ALL = SDFM1_READ_filter1_DATA_16BIT; DAC_PTR[DACB]->DACVALS.ALL = SDFM1_READ_Filter2_DATA_16BIT; DAC_PTR[DACC]->DACVALS.ALL = SDFM1_READ_FILTER3_DATA_16BIT; //********* // // //确认此__interrupt 以接收更多来自组5的__interrupts // PieCtrlRegs.PIEACK.all = PIEACK_group5; } // Sdfm_configurePins -配置 SDFM GPIO // void Sdfm_configurePins (uint16_t sdfmPinOption) { uint16_t 引脚; 开关(sdfmPinOption) { 案例 SDFM_PIN_MUX_OPTION1: for (pin=16;pin<=31;pin++) { GPIO_SetupPinOptions (Pin、GPIO_input、GPIO_Async); GPIO_SetupPinMux (引脚、GPIO_MUX_CPU1、7); } 中断; 案例 SDFM_PIN_MUX_Option2: for (pin=48;pin<=63;pin++) { GPIO_SetupPinOptions (Pin、GPIO_input、GPIO_Async); GPIO_SetupPinMux (引脚、GPIO_MUX_CPU1、7); } 中断; 案例 SDFM_PIN_MUX_OPTION3: 对于(引脚=122;引脚<=137;引脚++) { GPIO_SetupPinOptions (Pin、GPIO_input、GPIO_Async); GPIO_SetupPinMux (引脚、GPIO_MUX_CPU1、7); } 中断; } } // // InitEPwm -初始化指定的 ePWM 设置 // void InitEPwm (void) { uint16_t CMPC、CMPD; CMPC = 2; CMPD = 2; #ifdef CPU1 GPIO_SetupPinOptions (4、GPIO_OUTPUT、GPIO_异 步); GPIO_SetupPinMux (4、GPIO_MUX_CPU1、1); #endif EALLOW; // //允许所有用户将所有启用的 ePWM 模块全局同步到 //时基时钟(TBCLK) // CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1; // //设置 TBCLK // (* ePWM[gPWM_Number]).TBPHS.bit.TBPHS = 0x0000;//相位为0 (* ePWM[gPWM_NUMBER]).TBCTR = 0x0000; //清除计数器 (* ePWM[gPWM_Number]).TBPRD = ePWM_TIMER_TBPRD;//设置计时器周期 // 801 TBCLK。 (* ePWM[gPWM_NUMBER]).CMPC = CMPC; //设置比较 C 值 (* ePWM[gPWM_Number]).CMPD = CMPD; //设置比较 D 值 (* ePWM[gPWM_Number]).cmpa.bit.cmpA = CMPC; //设置比较 C 值 (* ePWM[gPWM_Number]).CMPB.bit.CMPB = CMPD; //设置比较 D 值 // //设置计数器模式 // (* ePWM[gPWM_Number]).TBCTL.bit.CTRMODE = TB_COUNT_UP;//向上计数 (* ePWM[gPWM_Number]).TBCTL.bit.HSPCLKDIV = TB_DIV1; (* ePWM[gPWM_Number]).TBCTL.bit.CLKDIV = TB_DIV1; // //设置操作 // (* ePWM[gPWM_Number]).AQCTLA.bit.CAU = 3; //在事件 A 上设置 PWM1A、向上 //计数 // //设置操作 // (* ePWM[gPWM_Number]).AQCTLB.bit.CBU = 3; //在事件 A 上设置 PWM1A、向上 //计数 EDIS; } // //完成-停止调试器和停止应用 程序的函数// void Done (void) { asm (" ESTOP0"); 用于(;); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void InitEPwmGpio_TZ (void) { EALLOW; GpioCtrlRegs.GPAPUD.bit.GPIO12 = 1;//禁用 GPIO10上的上拉电阻(EPWM7A) GpioCtrlRegs.GPAMUX1.bit.GPIO12=1;//将 GPIO10配置为 EPWM7A GpioCtrlRegs.GPAPUD.bit.GPIO13 = 1;//禁用 GPIO11上的上拉电阻(EPWM7B) GpioCtrlRegs.GPAMUX1.bit.GPIO13=1;//将 GPIO11配置为 EPWM7B GpioCtrlRegs.GPAPUD.bit.GPIO10=1;//EPWM6A GpioCtrlRegs.GPAMUX1.bit.GPIO10=1;// GpioCtrlRegs.GPAPUD.bit.GPIO11 = 1;//EPWM6B GpioCtrlRegs.GPAMUX1.bit.GPIO11=1;// GpioCtrlRegs.GPAPUD.bit.GPIO8=1;//EPWM5A GpioCtrlRegs.GPAMUX1.bit.GPIO8=1;// GpioCtrlRegs.GPAPUD.bit.GPIO9=1;//EPWM5B GpioCtrlRegs.GPAMUX1.bit.GPIO9=1;// GpioCtrlRegs.GPAPUD.bit.GPIO6 = 1;//EPWM4A GpioCtrlRegs.GPAMUX1.bit.GPIO6=1;// GpioCtrlRegs.GPAPUD.bit.GPIO7=1;//EPWM4B GpioCtrlRegs.GPAMUX1.bit.GPIO7=1;// EDIS; } // //文件结束 // /////EPM7 Nur für Test-Zwecke void InitEPwm7Examples() { EALLOW; EPwm7Regs.TBPRD = 4; EPwm7Regs.TBPHS.bit.TBPHS = 0x0000; EPwm7Regs.TBCTR = 0x0000; EPwm7Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; EPwm7Regs.TBCTL.bit.PHSEN = TB_DISABLE; EPwm7Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; EPwm7Regs.TBCTL.bit.CLKDIV = TB_DIV1; EPwm7Regs.CMPA.bit.CMPA = 2; EPwm7Regs.AQCTLA.bit.ZRO = AQ_SET; EPwm7Regs.AQCTLA.bit.CAU = AQ_CLEAR; EPwm7Regs.DBCTL.bit.OUT_MODE = DB_FUL_ENABLE; EPwm7Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; EPwm7Regs.DBCTL.bit.IN_MODE = DBA_ALL; EPwm7Regs.DBRED.bit.DBRED = 0; EPwm7Regs.DBFED.bit.DBFED = 0; EPwm7_DB_DIRECTION = DB_UP; EPwm7Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; EPwm7Regs.ETSEL.bit.INTEN = 1; EPwm7Regs.ETPS.bit.INTPRD = et_3rd; EDIS; } __interrupt void epwm7_ISR (void) { EPwm7Regs.ETCLR.bit.INT = 1; }// //EPM7 Nur für Test-Zwecke void InitEPwm6Examples() { EALLOW; EPwm6Regs.TBPRD = 4; EPwm6Regs.TBPHS.bit.TBPHS = 0x0000; EPwm6Regs.TBCTR = 0x0000; EPwm6Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; EPwm6Regs.TBCTL.bit.PHSEN = TB_DISABLE; EPwm6Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; EPwm6Regs.TBCTL.bit.CLKDIV = TB_DIV1; EPwm6Regs.CMPA.bit.CMPA = 2; EPwm6Regs.AQCTLA.bit.ZRO = AQ_SET; EPwm6Regs.AQCTLA.bit.CAU = AQ_CLEAR; EPwm6Regs.DBCTL.bit.OUT_MODE = DB_FUL_ENABLE; EPwm6Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; EPwm6Regs.DBCTL.bit.IN_MODE = DBA_ALL; EPwm6Regs.DBRED.bit.DBRED = 0; EPwm6Regs.DBFED.bit.DBFED = 0; EPwm6_DB_DIRECTION = DB_UP; EPwm6Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; EPwm6Regs.ETSEL.bit.INTEN = 1; EPwm6Regs.ETPS.bit.INTPRD = et_3rd; EDIS; } __interrupt void epwm6_ISR (void) { EPwm6Regs.ETCLR.bit.INT = 1; }// //EPM7 Nur für Test-Zwecke void InitEPwm5Examples() { EALLOW; EPwm5Regs.TBPRD = 4; EPwm5Regs.TBPHS.bit.TBPHS = 0x0000; EPwm5Regs.TBCTR = 0x0000; EPwm5Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; EPwm5Regs.TBCTL.bit.PHSEN = TB_DISABLE; EPwm5Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; EPwm5Regs.TBCTL.bit.CLKDIV = TB_DIV1; EPwm5Regs.CMPA.bit.CMPA = 2; EPwm5Regs.AQCTLA.bit.ZRO = AQ_SET; EPwm5Regs.AQCTLA.bit.CAU = AQ_CLEAR; EPwm5Regs.DBCTL.bit.OUT_MODE = DB_FUL_ENABLE; EPwm5Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; EPwm5Regs.DBCTL.bit.IN_MODE = DBA_ALL; EPwm5Regs.DBRED.bit.DBRED = 0; EPwm5Regs.DBFED.bit.DBFED = 0; EPwm5_DB_DIRECTION = DB_UP; EPwm5Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; EPwm5Regs.ETSEL.bit.INTEN = 1; EPwm5Regs.ETPS.bit.INTPRD = et_3rd; EDIS; } __interrupt void epwm5_ISR (void) { EPwm5Regs.ETCLR.bit.INT = 1; }// //EPM7 Nur für Test-Zwecke void InitEPwm4Examples() { EALLOW; EPwm4Regs.TBPRD = 4; EPwm4Regs.TBPHS.bit.TBPHS = 0x0000; EPwm4Regs.TBCTR = 0x0000; EPwm4Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; EPwm4Regs.TBCTL.bit.PHSEN = TB_DISABLE; EPwm4Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; EPwm4Regs.TBCTL.bit.CLKDIV = TB_DIV1; EPwm4Regs.CMPA.bit.CMPA = 2; EPwm4Regs.AQCTLA.bit.ZRO = AQ_SET; EPwm4Regs.AQCTLA.bit.CAU = AQ_CLEAR; EPwm4Regs.DBCTL.bit.OUT_MODE = DB_FUL_ENABLE; EPwm4Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; EPwm4Regs.DBCTL.bit.IN_MODE = DBA_ALL; EPwm4Regs.DBRED.bit.DBRED = 0; EPwm4Regs.DBFED.bit.DBFED = 0; EPwm4_DB_DIRECTION = DB_UP; EPwm4Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; EPwm4Regs.ETSEL.bit.INTEN = 1; EPwm4Regs.ETPS.bit.INTPRD = et_3rd; EDIS; } __interrupt void epwm4_ISR (void) { EPwm4Regs.ETCLR.bit.INT = 1; } // configureDAC - Abänderung 指定的 DAC 输出//μ s -->配置 von zwei DAC void configureDAC (uint16 DAC_num) { EALLOW; DacaRegs.DACCTL.bit.DACREFSEL =基准; DacaRegs.DACOUTEN.bit.DACOUTEN = 1; DacaRegs.DACVALS.ALL = 0; //DELAY_US (10);//缓冲 DAC 加电延迟 DacbRegs.DACCTL.bit.DACREFSEL =基准; DacbRegs.DACOUTEN.bit.DACOUTEN = 1; DacbRegs.DACVALS.ALL = 0; //DAC_C DaccRegs.DACCTL.bit.DACREFSEL =基准; DaccRegs.DACOUTEN.BIT.DACOUTEN = 1; DaccRegs.DACVALS.ALL = 0; DELAY_US (10);//缓冲 DAC 加电延迟 EDIS; }



高级感谢您的参与

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

    巴斯蒂

    根据您的代码设置、SDFM 数据滤波器的数据速率= 3.2us、PWM 每655.35us 同步一次 SDFM 数据滤波器。 在655.35us 窗口中、SDFM 数据滤波器生成大约204-205 (655.35us / 3.2us)的新滤波器结果。 每次对滤波器进行同步时、预计在 Sinc3滤波器的 PWM 同步后会立即获得2个不正确的滤波器样本。 这就是您每~200个样本看到低峰值的原因。 PWM 同步后、您需要立即忽略这2个不正确的样本、然后开始记录 SDFM 滤波器结果。

    SYSCLK

    200 MHz

    SD-CX

    20 MHz

    PWMCLK

    100 MHz

    DOSR

    64

    TBPRD

    65535

    SDFM 数据速率

    3.2us

    PWM 同步速率

    655.35us

     我不理解您关于有符号/无符号的第一个问题。 但是、数据滤波器输出是一个有符号值。

    此致、

    曼诺伊

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很高兴知道此问题已解决。 我要关闭此主题。

    -Manoj
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢 Manoj 快速回答问题。 这确实有助于我更好地了解 Σ-Δ 滤波器。 但是、如果听到我的数据中总是出现峰值、那就不是很好了。 忽略峰值不是问题、但错过的数据将是使用此控制器的未来应用的问题。

    我的第一个问题、这是非常基本的问题。 c 中的编程不是我的专业领域。 到目前为止、我尝试了不同的方法将数据转换为无符号整数、并且只使用12位、但实际上什么都不起作用。 我想这么做是因为我的控制器的内部 DAC 只有无符号值(12位)。 我要比较闭环补偿变压器(汽车)输出信号的输出信号的输出信号。
    n´t 你不能给我举个例子、我会找到一条路、但这需要更长时间...

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

    在您的示例中、您需要将16384添加到16位滤波器结果输出、以将有符号滤波器输出值转换为无符号值。

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

    您好、Manoj、

    感谢您的回复! 这是我将其转换为无符号数的第一个想法、但它不起作用。
    因此、我开始寻找一个用于翻译的命令。
    n´t 这个答案、我再次尝试了它、现在很清楚为什么它不起作用、因为我必须将这些值用作十六进制值而不是十进制值。

    这些确实对我有所帮助。
    谢谢

    此致 Basti