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.
工具/软件:Code Composer Studio
我正在尝试掌握 TI F28377D 芯片的 SDFM、暂时运行单核应用(未使用内核2)。 我的当前设置基于 controlSUITE 提供的 sdfm_PWM_SYNC_cpu01示例、并进行了以下调整:
我已将电压源连接到设置、以模拟 SD 的某种输入、我在相应的 DSP 桥臂上看到了一些曼彻斯特编码数据。 但是、在运行此示例(或者、对于任何 sdfm 示例)时、我完成 Sdfm1_ISR 例程中第一个结果的读取、并进入以下陷阱:
_interrupt 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);
⇐此处 sdfmReadFlagRegister 为2147484416
if (sdfmReadFlagRegister!= 0x0) { ESTOP0;
⇐当然、我在这里结束了
}
我尝试禁用 fiters 2、3和4、但没有成功。 从这里继续的方法是什么。
感谢你的答复。 我已物理断开时钟连接、但误差保持不变。 我想、不是由(仅)时钟负责。
您的答复中还提出了其他问题:
首先、controlSUITE 随附的示例将 PWM11配置为 Σ-Δ 模块1的同步信号。 技术参考手册(SPRUHM8G)中也会显示相同的 PWM11。 是否需要使用 PWM11? 我是否可以路由任何其他用于复位 SDFM 的信号(例如、ECap5)? 如果是,如何配置路由?
其次、我使用曼彻斯特编码、我想将 SDFM 与我的选择的任意 PWM 同步(在我的例子中为 PWM1)。 在同一技术参考手册中、同步数据滤波器的方案显示为"和":
-但在同一手册中,同步设置的说明中使用了“或”一词:
这两个选项中的哪一个是正确的同步方式? 能否仅使用 MFE 位同步 SDFM?
第三、是否有方法检查滤波器是否接收数据或时钟? 我尝试轮询 SDFM[gPeripheralNumber]->SDIFLG.bit.AF1位、但没有成功。
此外、上面引用的相同方案包含一些 CLK_OUT 信号。 我是否可以将其路由到任何位置、如果是、如何进行路由?
谢谢、
Alexey。
嗯、问题仍然存在。
我已将 PWM11配置为 SDFM 的同步源。 曼彻斯特数据只到达 GPIO 16和18、例如 SD1_D1和 SD1_D2。 由于在曼彻斯特模式下工作的 SDFM 不需要时钟、因此我已将 GPIO 17和19配置为输入(MUX 0)、而不是 SD 时钟(MUX 7)。 所有4个筛选器均已配置和启用、但数据仅到达其中的2个。
从上面的解释中可以看出、SDIFLG 寄存器中相应的 MF 位会上升。 但是、MF3和 MF4位保持为0、并且永远不会命中条件断点。 您是否会建议如何调试此问题?
我仍然想问的另一个问题是我上面提到的 CLK_OUT 信号(请参阅文章中的最后一个问题以及手册的屏幕截图)。 我是否可以将其路由到任何位置、如果是、如何进行路由?
我在原型中使用控制卡 TMDSDOCK28379D。
Manoj、
1) 1)我已将 ECAP 5配置为 PWM、并将其用作 AMC1306x 的时钟发生器(10MHz)。 SD 滤波器接收来自 AMC1306x 的曼彻斯特编码信号。 SD 滤波器时钟输入未连接到任何外部时钟。 滤波器仅接收数据、但不接收时钟。
例如、该曼彻斯特编码的数据流是从 GPIO 16捕获的:
2) 2) PWM 信号(电机相位、20KHz)保持高电平或低电平、具体取决于何时达到断点。 我正在使用硬件断点。
3) 3)否、即使数据已路由到 Filter1、也没有数据。 过滤器2已配置、但未接收任何数据。 这两个寄存器的 MFS 位都为0。 AF 位也是0。
4) 4) GPIO 17和19配置为 GPIO (MUX 0)、而不是 SD 时钟(MUX 7)。 他们没有接收任何时钟、我没有对其进行路由。 我通过以下方式对其进行配置:
EALLOW; 对于(PIN=16;PIN<20;PIN++)//实际 SD1_C2为19 { GPIO_SetupPinOptions (Pin、GPIO_input、GPIO_Async); IF ((引脚==17)||(引脚==19)) GPIO_SetupPinMux (引脚、GPIO_MUX_CPU1、0);// GPIO 其他 GPIO_SetupPinMux (引脚、GPIO_MUX_CPU1、7);// SDFM } EDIS;
是否可以获得 TeamViewer 或 WebEx 支持会话?
谢谢、
Alexey。
Manoj、
我不认为原因是硬件断点。
我尝试测试*SDFM[gPeripherialNumber]->SDIFLG.BITS 是否为1。 使用 AF1、af2和所有 MF*位进行测试。 代码示例如下:
void main (void){ 。 。 。 。//此处显示所有设置 对于(;;;){//主程序循环 IF (SDFM[gPeripheralNumber]->SDIFLG.bit.AF1!= 0) { Sigma_Delta_Read (); } } 。 。 。 .} //数据读取函数 void sigma_delta_read (void){ unsigned long sdfmReadFlagRegister = 0; 静态无符号 int loopCounter1 = 0; //寄存器 SDIFLG 读数 SDFMReadFlagRegister = Sdfm_readFlagRegister (1); 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; loopCounter1 = loopCounter1 + 1; if (loopCounter1 = MAX_SAples) loopCounter1 = 0; //清除 SDIFLG 寄存器 Sdfm_clearFlagRegister (1、sdfmReadFlagRegister); //寄存器 SDIFLG 读数 sdfmReadFlagRegister = Sdfm_readFlagRegister (1); }
放置在 sigma_delta_read()内部的断点从未命中。 它的存在不影响程序的运行、我可以看到数据和 PWM 仍在运行、但 AF1位(在上面的示例中)保持为0、这意味着 SDFM 上不存在新数据。
对于 af2也是如此、最令我困扰的是 MF 位、即使是配置但物理上不接收数据的 MF3和 MF4也是如此。 该模块不检测任何错误、但也不检测任何数据、即使数据流是如此、GPIO 16和18也使用 GPIO_SetupPinOptions (Pin、GPIO_input、GPIO_异 步| GPIO_invert)进行配置; (添加了 GPIO_Invert 标志以解决数据流的反极性问题)以及由 ECAP 运行生成的 PWM 和时钟。 如果我在随机点暂停程序、SDIFLG 为0x00000000。 如果我使用 sigma_delta_read ()而不是中断来调试程序,则该函数永远不会运行;如果我使用中断,它永远不会被触发。
谢谢、
Alexey。
Manoj、
大多数设置都是从 sdfm_PWM_SYNC 示例复制的。 中断只是复制粘贴、因此不会显示在这里。
EALLOW;//这是写入 EALLOW 受保护寄存 器 PieVectTable.SD1_INT =&Sdfm1_ISR;// SDFM 1 PieVectTable.SD2_INT =&SdfFM2_ISR;// SDFM 2 EDIS;//这是禁用写入 EALLOTTable.SD2_INT 的必需的;// 启用/ INT_CPU; // // //在 PIE 中启用 SDFM INTn:组5 __interrupt 9-10 // PieCtrlRegs.PIEIER5.bit.INTx9 = 1;//启用 SDFM1中断 PieCtrlRegs.PIEIER5.bit.INTx10 = 1;//启用 SDFM2中断 启用 Sdfm_Control Mode;// 仅用于配置控制模块输入/配置控制引脚 曼彻斯特编码 // Sdfm_configureInputCtrl (gPeripheralNumber、filter1、mode_2);//模式0是 clk =>数据速率 Sdfm_configureInputCtrl (gPeripheralNumber、Filter2、mode_2);//模式1为 clk =1/2数据速率 Sdfm_configureInputCtrl (gPeripheralNumber、FILTER3、MODE_2);//模式2为曼彻斯特 Sdfm_configureInputCtrl (gPeripheralNumber、FILTER4、MODE_2);//模式3是 clk == 2 *数据速率 // //比较器模块 // 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_256、DATA_16_BIT、SHIFT_9_Bits); Sdfm_configureData_filter (gPeripheralNumber、Filter2、filter_enable、SINC3、 OSR_256、DATA_16_BIT、SHIFT_9_Bits); Sdfm_configureData_filter (gPeripheralNumber、FILTER3、FILTER_ENABLE、SINC3、 OSR_256、DATA_16_BIT、SHIFT_9_Bits); Sdfm_configureData_filter (gPeripheralNumber、FILTER4、FILTER_ENABLE、SINC3、 OSR_256、DATA_16_BIT、SHIFT_9_Bits); // // 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 (gPWM_number); // //启用中断 // //可以使用此函数启用/禁用以下 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_DISABLE、AE_DISABLE); Sdfm_configureInterrupt (gPeripheralNumber、FILTER4、IEH_DISABLE、 IEL_DISABLE、MFIE_DISABLE、AE_DISABLE); <=这里,我尝试了多种配置方法,包括启用或禁用 AE 和 MFIE。 while ((* ePWM[gPWM_NUMBER]).TBCTR < 550); // //启用主中断,以便可以触发任何过滤器中断 //通过 SDFM 中断到 CPU // Sdfm_enableMIE (gPeripheralNumber); // 启用全局中断和更高优先级的实时调试事件: // EINT;//启用全局中断 INTM ERTM;//启用全局实时中断 DBGM // //在 CAP1上设置 APWM 模式,设置周期和比较寄存器<=这是 SD 器件的时钟 // ECap1Regs.ECCTL2.bit.CAP_APWM = 1; //启用 APWM 模式 ECap1Regs.CAP1 = ECAP_TIMER_PRD; //设置周期值 ECap1Regs.CAP2 = ECAP_TIMER_CMP; //设置比较值 ECap1Regs.ECCLR.ALL = 0x0FF; //清除暂挂的__interrupts ECap1Regs.ECEINT.BIT.CTR_EQ_CMP = 1;//启用比较等效整型 // //启动计数器 // ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1; HAL.tick = 0; HAL.max_tick = 2480; Sdfm1Regs.SDIFLGCLR.ALL |= 0x00000F00; 。 。 。 。 。 。 // // InitEPwm -初始化指定的 ePWM 设置 // void InitEPwm (uint16_t gPWM_number) { uint16_t CMPC、CMPD; CMPC = 1250; CMPD = 1250; #ifdef CPU1 GPIO_SetupPinOptions (20、GPIO_OUTPUT、GPIO_异 步);//它是 GPIO 0、已更改为20 GPIO_SetupPinMux (20、GPIO_MUX_CPU1、5);//它是 GPIO 0、已更改为20 #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;//将定时器周期设置为2500 (* 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 上设置 PWM11A、向上 //计数 // //设置操作 // (* ePWM[gPWM_Number]).AQCTLB.bit.CBU = 3; //在事件 A 上设置 PWM11A、向上 //计数 EDIS; }
我没有尝试模式0、因为它需要更改硬件、我只能在星期日执行。
Manoj、
当我禁用 PWM SDSYNC 时、SDIFLG 寄存器变为0x80003300。 通道1和2的数据位和故障位都被置位。
这是禁用 PWM SDSync 时 SD 寄存器的存储器窗口内容:
Sdfm1Regs、Sdfm1Regs_SDIFLG 33008000 Sdfm1Regs_SDIFLGCLR 00000000 0000 Sdfm1Regs_SDCTL 20000000 Sdfm1Regs_SDMFILEN 0800330000000000 0000000000000000 0000 0000 0000000000000000 0000 Sdfm1Regs_SDCTLPARM1 F002 Sdfm1Regs_SDDFPARM1 0FFF Sdfm1Regs_SDIPARM1 4800 Sdfm1Regs_SDCMPH1 7FFF Sdfm1Regs_SDCMP1Regs_SDCMP0000 0000 0000 0000 0000 0000 0001 0001 000000000000 0000 Sdfm1Regs_SDCTLPARM2 F002 Sdfm1Regs_SDDFPARM2 0FFF Sdfm1Regs_SDIPARM2 4800 Sdfm1Regs_SDCMPH2 7FFF Sdfm1Regs_SDCMPL2 Sdfm1Regs_SDCMP2 0000 0000 0000 0000 0002 Sdfm1Regs_SDCMP2 0000 0000 0000 0002 0002 0002 0002 0002 0002 0002 0002 0002 0002 0002 0002 0002 0002 0002 0002 0002 0002 000000000000 000000000000 0000 0000 Sdfm1Regs_SDCTLPARM3 0002 Sdfm1Regs_SDDFPARM3 0DFF Sdfm1Regs_SDIPARM3 4800 Sdfm1Regs_SDCMP7FFF Sdfm1Regs_SDCMPL3 寄存器0000_SDQ31000000 Sdfm1Regs_SDSS_SDQ31000000 0000 0003 寄存器0000_SDCdfm1SDQ3SS_SDQ31000003 0000000 0000 0000 0003 0003寄存器 000000000000 000000000000 0000 0000 Sdfm1Regs_SDCTLPARM4 0002 Sdfm1Regs_SDDFPARM4 0DFF Sdfm1Regs_SDIPARM4 4800 Sdfm1Regs_SDCMPH4 7FFF Sdfm1Regs_SDCML4 寄存器0000_SDQ4 0000_SDQ4N 0000000 0000000 0000 0004 SDCfm1Regs_SDQ4_SDQ4N 0004 0000000 0004 0004 000F 0000000 0004 000F 0000000 000F 000F 0000000 000F 000F 000F 000F 000000000000 000000000000 0000000000000000 000000000000 0000000000000000 000000000000 0000 000000000000 000000000000 0000000000000000 000000000000 0000000000000000 000000000000 0000000000000000 000000000000 0000 000000000000 000000000000 0000000000000000 000000000000 0000000000000000 000000000000 0000000000000000 0000 Sdfm2Regs、Sdfm2Regs_SDIFLG 00000000 Sdfm2Regs_SDIFLGCLR 00000000 0000 Sdfm2Regs_SDCTL 00000000 Sdfm2Regs_SDMFILEN 00000000000000000000 0000000000000000 000000000000 0000 0000 Sdfm2Regs_SDCTLPARM1 0000 Sdfm2Regs_SDDFPARM1 0000 Sdfm2Regs_SDIPARM1 0000 Sdfm2Regs_SDCMPH1 7FFF Sdfm2Regs_SDCMPQ1 0000 Sdfm2Regs_SDCMP0000 0000 0000 0000 0000 0000 0000 0000 000000000000 000000000000 0000 0000 Sdfm2Regs_SDCTLPARM2 0000 Sdfm2Regs_SDDFPARM2 0000 Sdfm2Regs_SDIPARM2 0000 Sdfm2Regs_SDCMPH2 7FFF Sdfm2Regs_SDCMPL2 Sdfm2Regs_SD2Regs_SDP0000 0000 0000 0000 0000 0000 0000 Sdfm2Regs_SDM2 0000 0000 0000 0000 0000 000000000000 000000000000 0000 0000 Sdfm2Regs_SDCTLPARM3 0000 Sdfm2Regs_SDDFPARM3 0000 Sdfm2Regs_SDIPARM3 0000 Sdfm2Regs_SDCMP7FFF Sdfm2Regs_SDCMPL3 Sdfm2Regs_SDM3 0000 0000 0000 0000 Sdfm2Regs_SDM3 0000 0000 0000 0000 0000 000000000000 000000000000 0000 0000 Sdfm2Regs_SDCTLPARM2 0000 Sdfm2Regs_SDDFPARM2 0000 Sdfm2Regs_SDIPARM2 0000 Sdfm2Regs_SDCMPH2 7FFF Sdfm2Regs_SDCMPL2 Sdfm2Regs_SD2Regs_SDP0000 0000 0000 0000 0000 0000 0000 Sdfm2Regs_SDM2 0000 0000 0000 0000 0000 000000000000 000000000000 0000 0000 Sdfm2Regs_SDCTLPARM3 0000 Sdfm2Regs_SDDFPARM3 0000 Sdfm2Regs_SDIPARM3 0000 Sdfm2Regs_SDCMP7FFF Sdfm2Regs_SDCMPL3 Sdfm2Regs_SDM3 0000 0000 0000 0000 Sdfm2Regs_SDM3 0000 0000 0000 0000 0000 000000000000 000000000000 0000 0000 Sdfm2Regs_SDCTLPARM2 0000 Sdfm2Regs_SDDFPARM2 0000 Sdfm2Regs_SDIPARM2 0000 Sdfm2Regs_SDCMPH2 7FFF Sdfm2Regs_SDCMPL2 Sdfm2Regs_SD2Regs_SDP0000 0000 0000 0000 0000 0000 0000 Sdfm2Regs_SDM2 0000 0000 0000 0000 0000 000000000000 000000000000 0000 0000 Sdfm2Regs_SDCTLPARM3 0000 Sdfm2Regs_SDDFPARM3 0000 Sdfm2Regs_SDIPARM3 0000 Sdfm2Regs_SDCMP7FFF Sdfm2Regs_SDCMPL3 Sdfm2Regs_SDM3 0000 0000 0000 0000 Sdfm2Regs_SDM3 0000 0000 0000 0000 0000 000000000000 000000000000 0000 0000 Sdfm2Regs_SDCTLPARM4 0000 Sdfm2Regs_SDDFPARM4 0000 Sdfm2Regs_SDIPARM4 0000 Sdfm2Regs_SDCMPH4 7FFF Sdfm2Regs_SDCML4 0000 A4 Sdfm2Regs_SDCMP0000 0000 0000 0000 0000 0000 000000000000 000000000000 0000
这是引脚配置功能:
// Sdfm_configurePins -配置 SDFM GPIO // void Sdfm_configurePins (void) { uint16_t pin; EALLOW; 对于(PIN=16;PIN<20;PIN++)//实际 SD1_C2为19 { GPIO_SetupPinOptions (Pin、GPIO_input、GPIO_异 步| GPIO_invert); IF ((引脚==17)||(引脚==19)) GPIO_SetupPinMux (引脚、GPIO_MUX_CPU1、0);// GPIO 其他 GPIO_SetupPinMux (引脚、GPIO_MUX_CPU1、7);// SDFM } EDIS; //配置 EPWM11A 和 B EALLOW; GpioCtrlRegs.GPAPUD.bit.GPIO20 = 1;//禁用 GPIO20上的上拉电阻(EPWM11A) GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 5;//将 GPIO20配置为 EPWM11A GpioCtrlRegs.GPAPUD.bit.GPIO21 = 1;//禁用 GPIO21上的上拉电阻(EPWM11B) GpioCtrlRegs.GPAMUX2.bit.GPIO21 = 5;//将 GPIO21配置为 EPWM11B EDIS; }
谢谢、
Alexey。
Manoj、
从曼彻斯特编码器迁移到另一个板(TI AMC1306EVM)后、我已在轮询模式下成功接收到滤波器中的 SD 数据。 但仍有几个问题需要回答:
1) 1)为了执行轮询、我必须寄存中断并将中断过程保持为空、否则我轮询的位永远不会被置位。
这是我的 main()函数的一部分:
for (;;) { if (SDFM[gPeripheralNumber]->SDIFLG.bit.AF1!= 0) { sigma_delt_read (); SDFM[gPeripheralNumber]->SDIFLGL.bit.AF1 = 0; } }}
这是实际的数据读取函数:
//数据读取函数 void sigma_delta_read (void){ unsigned long sdfmReadFlagRegister = 0; static unsigned int loopCounter1 = 0; UINT16位状态= 0; //寄存器 SDIFLG 读取 sdfmReadFlagRegister = Sdfm_readFlagRegister (1); filter1_result[loopDataCounter1+]]= SDFit_gpit.gpit_readm1 ;gpit_gpio1;gpit_g1;gpit_g1 ===注意此处的切换 if (loopCounter1 == MAX_SAMSples) { loopCounter1 = 0; } //清除 SDIFLG 寄存器 Sdfm_clearFlagRegister (1、sdfmReadFlagRegister); }
我看到 Filter1_Result 中的变化、它们会根据输入电压的变化而变化。 但是、我不知道如何解释它们。 当输入电压为-0.079mV 时、Filter1_Result 的读数约为8045;当输入为0.089mV 时、读数约为56470;当我完全拔下输入(0mV)时、读数为65030。 如何解读结果?
2) 2)这是我现在在示波器上看到的图片:
绿色表示时钟(10MHz)、黄色表示数据、蓝色表示 PWM 周期(50uec / 20kHz)、蓝色表示 GPIO 62的切换、该切换应在每次读取数据时发生。 频率(53uec、~18kHz)不足;我们在每个 PWM 周期中至少需要两个读数、最好是更多。 我知道这是轮询、当我转向中断时频率将上升、但上升幅度不会太高、因为我复制的上面的"for "循环是 DSP 现在运行的唯一循环。 为比率加润滑脂的建议是什么? 调整 OSR?
谢谢、
Alexey。
Alexey、
1) 1)如果要轮询 AFX 位、可以禁用 SDFM ePIE 中断。 这样、您就不需要担心 ISR
2) 2)滤波器输出中表示的数字值是对应于差分模拟输入的数字值。 对应于负差分输入的数字滤波器输出将是对应正差分输入的二进制补码。
3) 3)滤波器输出的数据速率取决于 OSR 设置和 SD 调制器采样率。 如果您希望在 PWM 周期内获得更多滤波数据、则必须增加 SD 调制器采样频率和/或减少 OSR 以提高数据吞吐量。
此致、
曼诺伊
Manoj、
我仍然无法实现 SDFM 同步。 我尝试了几个选项来获得它、但都未成功:
1) Sdfm_configureExternalreset ()配置为 filter_1_EXT_RESET_disable。 然后、我尝试通过以下方式使用 MFE 位:
// SD __interrupt void PWM11_Comparator_C_UP_DOWN_ISR 的同步例程(void) { static unsigned char sync = 0; if (!SYNC) { Sdfm_enableMFE (gPeripheralNumber); GpioDataRegs.GPBTOGGLE.BIO62 = 1; //验证 GPIO 切换-只需在示波器上查看即可 } 否则 { Sdfm_disableMFE (gPeripheralNumber); GpioDataRegs.GPBTOGGLE.bit.GPIO62=1; //验证 GPIO 切换-只需在范围 内查看它} //清除此中断 EPwm11Regs.ETCLR.bit.INT 标志= 1; //确认此中断以接收来自组3的更多中断 PieCtrlRegs.PIEACX.ALL = PIEACK_Group3; }
根据技术参考手册第13.1.1节、可以将 SDFM 模块滤波器与主滤波器使能位同步。 但是、我看不到同步、因为我在 SDFM 读取时切换另一个 GPIO、并且它与该中断完全不同步:
// // Sdfm1_ISR - SDFM 1 ISR // _interrupt void Sdfm1_ISR (void) { uint32_t sdfmReadFlagRegister = 0; GpioDataRegs.GPFTOGGLE.bit.GPIO161 = 1; Sigma_Delta_Read (); sdfmReadFlagRegister = Sdfm_readFlagRegister (gPeripheralNumber); Sdfm_clearFlagRegister (gPeripheralNumber、sdfmReadFlagRegister); // //确认此__interrupt 以接收更多来自组5的__interrupts // PieCtrlRegs.PIEACX.ALL = PIEACK_group5; }
(函数 sigma_delta_read ()出现在先前的帖子中,自那时以来没有变化)。
下面是我得到的结果:
这里、黄色是原始 SD 数据、绿色是我用于同步的 PWM、红色是在 PWM 中断中随 MFE 位一起切换的 GPIO62、蓝色是在 SD 中断中切换的 GPIO161。 蓝色不是静态的、它会移动、因此它不会同步:
2) 2)我还尝试使用 PWM11 C 比较器进行同步、结果相同。
3) 3)如果我在 Sdfm_configureExternalreset()中启用外部复位、则根本没有读数、蓝色线处于接地电平。 看起来永远不会发生复位。
我已经尝试过与其他 PWM 切换 MFE 位的相同解决方案、而不仅仅是11。 例如、使用 PWM 1。 我几乎以相同的方式配置了中断、还切换了 GPIO 以进行验证。 但结果完全相同、没有同步。 示波器上的图片与上面的图片完全相同。
请您就此主题向我提供建议吗? 我们希望 SD 滤波器与 PWM 同步(令人担忧的是、可以使用 MFE 实现)、并使用 PWM 同步数据读数。
手册明确指定 PWM11C 为 SDFM 1通道1的同步源、而示例代码"PWM11.CMPC、PWM11.CMPD、PWM12.CMPC 和 PWM12.CMPD 信号无法同步滤波器"之间的矛盾令人困惑。
谢谢、
Alexey。
Manoj、
我尝试至少以某种方式同步通道。 当 PWM11.CMPC (绿线)或 SDFM1.MFE (红线)为0时、我希望暂停"数据就绪"中断流(上面示波器屏幕图像上的蓝线)。 上面的示波器屏幕图像显示了相反的情况。
我完全了解禁用 MFE 将会使受影响的 SDFM 的所有4个通道都关闭、但现在它仍然不同步、因此我希望至少通过 MFE 位使这些功能正常工作。 但是、即使通过操作 MFE 位、也无法实现同步、我无法理解为什么、这段话总结了我上一篇文章的第1节)。
当然、通过 PWM11.CMPC 同步会更好、但在我上一篇文章的第2部分中、我已经写道它不起作用。 即使 PWM11.CMPA (这是上面示波器屏幕图像上绿线的来源)和 PWM11.CMPC 以完全相同的方式进行配置、我也看不到任何同步。 我是否必须进行任何其他配置? 以某种方式将 PWM11.CMPC 路由到 SDFM? AFAIK、不需要任何额外的配置、但是可能我错过了什么?
我知道 sdfm_PWM_SYNC_CPU 示例。 实际上、我使用的大多数代码都是从该示例中获取的、我曾多次提到它、包括本主题的第一个问题。 它运行、但不读取数据、也不同步。
谢谢、
Alexey。
Manoj、
实际上、我的 SDFM 滤波器大部分都在工作。 最后一个问题是有关结果转换的两个问题。
AMC1306EVM I 使用可提供0s 和1s 的输出密度、根据其数据表、对应于-250mV 的限值为7168、对应于+250mV 的限值为58368。 DSP 的 SDFM 比较器模块要求 HLT 和 LLT 的两个数字介于0和32768之间。 我想我必须将为 AMC1306EVM 提供的数字除以2、接收 LLT 为3809 (0x0E1)、HLT 为29184 (0x7200)、对吧?
现在、数据滤波器以节拍为单位提供输出、我需要将其转换为毫伏。 在0mV 输入上、我接收到65534-65535的恒定输出、接近于实际零。 但是、在精确测量的90mV 输入(根据示波器、几乎无噪声)上、我接收到1385和1500之间的输出、这些输出首先对于大多数恒定信号而言过于模糊、 其次、是超出预期值的值、我认为该值应该大约为11000 (因为90mV 恰好高于正限值的三分之一、即250mV)。
我的当前代码基于 sdfm_PWM_SYNC 示例。 MODE 为0、GPIO 引脚16-20配置为 GPIO_SetupPinOptions (Pin、GPIO_input、GPIO_Async)和 GPIO_SetupPinMux (Pin、GPIO_MUX_CPU1、 7);
数据过滤器配置为:
Sdfm_configureData_filter (gPeripheralNumber、filter1、filter_enable、SINC3、 OSR_256、 DATA_16_BIT、SHIFT_9_Bits);
使用以下宏来执行数据读取: filter1_Result[loopCounter1]= SDFM1_READ_filter1_DATA_16BIT;
Manoj、
这意味着、反转公式、Vin = Vcling *(2 * Density_for_1s - 1)= Vcling *(2 * Output_for_DF /(2 * MAX_IAL_DF_OUTPUT - 1)+ 0.5)- 1)= Vcling *(Output_for_DF /(MAX_IAL_DF_OUTPUT - 1))、对吗?
但是、当输入为90mV 时、我仍然会收到大约1.21mV 的电压。 将 DF 重新配置为 Sinc1 (Sdfm_configureData_filter (gPeripheralNumber、filter1、filter_enable、SINC1、OSR_256、 DATA_16_BIT、SHIFT_0_Bits);)输出为1.2486mV。
谢谢、
Alexey。
Manoj、
这里会发生有趣的事情。 HW 不正确、或者我从您上次的回答错误中复制了公式。
在 SINC1和精确90mV 输入的情况下、我从公式中得到的值约为80mV。 使用 SINC3 (和适当的公式)、我得到大约82mV。 当我提供0mV 作为输入时、两个算法的输出约为1.2mV。
我可以理解、使用 SINC3时、差异可能是前两个数据集可能不正确。 但从一开始 SINC0应该是正确的。 在这两种情况下、OSR = 256、我想应该最大限度地减少 SINC3中可能错误读数的影响。
是否有方法检查硬件? 除了提供+320mV 或-320mV 电压并验证我在128个时钟内接收到一个稳定的1或稳定的0、偶尔会出现反向?
谢谢、
Alexey。