Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 编译,SPI电机驱动器屏蔽单独工作,但不能一起工作_C++_Motordriver - Fatal编程技术网

C++ 编译,SPI电机驱动器屏蔽单独工作,但不能一起工作

C++ 编译,SPI电机驱动器屏蔽单独工作,但不能一起工作,c++,motordriver,C++,Motordriver,我使用的是STM32F767 MCU和两个屏蔽:IHM02A1双步进电机驱动器。我还没有调试器,但我的公司正在得到一个 与此同时,我一直在对Mbed的部分代码进行取消/注释。他们的Hello World程序可从此网站获得,并可通过单击“导入程序”直接在其在线IDE中使用: 这是完整程序的最小可复制示例。如果您想自己尝试,只需将其复制/粘贴到main.cpp(在上面提到的在线IDE中) 一切都符合,没有警告。下面的任何一条线(带有匹配的指针等)都是通过移动电机来工作的。也就是说,两个电机[x]和电

我使用的是STM32F767 MCU和两个屏蔽:IHM02A1双步进电机驱动器。我还没有调试器,但我的公司正在得到一个

与此同时,我一直在对Mbed的部分代码进行取消/注释。他们的Hello World程序可从此网站获得,并可通过单击“导入程序”直接在其在线IDE中使用:

这是完整程序的最小可复制示例。如果您想自己尝试,只需将其复制/粘贴到main.cpp(在上面提到的在线IDE中)

一切都符合,没有警告。下面的任何一条线(带有匹配的指针等)都是通过移动电机来工作的。也就是说,两个电机[x]和电机[x]都是独立工作的。但是当两条线都被加载到电路板上时……什么都不起作用,电机就不动了。踏步机甚至没有发出非常柔和的声音

x_nucleo_ihm02a1 =    new XNucleoIHM02A1(&init[0], &init[1], A4, A5, D4, D2, &dev_spi);
x_nucleo_ihm02a1two = new XNucleoIHM02A1(&init[0], &init[1], A4, A5, D4, A2, &dev_spi);
为什么这两行不能一起上传?如何解决这个问题


编辑 该类包括两个用于“XIHM02A1”的函数。一个有七个周长的是要解剖的…第二个最后的参数应该改变(ssel:)

查看核子示意图,您会注意到L6470_1_SDO(串行数据输出)连接到L6470_0_SDI(串行数据输入)。这是菊花链配置。还要注意桥接SB7如何连接到电路板上的D2引脚

查看零件数据表,它将在/CS低时开始读取数据,并将继续将数据移出,直到/CS高为止

通过堆叠第二块电路板,此配置结果是菊花链和上述单独寻址版本的组合:


硬件文档

你说你有两个盾牌?每个护罩上都有一个IHM02A1驱动器?请详细说明

如果是这种情况,您可以使用相同的SPI总线,但每个屏蔽需要单独的芯片选择线

我不是Arduino的用户,所以我不太熟悉他们的司机。我下载了示例项目并快速浏览了一下:

对于IHM02A1类,构造函数如下所示:

XNucleoIHM02A1(L6470_init_t *init_0, L6470_init_t *init_1, uint8_t flag_irq, uint8_t busy_irq, uint8_t standby_reset, uint8_t ssel, SPIClass *spi);
其中,参数具有以下描述:

/**
 * @brief Constructor.
 * @param init_0        pointer to the initialization structure of the first motor.
 * @param init_1        pointer to the initialization structure of the second motor.
 * @param flag_irq      pin name of the FLAG pin of the component.
 * @param busy_irq      pin name of the BUSY pin of the component.
 * @param standby_reset pin name of the STBY\RST pin of the component.
 * @param ssel          pin name of the SSEL pin of the SPI device to be used for communication.
 * @param spi           SPI device to be used for communication.
 */
第六个参数是选择引脚。这是您必须为每个屏蔽指定选择引脚的地方

然后您将需要两个类XIHM02A1的实例,每个屏蔽一个。它不是每个马达的实例。该课程已经为两台电机做了准备

XNucleoIHM02A1 *x_nucleo_ihm02a1_shield1; // Class for shield 1
XNucleoIHM02A1 *x_nucleo_ihm02a1_shield2; // Class for shield 2

x_nucleo_ihm02a1_shield1 = new XNucleoIHM02A1(&init[0], &init[1], FLAG1, BUSY1, STBY_RST1, SS1, &dev_spi);
x_nucleo_ihm02a1_shield2 = new XNucleoIHM02A1(&init[0], &init[1], FLAG2, BUSY2, STBY_RST2, SS2, &dev_spi);
其中,SS1和SS2是芯片选择引脚。注意:您必须用实际的pin码填充这些

