您好!
在我的项目中、我希望使用 DMA 从 SD 卡读取数据。我正在检查有关这方面的一些示例、但没有获得任何信息。 如果有人执行此操作、请指导我如何使用 DMA 读取 SD 卡。
SD 卡具有与微控制器的 SSI 接口。
谢谢、
Alphy
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.
您好!
在我的项目中、我希望使用 DMA 从 SD 卡读取数据。我正在检查有关这方面的一些示例、但没有获得任何信息。 如果有人执行此操作、请指导我如何使用 DMA 读取 SD 卡。
SD 卡具有与微控制器的 SSI 接口。
谢谢、
Alphy
您好!
感谢您的快速回复。 我已经尝试编辑 MMC-dk-tm4c123g.c 文件、下面给出了对库所做的更改。
//在系统级别启用 uDMA 控制器。 使其继续 //在处理器处于睡眠状态时运行。 // ROM_SysCtlPeripheralEnable (SYSCTL_Periph_UDMA); ROM_SysCtlPeripheralSlepEnable (SYSCTL_Periph_UDMA); // //启用 uDMA 控制器错误中断。 将发生该中断 //如果在传输过程中出现总线错误。 // //rom_IntEnable (INT_UDMAERR); // //启用 UDMA 控制器。 // ROM_uDMAEnable(); // //指向控制表以用于通道控制结构体。 // ROM_uDMAControlBaseSet (ui8ControlTable);
静态 空 POWER_ON (空) { /* *这并不是真正打开电源、而是初始化 *与卡通信所需的 SSI 端口和引脚。 * /*启用用于驱动 SSI 上 SDC 的外设*/ ROM_SysCtlPeripheralEnable (SDC_SSI_SYSCTL_Periph); ROM_SysCtlPeripheralEnable (SDC_GPIO_SYSCTL_Periph); /* *将相应的引脚配置为 SSI 而不是 GPIO。 FSS (CS) *信号被直接驱动、以确保我们可以通过将其保持在低电平 *完成与 SD 卡的交易。 * ROM_GPIOPinTypeSSI (SDC_GPIO_PORT_BASE、SDC_SSI_TX | SDC_SSI_RX | SDC_SSI_CLK); ROM_GPIOPinTypeGPIOOutput (SDC_GPIO_PORT_base、SDC_SSI_FSS); /* *将 SSI 输出引脚设置为4mA 驱动强度并接合 *接收线上的上拉电阻。 * MAP_GPIOPadConfigSet (SDC_GPIO_PORT_base、SDC_SSI_RX、GPIO_Strength _4mA、 GPIO_PIN_TYPE_STD_WPU); MAP_GPIOPadConfigSet (SDC_GPIO_PORT_base、SDC_SSI_CLK | SDC_SSI_TX | SDC_SSI_FSS、 GPIO_Strength _4mA、GPIO_PIN_TYPE_STD); /*配置 SSI0端口*/ ROM_SSIConfigSetExpClk (SDC_SSI_base、ROM_SysCtlClockGet ()、 SSI_FRF_MOTO_MODE_0、SSI_MODE_MASTER、400000、8); ROM_SSIEnable (SDC_SSI_base); /*测试*/ uDMAChannelDisable (UDMA_CHANGE_SSI0RX); /*如您所见,UDMAChannelAssign 非常重要 ChINC 具有许多触发器、因此您需要通过此操作来确定 无效触发器、在本例中为 UDMA_CHANNE_SSI0RX*/ uDMAChannelAssign (UDMA_CHANNE_SSI0RX);uDMAChannelDisable (UDMA_CHANNEL_SSI0RX、UDMA_PRI_UDMA_TRIGN);uDMA_SDR_UDMA_INT_SSING_UDMA_SDR_0 (UDMA_INT_SSINT_SSINT_SSINT_SDR_SION_SI_SI_SIEMA_CONTRAL_UDR_SION_TRIGN)| UDMA_CONTRAL_UDMA_CONTRAL_UDMA_SDA_SDA_CONTRAL_UDMA_IN_TRIGN (UDR_UDMA_CONTRAM_UDMA_IN_UDMA_IN_UDMA_CONTRAM_UDMA_IN_UDMA_CONTRAM_UDR_SSINT_ G_ui32RxBufA、sizeof (g_ui32RxBufA); SSIDMAEnable (SSI0_BASE、SSI_DMA_RX); /*测试结束*/ /*将 DI 和 CS 设置为高电平并向卡的 SCLK 施加超过74个脉冲*/ /*才能接受本机命令。 * send_inition_clock_train (); PowerFlag = 1; }
静态
字节 RCVR_SPI (void)
{
uint32_t ui32RcvDat;
ROM_SSIDataPut (SDC_SSI_base、0xFF);//
写入虚拟数据*// ROM_SSIDataGet (SDC_SSI_base、&ui32RcvDat);//读取来自 Rx fifo 的数据*
//ROM_SSIIntStatus (SSSI0_BASE、&u32RcvDat);// SSSI0_RAM_BASE_DMA
(U0_RATE_RATE_RATE_RATE_RATE_N
)*、* USSI0_RATE_RATE_RATE_RATE_0 (UDR_RATE_RATE_RATE_RATE_RATE_RATE_RATE_RATE_N)*
g_ui32RxBufA、sizeof (g_ui32RxBufA);
返回(字节) ui32RcvDat;
}
上面提到的是 在 MMC-dk-tm4c123g.c 文件上所做的更改。
(void *)(SSI0_BASE + SSI_O_DR)步骤、给出了未定义 SSI_O_DR 标识符的错误。 如何解决此问题。
我正在使用 DMA 轮询方法。上述更改是否正常、或者我必须执行任何其他更改才能从 SD 卡读取数据。
谢谢、
Alphy
您好、Alphy、
[引用 USER="Alphy Ouseph "](void *)(SSI0_BASE + SSI_O_DR)步骤、给出了未定义 SSI_O_DR 标识符的错误。 如何解决此问题。[/quot]
您需要将标头包含在该定义中、因此 #include "inc/hw_ssi.h"应该具有您所需的全部内容。 如果这还不够、请检查主代码中的 include。
您好!
我已包含标头、错误已解决。 现在、我能够运行我的代码。
RCVR_SPI 函数始终返回零。 ROM_uDMAChannelModeGet 函数不返回 UDMA_MODE_STOP。
我正在使用 DMA 轮询方法。 DMA 初始化是否有任何问题? 是否需要添加任何其他步骤来使 DMA 正常工作?
下面 给出了我对 MMC-dk-tm4c123g.c 文件所做的更改、
静态 空 POWER_ON (空) { /* *这并不是真正打开电源、而是初始化 *与卡通信所需的 SSI 端口和引脚。 * /*启用用于驱动 SSI 上 SDC 的外设*/ ROM_SysCtlPeripheralEnable (SDC_SSI_SYSCTL_Periph); ROM_SysCtlPeripheralEnable (SDC_GPIO_SYSCTL_Periph); /* *将相应的引脚配置为 SSI 而不是 GPIO。 FSS (CS) *信号被直接驱动、以确保我们可以通过将其保持在低电平 *完成与 SD 卡的交易。 * ROM_GPIOPinTypeSSI (SDC_GPIO_PORT_BASE、SDC_SSI_TX | SDC_SSI_RX | SDC_SSI_CLK); ROM_GPIOPinTypeGPIOOutput (SDC_GPIO_PORT_base、SDC_SSI_FSS); /* *将 SSI 输出引脚设置为4mA 驱动强度并接合 *接收线上的上拉电阻。 * MAP_GPIOPadConfigSet (SDC_GPIO_PORT_base、SDC_SSI_RX、GPIO_Strength _4mA、 GPIO_PIN_TYPE_STD_WPU); MAP_GPIOPadConfigSet (SDC_GPIO_PORT_base、SDC_SSI_CLK | SDC_SSI_TX | SDC_SSI_FSS、 GPIO_Strength _4mA、GPIO_PIN_TYPE_STD); /*配置 SSI0端口*/ ROM_SSIConfigSetExpClk (SDC_SSI_base、ROM_SysCtlClockGet ()、 SSI_FRF_MOTO_MODE_0、SSI_MODE_MASTER、400000、8); ROM_SSIEnable (SDC_SSI_base); /*测试*/ ROM_SysCtlPeripheralEnable (SYSCTL_PERIPh_UDMA); ROM_SysCtlPeripheralSlepEnable (SYSCTL_Periph_UDMA); // //启用 uDMA 控制器错误中断。 将发生该中断 //如果在传输过程中出现总线错误。 // ROM_IntEnable (INT_UDMAERR); // //启用 UDMA 控制器。 // ROM_uDMAEnable(); // //指向控制表以用于通道控制结构体。 // ROM_uDMAControlBaseSet (ui8ControlTable); uDMAChannelDisable (UDMA_CHANGE_SSI0RX); /*如您所见、UDMAChannelAssign 非常重要 ChINC 具有许多触发器、因此您需要通过此命令来确定 无效的触发器、在本例中为 UDMA_CHANNE_SSI0RX*/ uDMAChannelAssign (UDMA_CHANNE_SSI0RX);uDMAChannelDisable (UDMA_CHANNEL_SSI0RX、UDMA_PRI_UDMA_TRIGN);uDMA_SDA_IN_UDMA_SDR_UDMA_SDK_CONTROL_UDR_SDA_STR_USS32_TRIGN | UDMA_SDA_SDA_CONTROL_UDMA_TRIGN (UDR_UDMA_CONTRAM_UDR_UDMA_SDR_UDR_TRIGN)| UDMA_CONTRAM_UDMA_TRIGN (UDMA_SDR_UDMA_CONTRAM_UDMA_SDA_TRIGN)| UDMA_TRIGN (UDMA_CONTRAM_UDMA_SDA_SDA_SD G_ui32RxBufA、sizeof (g_ui32RxBufA); SSIDMAEnable (SSI0_BASE、SSI_DMA_RX); //测试结束 /*将 DI 和 CS 设置为高电平并向卡的 SCLK 施加超过74个脉冲*/ /*才能接受本机命令。 * send_inition_clock_train (); PowerFlag = 1; } 静态 字节 RCVR_SPI (空) { uint32_t ui32RcvDat、ui32Mode; ROM_SSIDataPut (SDC_SSI_base、0xFF);// ROM 写入虚拟数据*// ROM_SSIDataGet (SDC_SSI_base、&ui32RcvDat);//*读取数据 frm Rx fifo *// ROM_SSIIntStatus (SSD0_base、&ui32Rcs_u32Rv0* = uSD_u_u_uSDK_uSDRA_u_u32Rdma_u_u_uSD_u_u_uSDK_u_u0u_uSDK_u_uSDK_u_u_uSDK_uSDK_u_u32u_u_u_uSDK_u_u_uSDK_u_u_uSDK_u_uSDK_u_u_uSDK_u_u_u_uSDK_u_uSDK_u_u_u_uSDK_u_uSDK_u_u_uSDK_u_u_u_uSDK_u_u_uSDK_u_u_uSDK_uSDK_u_uSDK_u 返回(字节) ui32RcvDat; }
谢谢、
Alphy
您好!
我们的小型技术团队致力于 SD 卡和 MCU 的 µDMA è re 的"枪式"婚姻中的"先锋"努力。
你注意到,"没有这样的例子"--这可能是"故意的?"
SPI FIFO 的大小非常小-这与 μ µDMA 的1024传输容量没有"冲突"吗? (即 µDMA µDMA "呼叫开销"必须重复(无目的)-可能会削弱 T Ü V 的效率!)
这就值得你考虑--不是吗?
今天到了一个(有点)类似的帖子(通过 μ µDMA 通过 MCU 的 SPI 进行 EPI SD RAM 转换)。 也许是有益的——值得你读一下……
您好!
再次感谢您的快速回复。
正如您提到的、SPI FIFO 的大小非常小-这与 μ µDMA 的1024事务容量没有"冲突"吗? (即 µDMA µDMA 的"呼叫开销"必须重复(无目的)-可能会削弱 T Ü V 的效率!)。 但在我的程序中、仲裁数目仅为8。 它会产生任何问题吗?
ui32Mode = ROM_uDMAChannelModeGet (UDMA_CHANGE_SSI0RX | UDMA_PRI_SELECT);函数不返回 UDMA_MODE_STOP 可能是什么问题?
我将程序从轮询方法更改为中断。 该程序不会进入 SSI 中断处理程序函数、原因可能是什么、如何解决?
下面给出了新的修改代码、
静态 空 POWER_ON (空) { /* *这并不是真正打开电源、而是初始化 *与卡通信所需的 SSI 端口和引脚。 * /*启用用于驱动 SSI 上 SDC 的外设*/ ROM_SysCtlPeripheralEnable (SDC_SSI_SYSCTL_Periph); ROM_SysCtlPeripheralEnable (SDC_GPIO_SYSCTL_Periph); /* *将相应的引脚配置为 SSI 而不是 GPIO。 FSS (CS) *信号被直接驱动、以确保我们可以通过将其保持在低电平 *完成与 SD 卡的交易。 * ROM_GPIOPinTypeSSI (SDC_GPIO_PORT_BASE、SDC_SSI_TX | SDC_SSI_RX | SDC_SSI_CLK); ROM_GPIOPinTypeGPIOOutput (SDC_GPIO_PORT_base、SDC_SSI_FSS); /* *将 SSI 输出引脚设置为4mA 驱动强度并接合 *接收线上的上拉电阻。 * MAP_GPIOPadConfigSet (SDC_GPIO_PORT_base、SDC_SSI_RX、GPIO_Strength _4mA、 GPIO_PIN_TYPE_STD_WPU); MAP_GPIOPadConfigSet (SDC_GPIO_PORT_base、SDC_SSI_CLK | SDC_SSI_TX | SDC_SSI_FSS、 GPIO_Strength _4mA、GPIO_PIN_TYPE_STD); /*配置 SSI0端口*/ ROM_SSIConfigSetExpClk (SDC_SSI_base、ROM_SysCtlClockGet ()、 SSI_FRF_MOTO_MODE_0、SSI_MODE_MASTER、400000、8); //SSIEnable (SSI0_BASE); /*清除 SSI0 RX 缓冲器*/ while (ROM_SSIDataGetNonBlocking (SSI0_BASE、&g_ui32RxBufA[0])){} ROM_SSIEnable (SDC_SSI_base); ROM_SSIIntEnable (SSI0_BASE、SSI_DMARX); /*测试*/ ROM_SysCtlPeripheralEnable (SYSCTL_PERIPH_UDMA); ROM_SysCtlPeripheralSlepEnable (SYSCTL_Periph_UDMA); // //启用 uDMA 控制器错误中断。 将发生该中断 //如果在传输过程中出现总线错误。 // ROM_IntEnable (INT_UDMAERR); // //启用 UDMA 控制器。 // ROM_uDMAEnable(); // //为 TX 和 RX 通道启用 uDMA 接口。 // ROM_SSIDMAEnable (SSI0_BASE、SSI_DMA_RX); // //指向控制表以用于通道控制结构体。 // ROM_uDMAControlBaseSet (ui8ControlTable); //uDMAChannelDisable (UDMA_CHANGE_SSI0RX); /* UDMAChannelAssign 非常重要,正如您看到的那样 Chanel 有很多触发器、所以您需要这样做来决定触发器、在本例中、它是 UDMA_CHANGE_SSI0RX*/ uDMAChannelAssign (UDMA_CHANGE_SSI0RX); uDMAChannelAttributeDisable (UDMA_CHANGE_SSI0RX、UDMA_ATTR_ALTSELECT | UDMA_ATTR_HIGH_PRIOR| uDMA_ATTR_REQMASK); uDMAChannelControlSet (UDMA_CHANNE_SSI0RX | UDMA_PRI_SELECT、 UDMA_SIZE 32 | UDMA_SRC_NONE | UDMA_DST_INC_32 | UDMA_ARB_8); uDMAChannelTransferSet (UDMA_SDA_BASE_0 )、UDMA_INC_DIO_INC_NED、UDMA_SIZE *、UDMA_CAL_O_INC_NED + UDMA_DIO_RAY (UDMA_FO_INC_NED) G_ui32RxBufA、sizeof (g_ui32RxBufA); ROM_SSIIntEnable (SDC_SSI_base、SSI_DMARX); //SSIDMAEnable (SDC_SSI_base、 SSI_DMA_RX); // //启用 SSI0外设中断。 // ROM_IntEnable (INT_SSI0); //测试结束*/ /*将 DI 和 CS 设置为高电平并向卡的 SCLK 施加超过74个脉冲*/ /*才能接受本机命令。 * send_inition_clock_train (); PowerFlag = 1; } void SSI0_Handler (void) { uint32_t ui32Status; uint32_t ui32Mode; ui32Status = ROM_SSIIntStatus (SDC_SSI_base、1); //将返回中断原因(SSITX 或 SSIRX 中断) ROM_SSIIntClear (SDC_SSI_BASE、ui32Status); ui32Mode = ROM_uDMAChannelModeGet (UDMA_CHANGE_SSI0RX | UDMA_PRI_SELECT); //if (ui32Mode = ROM_uDMA_USDA_RESP= U32_UDR_SION_UDR_SION_FO_SIU0RX ) ;// uSDK_U32uSDK_UDMA_RESP= u0_U64_UDR_UDR_UDR_SION_SION_SION_SION_SION_SION_SION_SION_SION_SION_SION_SION_UDR_SION_SION_SION_SION_SION_SION_SIMODE/(U0_USS_U
请帮助我解决这些问题。
谢谢、
Alphy
谢谢您-我们的外部人员团队希望能够提供指导/帮助-但我们(再次)在这方面"超越我们的领导"。 在多种情况下、供应商代理(对其器件具有丰富的内部知识)注意到:"传输的 µDMA 传输时间短、不连贯、无法实现最佳的 µDMA 结果!" 这是预期的-是不是吗?
大声思考-是否可以探索其他一些转移方式-这可以实现更大(因此更高效)的 µDMA 转移规模? (例如、小型"CPLD "可能会实现从 SD 卡到 MCU (或其他) SRAM 的传输。 通过这种方式-从8或16字节限制中释放-µDMA 传输可以改进... (至少在理论上... 也许吧。)
您是否已经说明了您使用 n ü µDMA 的目标? 我们引用的另一篇文章指出、用户的目标是"让代码运行"减小内核或(甚至)释放"。 µDMA 这种特殊的好处-很难注意到您的期望-激发您的兴趣。 同样、缺少(任何)现有代码(可能)表明供应商认为此类用法没有太大意义...
您好、Alphy、
还好,所以先得... SD 卡设置为8字节传输:
/*配置 SSI0端口*/ ROM_SSIConfigSetExpClk (SDC_SSI_base、ROM_SysCtlClockGet ()、 SSI_FRF_MOTO_MODE_0、SSI_MODE_MASTER、400000、8);
因此、如果将 UDMA 大小设置为32字节不正确、则应为 UDMA_SIZE_8。
基于此、 UDMA_dst_INC_32 也可能更改为 UDMA_dst_INC_8。
关于 UDMA_ARB_8和其他仲裁值、这取决于您打算如何使用 DMA...
来自 D/S: 每个通道还具有可配置的仲裁大小。 仲裁数目是指 μ μDMA 控制器重新仲裁通道优先级之前以猝发方式传输的数据单元数。 通过仲裁数目、当外设每次产生 μ μDMA 服务请求时、可以精确控制与外设之间传输的数据单元数。
这意味着、您将决定每次 UDMA 传输要读取的数据量。 如果您有很多数据、如 SD 卡应该有的数据、那么您可能需要将其设置为1024。 达到该数量后、您将必须重新配置 UDMA 通道、无论在乒乓模式下使用同一个通道还是辅助通道。
另一点是中断、我认为您仍然需要
SSIDMAEnable (SSI0_BASE、SSI_DMA_RX);
还要确保为中断提供此设置:
// //启用到处理器的中断。 // ROM_IntMasterEnable();
看看这些调整可以为您提供哪些信息、我们可以从这些信息中进行调整。
您好!
非常感谢大家的回复。
您是否已经说明了您使用 n ü µDMA 的目标? 目标是以1 RPM 的值运行1毫秒的电机。 存储在 SD 卡中的文本文件具有不同的 RPM 值。我的目标是在完成1毫秒之前从 SD 卡中获取下一个 RPM 值、然后运行电机1毫秒。 但无法在1毫秒内完成读取。我想使用数组来存储从 SD 卡读取的所有数据、但 RAM 大小存在限制。 最后、我想使用 μ µDMA 读取 SD 卡中的数据、并使用内核运行电机。
在多种情况下、供应商代理(对其器件具有丰富的内部知识)注意到:"传输的 µDMA 传输时间短、不连贯、无法实现最佳的 µDMA 结果!" 这是预期的-是不是吗?是的、我的考虑是这样的。
我已将 UDMA_dst_INC_32更改为 UDMA_dst_INC_8。 您提到的中断部分已经实现。 但它仍然不会中断。
而不是 ROM_SSIIntEnable (SSI0_BASE、SSI_DMARX);如果我使用 ROM_SSIIntEnable (SSI0_BASE、SSI_RXFF)、则控制权将转到 ISR。 μ µDMA 配置是否存在任何问题?
谢谢、
Alphy
您好、再次感谢您( 此处有几个问题需要回答、其中包括您显示的关注和详细信息)
让我们更详细地查看您的回答:
[引用 user="Alphy Ouseph "]…… 目标是以1 RPM 值运行电机1毫秒。
这种回答(非常)很好地说明了"提问海报请求"的价值。 在过去十年中、我们的小型技术公司生产了各种电机控制器(用于 BLDC、有刷、步进等)。 电机-尤其是在"驱动负载"-遇到"惯性"时-该惯性会阻止大多数电机响应(控制命令)、时间为1ms! (根据负载的不同、即使是50mS 的响应时间也很难满足! 对于我们遇到的大多数电机而言都是如此、但对于新型和轻载压电式电机而言、情况却是如此。) 因此-您可能已经选择了一个"无法到达的目标"-并且可能会"让您省去将 μ µDMA 与 SPI 模块"结合"所需的额外时间/精力。"
[引用 user="Alphy Ouseph "]…… 存储在 SD 卡中的文本文件具有不同的 RPM 值。
您是否没有通过使用"人类可读"文本文件来增加处理需求? 二进制值(即两个字节)不会提供65K 的电机速度-这种速度比"文本数据"传递速度快得多且容易得多? 同样、"设计决定"(也许)值得审查/重新思考。
我们公司的大多数电机控制器都支持"运动曲线"、它允许:
请注意、"以上都不是"会主动存储在(效率低下)文本文件中。 用户只需输入"十进制数据"(通过串行终端程序)(即文本文件)、该数据就会从文本高效转换、然后通过外部非易失性串行闪存(8引脚)存储器进行存储。
您可能会受益于我们公司的"惯性车轮"(仅其中一个)。 很明显-即使是我们的一个10KW 电机控制器也无法"增加 RPM "@ 1ms 的间隔! 能够"测试/验证"我们的电机控制器成功控制(甚至)大型负载(甚至在交付前)的能力、提供了巨大的竞争优势...
请注意、"您也"可能能够实现这样一个关键的"电机负载/测试"-并且以这种方式-"解锁"您系统的"现实世界响应要求"! (极不可能与您(以某种方式选择)的1ms 控制速率匹配...)
您好、Alphy、
[引用 user="Alphy Ouseph µDMA 您是否已说明您使用 n ü r 的目标? 目标是以1 RPM 的值运行1毫秒的电机。 存储在 SD 卡中的文本文件具有不同的 RPM 值。我的目标是在完成1毫秒之前从 SD 卡中获取下一个 RPM 值、然后运行电机1毫秒。 但无法在1毫秒内完成读取。我想使用数组来存储从 SD 卡读取的所有数据、但 RAM 大小存在限制。 因此、最后我想使用 μ µDMA 读取 SD 卡中的数据、并使用内核运行电机。
除了 CB1在这里的评论说、这在物理上甚至是不可能的-我不确定 UDMA 在这里会有多少帮助。 您还可能受到 SPI 传输时间和 SD 卡访问时间的限制-仅 SPI 通信多长时间? 您是否需要这些字节、如所示、实时读取一个字节、然后在1ms 内具有下一个字节、或者您是否可以构建一个字节缓冲区以允许延迟? 多少字节的数据? 您看到了多少间隔时间? UDMA 在后台运行和执行大型传输等方面非常有用 是否有其他软件瓶连接了这段读取时间、或者 SD 卡操作是否全部运行?
我很怀疑这也是一项值得努力的工作——因为 CB1非常有效地怀疑电机甚至可以作出很好的反应。 我可以证明他的公司在电机方面拥有丰富的经验、请仔细阅读他的反馈...
您好!
很抱歉耽误你的回答。 您的回答解释得很好、让我思考很多问题。 非常感谢您的快速回复。
在过去十年中、我们的小型技术公司生产了各种电机控制器(用于 BLDC、有刷、步进等)。 电机-尤其是在"驱动负载"-遇到"惯性"时-该惯性 会阻止大多数电机 响应(控制命令) 、时间为1ms! (根据负载的不同、即使是50mS 的响应时间也很难满足! 对于我们遇到的大多数电机而言都是如此、但对于新型和轻载 压电式电机而言、情况却是如此。) 因此-您可能已经选择了一个"无法到达的目标"-并且可能会"让您省去将 μ µDMA 与 SPI 模块"结合"所需的额外时间/精力。"
我正在使用 Panasonic Minas A6系列交流伺服电机。我正在使用计时器 PWM 运行电机。 电机在给定的 RPM 值下运行正常。
您是否没有通过使用"人类可读"文本文件来增加处理需求? 二进制值(即两个字节)不会提供65K 的电机速度-这种速度比"文本数据"传递速度快得多且容易得多? 同样、"设计决定"(也许)值得审查/重新思考。
您能否告诉我、除了文本文件格式之外、哪种文件格式可以提高处理速度?
您是否需要这些字节、如所示、实时读取一个字节、然后在1ms 内具有下一个字节、或者您是否可以构建一个字节缓冲区以允许延迟? 多少字节的数据? 您看到了多少间隔时间?
我将读取一个数据(最大大小为3字节)、然后开始运行电机 、然后再次开始获取新数据。但我看到大约2ms 的间隔。
谢谢、
Alphy
减少退货问候、
[引用 USER="Alphy Ouseph ]我正在使用 Panasonic Minas A6系列交流伺服电机。我正在使用计时器 PWM 运行电机。 电机在给定的 RPM 值下运行正常。 [/报价]
原谅-但上面没有描述"追求1ms 电机速度更新"-也没有将电机作为组件"现实"-驱动"现实世界"负载! (必须遵守惯性法!) 当您的电机"运行完美"时、我们"无法掌握您所寻求的(进一步)!"
[引用 user="Alphy Ouseph "]您能否告诉我、除了文本文件格式之外、哪些文件格式可以提高处理速度?
如前所述-两个二进制字节启用~64K 速度设置。 您的 SD 卡逻辑似乎不一致:
这是"自败"的-不是吗? 人类可读格式(始终)会减慢数据传输的速度并增加其复杂性-这不是我们的选择!
您好、Alphy、
[引用 user="Alphy Ouseph "]我将读取一个数据(最大大小为3字节)、然后开始运行电机 、然后再次开始获取新数据。但我看到的间隔约为2ms。
您是否监测了 SPI 传输时间? 只需在 SPI 线路上处理此部件需要多长时间?
如果您正在这样做、您认为 UDMA 如何提供帮助? 这听起来很活跃... 我在这里看不到 UDMA 为您提供了任何优势... SSI 和 SD 卡协议可能远不止一个瓶颈、我不清楚 UDMA 会如何将这一切缩短2ms。
您好!
再次感谢您的快速回复。
"寻求1ms 电机速度更新"-也不"冒险研究电机作为组件的"现实"-驱动"现实世界"负载! (必须遵守惯性法!) 当您的电机"运行完美"时、我们"无法掌握 您所寻求的(进一步)!"
我使用电机来泵送液体。 我的目标是使用 UDMA 读取 SD 卡中的数据、并使用内核运行电机。
您是否监测了 SPI 传输时间? 只需在 SPI 线路上处理此部件需要多长时间?
很抱歉、由于锁定、我无法去办公室、因此我没有逻辑分析仪来检查传输时间。 我已经使用1ms 计时器中断测试了数据读取和电机运行时序。
如果您正在这样做、您认为 UDMA 如何提供帮助? 这听起来很活跃... 我在这里看不到 UDMA 为您提供了任何优势... SSI 和 SD 卡协议可能远不止一个瓶颈、我不清楚 UDMA 会如何将这一切缩短2ms。
从 SD 卡获取数据的时间比我预期的要长。 因此、我想将 uDMA 用于 SD 卡和控制器接口、并将内核用于电机运行。
谢谢、
Alphy
您好!
[引用 user="Alphy Ouseph "] 我已经使用1ms 计时器中断测试了数据读取和电机运行时序。
但是、"为什么1ms?" 您的"液体循环系统"(真的)能否有效地支持和/或从这种频率中"受益"? 您执行了哪些实验来确认1ms 率带来的(任何)好处?
我们不知道您的流体系统的程度和/或其局限性或敏感性。 我们观察到、当泵速率、容量和流体流动都达到"规格"时、许多此类(设计/开发适当)系统都能达到最佳(也是最长的)性能! 在您的系统和您的设计选择方面、我们始终(非常)处于阴暗状态...
我的朋友、
µDMA -供应商代理和我的团队都注意到、由于 T Ü V 使用而产生的(任何)好处不太可能。 也许是时候"继续"了吗?
在您的泵研究中: (离心、正位移、气动隔膜...) 您肯定注意到、"您的泵的运行曲线"。 理想情况下、您应在泵的最佳效率点附近操作。
使用压力表和/或流量计可以提高您对泵在其曲线中运行位置的掌握。
"MCU ->电机->泵"控制是需要注意的一个(许多)项目。 怀疑(进一步)检查泵的工作曲线会"使您摆脱1ms (仅1ms)固定...
您在 SD 卡中使用文本时(之前已注明)、会"减慢并增加复杂性"到您的电机控制处理。