您还必须确保其余参数定义正确。您很可能需要为每个屏蔽分别设置FLAG、BUSY和STBY/RST引脚。因此,我定义了参数FLAG1、FLAG2、BUSY1、BUSY2、STBY_RST1、STBY_RST2。注意:您必须用实际的pin码填充这些

附录:

如果每个电机需要不同的参数,则需要四种不同的初始结构:

L6470_init_t init_shield1[L6470DAISYCHAINSIZE] = {...};
L6470_init_t init_shield2[L6470DAISYCHAINSIZE] = {...};

x_nucleo_ihm02a1_shield1 = new XNucleoIHM02A1(&init_shield1[0], &init_shield1[1], FLAG1, BUSY1, STBY_RST1, SS1, &dev_spi);
x_nucleo_ihm02a1_shield2 = new XNucleoIHM02A1(&init_shield2[0], &init_shield2[1], FLAG2, BUSY2, STBY_RST2, SS2, &dev_spi);
但是,如果所有电机具有相同的参数和/或要求,那么您只需要一个init结构

L6470_init_t init[L6470DAISYCHAINSIZE] = {...};

x_nucleo_ihm02a1_shield1 = new XNucleoIHM02A1(&init[0], &init[1], FLAG1, BUSY1, STBY_RST1, SS1, &dev_spi);
x_nucleo_ihm02a1_shield2 = new XNucleoIHM02A1(&init[0], &init[1], FLAG2, BUSY2, STBY_RST2, SS2, &dev_spi);
您需要为每个屏蔽调用“get_components”:

// For easier reading
#define L6470_S1M1 (0u) // Index of shield1 motor1
#define L6470_S1M2 (1u) // Index of shield1 motor2
#define L6470_S2M1 (0u) // Index of shield2 motor1
#define L6470_S2M2 (1u) // Index of shield2 motor2

L6470 **motors_shield1 = x_nucleo_ihm02a1_shield1->get_components();
L6470 **motors_shield2 = x_nucleo_ihm02a1_shield2->get_components();
然后按以下方式操作电机:

motors_shield1[L6470_S1M1]->set_home(); // Home motor1 on shield1
motors_shield1[L6470_S1M2]->set_home(); // Home motor2 on shield1
motors_shield2[L6470_S2M1]->set_home(); // Home motor1 on shield2
motors_shield2[L6470_S2M2]->set_home(); // Home motor2 on shield2

什么是
A4
A5
D4
D2
?我猜这些是你连接电机的针脚?如果是这样,则不能同时将两个电机连接到同一引脚。你需要更多的别针。您也不能同时使用相同的
init[0]
init[1]
。@zvone
A4
=
flag\u irq
A5
=
busy\u irq
D4
=
standby\u reset
,唯一更改的pin是
ssel
(如上面的编辑所示)。我的理解是,它们是中断和标志。@zvone,所以我很确定更改它们是毫无意义的。旧的IHM01A1单电机驱动板不会更改任何我不太了解的引脚:motor1=新的PowerStep01(D2、D4、D8、D9、D10、dev_spi);/。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。电机2=新的动力步骤01(D2、D4、D8、D9、D10、dev_spi);/。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。motor3=新的动力步骤01(D2、D4、D8、D9、D10、dev_spi);我的怀疑是,API有一个不成文的假设,即您正在以某种方式破坏。例如,如果您真的只对其中一个马达感兴趣,那么为什么需要同时通过两个init结构?出于好奇,你有没有试过编译并运行3马达的例子而不做任何修改?@AdamUraynar很抱歉,我认为现在可以了。每个盾牌运行两个马达。我有三个马达,所以我需要使用两个IHM02A1发动机。我使用的是STM32F767单片机,不是Ardunio。@AdamUraynar对此表示抱歉。我假设X-Nucleo是基于Arduino的。但这并不重要。答案仍然是一样的。@AdamUraynar我将在我的帖子中添加一个关于“get_components”的附录,我认为它可能会起作用……几乎……至少底部步进器在第二次移动时没有注释代码……可能必须更改物理引脚。。。
motors_shield1[L6470_S1M1]->set_home(); // Home motor1 on shield1
motors_shield1[L6470_S1M2]->set_home(); // Home motor2 on shield1
motors_shield2[L6470_S2M1]->set_home(); // Home motor1 on shield2
motors_shield2[L6470_S2M2]->set_home(); // Home motor2 on shield2