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.

[参考译文] 使用 Driverlib 以及 MSP432P401r 和 SN754410的 PWM 电机驱动器

Guru**** 2524550 points
Other Parts Discussed in Thread: SN754410

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/994167/pwm-motor-drive-using-driverlib-with-msp432p401r-and-sn754410

主题中讨论的其他器件:SN754410

您好!

我正在尝试使用 MSP432 P401R 上的 SN7554410四路桥驱动连接到两个电机的左右轮子。 我正在尝试通过将 PWM 信号作为外设发送到 P2.4/P2.5/P2.6/P2.7来驱动正向。 P1.6和 P1.7是使能引脚。 开关 P1.1使用 PWM 信号和 TIMER_A0正向驱动电机、开关 P1.4反向驱动电机。 占空比每次按下时递增33%、然后在达到最大值(10000)时复位为0。 随附代码。 我无法在电机上进行任何运动。 有人可以提供帮助吗? 必须使用驱动程序库命令来完成此操作。 注释将添加到代码中、所有连接都将被选中。

 代码如下:

/*********
* MSP432_P401r Timer_A - PWM 两个电机驱动器
*
*说明:此代码的目的是使用 SN754410的左右电机驱动机器人。
*开关1 (P1.1)驱动两侧的电机前进、开关2 (P1.4)驱动电机后退。
*使用 Timer_A0。 电机速度控制为占空比10000的33.33%、66.66%和100%。
*
*
秘书长的报告 /
/* DriverLib 包括*/
#include

/*标准包括*/
#include
#include


/*通过在程序开始处填充的"struct"进行计时器 A PWM 配置*/
/*根据需要定义宏和函数原型*/

//extern Timer_A_PWMConfig pwmConfig =

Timer_A_PWMConfig pwmConfig=

Timer_A_CLOCKSOURCE_SMCLK、
Timer_A_CLOCKSOURCE_DIVIDER_1、//没有分频器,我们将使用 DCOfreq 3.0MHz-->周期=1/3.0MHz=0.33us
10000、//our 周期=3.3ms;时钟周期节拍=3.3ms/0.33us=10000时钟周期
//timer_A_CAPTURECOMPARE 寄存器_4、TA0.4、P2.7->4A 的/CCR4位置寄存器
//timer_A_CAPTURECOMPARE 寄存器_3、TA0.3、P2.6-->3A 的/CCCR3位置寄存器
//timer_A_CAPTURECOMPARE 寄存器_2、TA0.2、P2.5->2A 的/CCR2位置寄存器
Timer_A_CAPTURECOMPARE 寄存器_1、TA0.1、P2.4->1A 的//CCR1位置寄存器
//timer_A_CAPTURECOMPARE 寄存器_0、// CCR0
Timer_A_OUTPUTMODE_RESET_SET、//模块7功能(PWM 信号)
3300 //将占空比设置为33%;0.33*10000=3300
};

//![Simple Timer_A 配置]

volatile uint32_t counter = 0;

/* GPIO 和端口初始化函数*/
void init (){
MAP_GPIO_setAsInputPinWithPullUp电 阻器(GPIO_PORT_P1、GPIO_PIN1|GPIO_PIN4);//将 S1和 S2设置为输入上拉电阻器
//对于 Lab4:更容易使用轮询而不是中断来监控 S1和 S2按钮

/*设置 GPIO 端口1.6:启用 SN754410的1、2EN 四路半高驱动器:右电机作为输出引脚*/
MAP_GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN6);

/*设置 GPIO 端口1.6:启用 SN754410的1、2EN:通过轮询将右侧电机输出低电平打开*/
MAP_GPIO_setOutputHighOnPin (GPIO_PORT_P1、GPIO_PIN6);

/*设置 GPIO 端口1.7:启用 SN754410四路半高驱动器的3、4EN:左侧电机作为输出引脚*/
MAP_GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN7);

/*设置 GPIO 端口1.7:启用 SN754410的3、4EN:左侧电机作为输出低电平、通过轮询打开*/
MAP_GPIO_setOutputHighOnPin (GPIO_PORT_P1、GPIO_PIN7);



int main (空)

/*停止看门狗*/
WDT_A_HOLDTimer();
//unsigned int dcoFrequency = 3.0E+6;

//mechrev_setup();
//设置时钟信号
//map_CS_setDCOFrequency (dcoFrequency);//设置 DCO 时钟源频率
MAP_CS_setDCOFrequency (3000000);//设置 DCO 时钟源频率

MAP_CS_initClockSignal (CS_SMCLK、CS_DCOCLK_SELECT、CS_CLOCK_DIVIDER_1);
//map_CS_initClockSignal (CS_MCLK、CS_REFOCLK_select、CS_clock_divider);//将 SMCLK 连接到 DCO

init();//调用函数"init":GPIO 和端口初始化

//作为 PWM 的外设输出

//MAP_GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P7、GPIO_PIN3、GPIO_PRIMARY_MODULE_Function);/* P7.3为 TA0.0 *
//设置计时器 A0的输出引脚:TA0.1、TA0.2、TA0.3、TA0.4 -> 1A、2A、3A、4A 的引脚2.4、2.5、2.6和2.7 (SN754410)
MAP_GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P2、GPIO_PIN4|GPIO_PIN5|GPIO_PIN6| GPIO_PIN7、
GPIO_PRIMARY_MODULE_FUNCTION);

//写入 PWM 配置初始占空比33%= 3300、周期为3.3ms
//map_Timer_a_generatePWM (timer_A0_BASE、&pwmConfig);

//
///------------------

//中断配置
interrupt_disableMaster();//禁用中断以进入临界区
GPIO_interruptEdgeSelect (GPIO_PORT_P1、GPIO_PIN1 |GPIO_PIN4、GPIO_HIGH_TO_LOW_TRANSITION);
GPIO_clearInterruptFlag (GPIO_PORT_P1、GPIO_PIN1 |GPIO_PIN4);
GPIO_enableInterrupt (GPIO_PORT_P1、GPIO_PIN1 |GPIO_PIN4);
INTERRUPT_enableInterrupt (INT_TA0_0);
interrupt_enableMaster();

//MAP_Interrupt_enableInterrupt (计时器);
MAP_Timer_A_generatePWM (TIMER_A0_BASE、&pwmConfig);
MAP_Timer_A_clearInterruptFlag (timer_A0_BASE);
MAP_Timer_A_enableInterrupt (TIMER_A0_BASE);
MAP_Timer_A_enableCaptureCompareInterrupt (TIMER_A0_BASE、TIMER_A_CAPTURECMOLE_REGISTER_0);

/*启用主中断*/
MAP_Interrupt_enableMaster();

/*不使用时睡眠*/
/*
while (1)

MAP_PCM_gotoLPM0 ();
}*/


/* Port1 ISR -此 ISR 将逐步升高 PWM 的占空比
*按下按钮
*

//void Port1_IRQHandler (void)
void TA0_0_IRQHandler (void)

uint32_t status;
/*uint_fast16_t GPIO_getEnabledInterruptStatus (uint_fast8_t selectedPort)
此函数获取所提供引脚的中断状态、并使用所提供的中断对其进行屏蔽
实际启用。 这对于只有已启用中断的状态的内部 ISR 很有用
需要检查。*/
STATUS = MAP_GPIO_getEnabledInterruptStatus (GPIO_PORT_P1);
if (status & GPIO_PIN1){
//右侧电机驱动
//使能(高电平) P1.6->1,2EN;和 P1.7->3,4EN (高电平)
MAP_GPIO_setOutputHighOnPin (GPIO_PORT_P1、GPIO_PIN6);
MAP_GPIO_setOutputHighOnPin (GPIO_PORT_P1、GPIO_PIN7);
//------
MAP_GPIO_setOutputHighOnPin (GPIO_PORT_P2、GPIO_PIN4);
MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P2、GPIO_PIN5);
///--------
//增加 P2.4 (TA0CCR1-->1A)右电机和 P2.7 (TA0CCR4->4A)左电机的占空比
TA0CCR2=0;
TA0CCR3=0;
TA0CCR1=+3300;//33%的10000 (TA0CCR1->1A)右电机
TA0CCR4=+3300;//33%的10000 (TA0CCR1->4A)左侧电机
IF (TA0CCR1>10000 || TA0CCR4>10000){
TA0CCR1 = 0;
TA0CCR4 = 0;

int i;
对于(i = 0;i < 5000;i++){}//延迟循环

COUNTER++;

如果(status & GPIO_PIN4){

//启用(高电平) P1.7->3,4EN
MAP_GPIO_setOutputHighOnPin (GPIO_PORT_P1、GPIO_PIN6);
MAP_GPIO_setOutputHighOnPin (GPIO_PORT_P1、GPIO_PIN7);
//等待引脚被释放(空循环),
while (MAP_GPIO_getInputPinValue (GPIO_PORT_P1、GPIO_PIN4)=GPIO_INPUT_PIN_LOW){}
//进入无限循环轮询,因为它正在从按钮 S2接收输入0
///------------------ 注释掉--应该是高电平
///map_GPIO_setOutputLowOnPin (GPIO_PORT_P1、GPIO_PIN7);
///map_GPIO_setOutputLowOnPin (GPIO_PORT_P1、GPIO_PIN6);//释放后的输入值变为高电平并输出
//设置为低电平。
///------------------
//增加 P2.5 (TA0CCR2-->2A)右电机和 P2.6 (TA0CCR3-->3A)左电机的占空比
TA0CCR1=0;
TA0CCR4=0;
TA0CCR2=+3300;//33%的10000 (TA0CCR2->2A)右电机
TA0CCR3=+3300;//33%的10000 (TA0CCR3->3A)左侧电机
IF (TA0CCR2>10000 || TA0CCR3>10000){
TA0CCR2 = 0;
TA0CCR3 = 0;

int i;
对于(i = 0;i < 5000;i++){}//延迟循环
COUNTER++;

//MAP_Timer_A_clearCaptureCompareInterrupt (TIMER_A0_BASE、TIMER_A_CAPTURECOMPARE 寄存器0);

/*在这里继续 Haile
MAP_Timer_A_clearCaptureCompareInterrupt (TIMER_A0_BASE、
Timer_A_CAPTURECOMPARE 寄存器_0);
*
//h MAP_Timer_A_setCompareValue (TIMER_A0_BASE、TIMER_A_CAPTURECOMPARE 寄存器_1、值);
/*
uint32_t status = MAP_GPIO_getEnabledInterruptStatus (GPIO_PORT_P1);
MAP_GPIO_clearInterruptFlag (GPIO_PORT_P1、状态);

IF (STATUS & GPIO_PIN1)

if (pwmConfig.dutyCycle = 28800)
pwmConfig.dutyCycle = 3200;
其他
pwmConfig.dutyCycle += 3200;

MAP_Timer_A_generatePWM (TIMER_A0_BASE、&pwmConfig);
}*/
//清除端口1中断

MAP_GPIO_clearInterruptFlag (GPIO_PORT_P1、状态);

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

    您好!

    感谢您在论坛上发帖。

    您能否测量输入信号处的电压? 让我们首先检查从 MCU 到驱动器的输入信号是否正确。 如果您有示波器、最好查看每个控制输入信号的电压波形。

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

    您好、Pablo、

    感谢你的答复。 遗憾的是、我没有示波器。 但是、在没有 PWM 和计时器的情况下、电机通过电池正常运行。 我知道这没有什么帮助。 但是、我只想看到我正在使用模块7 RSET_SET 功能在代码本身中进行设置。

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

    >MAP_Timer_A_enableInterrupt (timer_A0_BASE);

    这将启用 TAIE、但我看不到 TA0_N_IRQHandler、因此程序将在 头3.3ms 后转到 Default_Handler。 您似乎不需要此中断、因此我建议您删除此行。

    ----------------------

    //MAP_Timer_A_clearCaptureCompareInterrupt (TIMER_A0_BASE、TIMER_A_CAPTURECOMPARE 寄存器0);

    您已经在 TA0_0_IRQHandler 中注释了此行、但您需要执行此操作、否则中断将持续触发。 我建议您取消注释此行。

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

    Haile、您好!

    如果器件正常工作、则可能意味着代码可能有问题。 如果您有电压表并测量 IN1和 IN2信号处的电压、它将很好地指示 MCU 是否输出正确的 PWM 信号。 如果电压为0V、这将解释驱动器不驱动负载的原因。

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

    您好、Bruce、

    我进行了更改、但仍然无法正常工作。 我听到一些低噪声、高音调的声音、就这样。 是否有任何包含 driverlib 的示例代码可生成 PWM、其中将 RESET_SET 模式设为引脚2.4、2.5、2.6、2.7、从而通过按 Pin1.1和引脚1.4驱动左右电机?

    非常感谢您的帮助。

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

    您好、Pablo、

    感谢这项建议,我将尝试这样做。 但是、从功能角度来看、代码是否正常?

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

    当我运行此代码并按下 P1.1按钮时、我看到 P2.4以大约300Hz (3.3ms 周期)的频率生成 PWM、占空比大约为30%(1ms 高周期)。 如果我按下 P1.4按钮、活动将停止。 反复按 P1.1 (或 P1.4)没有额外的影响。 我在 P2.5-7 (恒定低电平)上看不到任何活动。 您希望看到什么行为?

    您似乎只使用  TIMER_A_CAPTURECOMPARE 寄存器_1调用 MAP_Timer_A_generatePWM ()。 如果要在 P2.5-7上生成 PWM、应使用(每个)  timer_a_CAPTURECOMPARE 寄存器_2、_3和_4再次调用它。 (保持所有呼叫的周期不变、但如果需要、您可以更改每个呼叫的占空比。)

    [编辑:还有

    >TA0CCR1 =+3300;//33%的10000 (TA0CCR1->1A)右电机

    我怀疑您的意思是:

    >TA0CCR1 += 3300;//33%的10000 (TA0CCR1->1A)右电机

    ]

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

    您好、Bruce、

    你是最好的! 我只是在阅读您的信息之前进行了实验、并发现了您所指出的内容。 根据我的代码、尽管略有修改、但 P2.7 (CCR4)&P2.4 (CCR1)反向驱动一个电机、P2.6 (CCR3)& P2.5 (CCR2)反向驱动。 我将根据您关于调用  timer_A_CAPTURECOMPARE 寄存器_2、_3和_4的建议对其进行进一步修改、并将告知您。 但是、以下是我要实现的目标:

    1.按下开关/按钮 P1.1,我希望两个电机在一个方向上驱动(dutycycle=3300);松开后,它应该会停止。 第二次按下、占空比应增加到6600;释放时停止。 按下它第三次占空比/速度增加至100%(100000)并在释放时停止。 第四次按此按钮时、占空比变为零、然后再按此按钮返回到33%(3300)占空比...

    2.按下开关/按钮 P1.4时,两个电机应以相同的方式反向驱动。

    3.在任何时候按 P1.1或 P1.4也应从其关闭的占空比继续。 例如、如果 P1.1在66%(6600)占空比下释放、并在按下 P1.4以驱动后退后返回 P1.1、则再次按下 P1.1时、它应增加到100%(10000)占空比并向前驱动、反之亦然。

    4、目前的连接是:在 SN754410上:(i) P1.6连接到1、2EN;P2.4和 P2.5是 PW 输入连接到右侧电机(改变一个高电平和另一个低电平将改变方向)(ii) P1.7连接到3、4EN; P2.6和 P2.7是连接到左侧电机的 PWM 输入(将一个高&和另一个低电平改变方向)。

    5.我正在尝试使用 PORT1_IRQHandler for ISR 来检测按钮按压操作,而不是轮询。

    =========================== ===================================

    #include

    /*标准包括*/
    #include
    #include

    /*通过在程序开始处填充的"struct"进行计时器 A PWM 配置*/
    /*根据需要定义宏和函数原型*/

    //extern Timer_A_PWMConfig pwmConfig =

    Timer_A_PWMConfig pwmConfig=

    Timer_A_CLOCKSOURCE_SMCLK、
    Timer_A_CLOCKSOURCE_DIVIDER_1、//没有分频器,我们将使用 DCOfreq 3.0MHz-->周期=1/3.0MHz=0.33us
    10000、//our 周期=3.3ms;时钟周期节拍=3.3ms/0.33us=10000时钟周期
    对于 P1.1、为 TA0.4、P2.7->4A->LM (由 P1.4停止)的//TIMER_A_CAPTURECMPARE 寄存器_4、/CCR4位置寄存器
    TA0.3、P2.6-->3A--的 Timer_A_CAPTURECOMPARE 寄存器_3、//CCR3位置寄存器 Rm (由 P1.1停止)在1.4之前
    //timer_A_CAPTURECOMPARE 寄存器_2,TA0.2、P2.5->2A 的/CCR2位置寄存器--- 客户经理(&R)
    //timer_A_CAPTURECOMPARE 寄存器_1、TA0.1、P2.4->1A-->LM 的/CR1位置寄存器
    //timer_A_CAPTURECMPARE 寄存器_0、// CCR0 --是否应删除?
    Timer_A_OUTPUTMODE_RESET_SET、//模块7功能(PWM 信号)
    3300 //将占空比设置为33%;0.33*10000=3300
    };

    //![Simple Timer_A 配置]

    volatile uint32_t counter = 0;

    /* GPIO 和端口初始化函数*/
    void init (){
    MAP_GPIO_setAsInputPinWithPullUp电 阻器(GPIO_PORT_P1、GPIO_PIN1|GPIO_PIN4);//将 S1和 S2设置为输入上拉电阻器
    //对于 Lab4:更容易使用轮询而不是中断来监控 S1和 S2按钮

    /*设置 GPIO 端口1.6:启用 SN754410的1、2EN 四路半高驱动器:右电机作为输出引脚*/
    MAP_GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN6);

    /*设置 GPIO 端口1.6:启用 SN754410的1、2EN:右电机作为输出低电平、由 ISR 打开*/
    MAP_GPIO_setOutputHighOnPin (GPIO_PORT_P1、GPIO_PIN6);

    /*设置 GPIO 端口1.7:启用 SN754410四路半高驱动器的3、4EN:左侧电机作为输出引脚*/
    MAP_GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN7);

    /*设置 GPIO 端口1.7:启用 SN754410的3、4EN:左侧电机作为输出低电平、由 ISR 打开*/
    MAP_GPIO_setOutputHighOnPin (GPIO_PORT_P1、GPIO_PIN7);



    int main (空)

    /*停止看门狗*/
    MAP_WDT_A_HOLDTimer();
    //unsigned int dcoFrequency = 3.0E+6;


    //设置时钟信号
    //map_CS_setDCOFrequency (dcoFrequency);//设置 DCO 时钟源频率
    MAP_CS_setDCOFrequency (3000000);//设置 DCO 时钟源频率
    MAP_CS_initClockSignal (CS_SMCLK、CS_DCOCLK_SELECT、CS_CLOCK_DIVIDER_1);
    //map_CS_initClockSignal (CS_MCLK、CS_REFOCLK_select、CS_clock_divider);//将 SMCLK 连接到 DCO

    init();//调用函数"init":GPIO 和端口初始化
    //作为 PWM 的外设输出
    //MAP_GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P7、GPIO_PIN3、GPIO_PRIMARY_MODULE_Function);/* P7.3为 TA0.0 *
    //设置计时器 A0的输出引脚:TA0.1、TA0.2、TA0.3、TA0.4 -> 1A、2A、3A、4A 的引脚2.4、2.5、2.6和2.7 (SN754410)

    MAP_GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P2、GPIO_PIN4|GPIO_PIN5|GPIO_PIN6| GPIO_PIN7、
    GPIO_PRIMARY_MODULE_FUNCTION);

    //写入 PWM 配置初始占空比33%= 3300、周期为3.3ms
    //map_Timer_a_generatePWM (timer_A0_BASE、&pwmConfig);

    //
    ///------------------
    TA0CCR1=0;
    TA0CCR2=0;
    TA0CCR3=0;
    TA0CCR4=0;

    //中断配置
    //Interrupt_disableMaster ();//禁用中断以进入临界区
    //GPI_interruptEdgeSelect (GPIO_PORT_P1、GPIO_PIN1 |GPIO_PIN4、GPIO_HIGH_TO_LOW_TRANSITION);
    MAP_GPIO_clearInterruptFlag (GPIO_PORT_P1、GPIO_PIN1 |GPIO_PIN4);
    MAP_GPIO_enableInterrupt (GPIO_PORT_P1、GPIO_PIN1 |GPIO_PIN4);
    MAP_Interrupt_enableInterrupt (INT_Port1);
    //MAP_Interrupt_enableInterrupt (INT_TA0_0);
    MAP_Interrupt_enableMaster();
    /*启用 SRAM 组保持*/
    MAP_SYSCTL_enableSRAMBankRetention (SYSCTL_SRAM_BANK1);

    //MAP_Interrupt_enableInterrupt (计时器);
    MAP_Timer_A_generatePWM (TIMER_A0_BASE、&pwmConfig);
    MAP_Timer_A_clearInterruptFlag (timer_A0_BASE);
    //MAP_Timer_A_enableInterrupt (TIMER_A0_BASE);
    MAP_Timer_A_enableCaptureCompareInterrupt (TIMER_A0_BASE、TIMER_A_CAPTURECMOLE_REGISTER_0);

    /*启用主中断*/
    //map_Interrupt_enableMaster ();

    /*不使用时睡眠*/

    while (1)

    MAP_PCM_gotoLPM0 ();//MAP_PCM_gotoLPM3 ();


    /* Port1 ISR -此 ISR 将逐步升高 PWM 的占空比
    *按下按钮
    *

    空 Port1_IRQHandler (空)
    //void TA0_0_IRQHandler (void)

    uint32_t status;
    /*uint_fast16_t GPIO_getEnabledInterruptStatus (uint_fast8_t selectedPort)
    此函数获取所提供引脚的中断状态、并使用所提供的中断对其进行屏蔽
    实际启用。 这对于只有已启用中断的状态的内部 ISR 很有用
    需要检查。*/
    STATUS = MAP_GPIO_getEnabledInterruptStatus (GPIO_PORT_P1);
    if (status & GPIO_PIN1){
    //右侧电机驱动
    //使能(高电平) P1.6->1,2EN;和 P1.7->3,4EN (高电平)
    MAP_GPIO_setOutputHighOnPin (GPIO_PORT_P1、GPIO_PIN6);
    MAP_GPIO_setOutputHighOnPin (GPIO_PORT_P1、GPIO_PIN7);
    //------
    //map_GPIO_setOutputHighOnPin (GPIO_PORT_P2、GPIO_PIN4);
    //map_GPIO_setOutputLowOnPin (GPIO_PORT_P2、GPIO_PIN5);
    ///--------
    //增加 P2.4 (TA0CCR1-->1A)右电机和 P2.7 (TA0CCR4->4A)左电机的占空比
    TA0CCR2=0;
    TA0CCR3=0;
    TA0CCR1+=3300;// 10000的33%(TA0CCR1-->1A)右电机
    TA0CCR4+=3300;//10000 (TA0CCR1->4A)左侧电机的33%
    IF (TA0CCR1>10000 || TA0CCR4>10000){
    TA0CCR1 = 0;
    TA0CCR4 = 0;

    int i;
    对于(i = 0;i < 5000;i++){}//延迟循环

    COUNTER++;

    如果(status & GPIO_PIN4){

    //启用(高电平) P1.7->3,4EN
    MAP_GPIO_setOutputHighOnPin (GPIO_PORT_P1、GPIO_PIN6);
    MAP_GPIO_setOutputHighOnPin (GPIO_PORT_P1、GPIO_PIN7);
    //等待引脚被释放(空循环),
    //while (MAP_GPIO_getInputPinValue (GPIO_PORT_P1、GPIO_PIN4)= GPIO_INPUT_PIN_LOW){}
    //进入无限循环轮询,因为它正在从按钮 S2接收输入0
    ///------------------ 注释掉--应该是高电平
    ///map_GPIO_setOutputLowOnPin (GPIO_PORT_P1、GPIO_PIN7);
    ///map_GPIO_setOutputLowOnPin (GPIO_PORT_P1、GPIO_PIN6);//释放后的输入值变为高电平并输出
    //设置为低电平。
    ///------------------
    //增加 P2.5 (TA0CCR2-->2A)右电机和 P2.6 (TA0CCR3-->3A)左电机的占空比
    TA0CCR1=0;
    TA0CCR4=0;
    TA0CCR2+=3300;// 10000的33%(TA0CCR2->2A)右电机
    TA0CCR3+=3300;//33%的10000 (TA0CCR3->3A)左侧电机
    IF (TA0CCR2>10000 || TA0CCR3>10000){
    TA0CCR2 = 0;
    TA0CCR3 = 0;

    int i;
    对于(i = 0;i < 5000;i++){}//延迟循环
    COUNTER++;

    MAP_Timer_A_clearCaptureCompareInterrupt (TIMER_A0_BASE、TIMER_A_CAPTURECOMPARE 寄存器0);

    /*在这里继续 Haile
    MAP_Timer_A_clearCaptureCompareInterrupt (TIMER_A0_BASE、
    Timer_A_CAPTURECOMPARE 寄存器_0);
    *
    //h MAP_Timer_A_setCompareValue (TIMER_A0_BASE、TIMER_A_CAPTURECOMPARE 寄存器_1、值);
    /*
    uint32_t status = MAP_GPIO_getEnabledInterruptStatus (GPIO_PORT_P1);
    MAP_GPIO_clearInterruptFlag (GPIO_PORT_P1、状态);

    IF (STATUS & GPIO_PIN1)

    if (pwmConfig.dutyCycle = 28800)
    pwmConfig.dutyCycle = 3200;
    其他
    pwmConfig.dutyCycle += 3200;

    MAP_Timer_A_generatePWM (TIMER_A0_BASE、&pwmConfig);
    }*/
    //清除端口1中断

    MAP_GPIO_clearInterruptFlag (GPIO_PORT_P1、状态);

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

    那么、它现在做什么呢? 轮询(使用计时器)不一定是检测按钮按压的一种不良方法、因为它提供了去抖的测量方法。

    未经请求:如果要发布大量代码, 请考虑附加它[插入->文件],而不是粘贴它--或至少使用代码标记[插入->代码]。

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

    您好、Bruce、

    现在、它能够单独驱动每个车轮、但不能同时驱动。 它具有三个方面:低速、中速、高速。 它由开关控制。 这意味着它将单独旋转一个轮子。 我希望两个轮子可以用一个按钮以相同的方向旋转、而用另一个按钮以相反的方向旋转。 有什么建议吗? 非常感谢您的帮助。 我不完全理解您的反馈、但我修改了反馈、因为我尝试理解您的意见。 请参阅下面添加的代码部分。

    在您的注释中:我尝试使用插入文件/代码、但它给了我一个错误、不确定原因:

    访问被拒绝

    您无权访问此服务器上的"">e2e.ti.com/.../configure。

    参考#18.846096b8.1618771216.f14f7c2

    这是我添加到代码***中的四

    //------

    Timer_A_PWMConfig pwmConfig1 =

    Timer_A_CLOCKSOURCE_SMCLK、//将计时器 A 连接到 SMCLK
    Timer_A_CLOCKSOURCE_DIVIDER_1、//无分频器我们将使用 DCOfreq 3.0MHz ->周期=1/3.0MHz =0.33us
    10000、//our 周期=3.3ms;时钟周期节拍=3.3ms/0.33us=10000时钟周期
    Timer_A_CAPTURECOMPARE 寄存器_1、TA0.1、P2.4->1A->LM 的//CCR1位置寄存器
    Timer_A_OUTPUTMODE_RESET_SET、//模块7功能(PWM 信号)
    3300 //将占空比设置为33%;0.33*10000=3300
    };

    Timer_A_PWMConfig pwmConfig2 =

    Timer_A_CLOCKSOURCE_SMCLK、
    Timer_A_CLOCKSOURCE_divider _1、
    10000、
    Timer_A_CAPTURECOMPARE 寄存器_2,TA0.2、P2.5->2A 的//CCR2位置寄存器--- 客户经理(&R)
    Timer_A_OUTPUTMODE_RESET_SET、
    3300
    };
    Timer_A_PWMConfig pwmConfig3 =

    Timer_A_CLOCKSOURCE_SMCLK、
    Timer_A_CLOCKSOURCE_divider _1、
    10000、
    TA0.3、P2.6-->3A--的 Timer_A_CAPTURECOMPARE 寄存器_3、//CCR3位置寄存器 客户经理(&R)
    Timer_A_OUTPUTMODE_RESET_SET、
    3300
    };
    Timer_A_PWMConfig pwmConfig4 =

    Timer_A_CLOCKSOURCE_SMCLK、
    Timer_A_CLOCKSOURCE_divider _1、
    10000、
    Timer_A_CAPTURECOMPARE 寄存器_4、TA0.4、P2.7->4A->LM 的/CCR4位置寄存器
    Timer_A_OUTPUTMODE_RESET_SET、
    3300
    };

    //---- 在下面添加的主代码中--

    //MAP_Interrupt_enableInterrupt (计时器);
    MAP_Timer_A_generatePWM (TIMER_A0_BASE、&pwmConfig1);
    MAP_Timer_A_generatePWM (TIMER_A0_BASE、&pwmConfig2);
    MAP_Timer_A_generatePWM (TIMER_A0_BASE、&pwmConfig3);
    MAP_Timer_A_generatePWM (TIMER_A0_BASE、&pwmConfig4);

    ///----------------
    MAP_Timer_A_clearInterruptFlag (timer_A0_BASE);
    //MAP_Timer_A_enableInterrupt (TIMER_A0_BASE);
    MAP_Timer_A_enableCaptureCompareInterrupt (TIMER_A0_BASE、TIMER_A_CAPTURECMOLE_REGISTER_0);
    MAP_Timer_A_enableCaptureCompareInterrupt (TIMER_A0_BASE、TIMER_A_CAPTURECMOLE_REGISTER_1);
    MAP_Timer_A_enableCaptureCompareInterrupt (TIMER_A0_BASE、TIMER_A_CAPTURECMOLE_REGISTER_2);
    MAP_Timer_A_enableCaptureCompareInterrupt (TIMER_A0_BASE、TIMER_A_CAPTURECMOLE_REGISTER_3);
    MAP_Timer_A_enableCaptureCompareInterrupt (TIMER_A0_BASE、TIMER_A_CAPTURECMOLE_REGISTER_4);

    //---- 在 ISR 末尾添加了以下内容--

    MAP_Timer_A_clearCaptureCompareInterrupt (TIMER_A0_BASE、TIMER_A_CAPTURECOMPARE 寄存器0);
    MAP_Timer_A_clearCaptureCompareInterrupt (TIMER_A0_BASE、TIMER_A_CAPTURECOMPARE 寄存器_1);
    MAP_Timer_A_clearCaptureCompareInterrupt (TIMER_A0_BASE、TIMER_A_CAPTURECOMPARE 寄存器_2);
    MAP_Timer_A_clearCaptureCompareInterrupt (TIMER_A0_BASE、TIMER_A_CAPTURECOMPARE 寄存器_3);
    MAP_Timer_A_clearCaptureCompareInterrupt (TIMER_A0_BASE、TIMER_A_CAPTURECOMPARE 寄存器4);

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

    按下 P1.1按钮可逐步调节 P2.4/7上的 PWM 电平、P2.5/6保持低电平。 在 P2.4/7恒定低电平时、按下 P1.4按钮可逐步达到 P2.5/6上的电平。

    此行为似乎与代码匹配。 如果这没有您想要的物理效果、您可能应该检查您的接线。

    最初(在按下任何按钮之前)所有4个引脚以大约30%的频率运行相同的 PWM 波形。 我不确定电机对它的看法。

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

    您好、Bruce、

    如果4个引脚运行相同的 PWM 波形、则驱动器输出将是相同的值、因此没有电流流过电机。

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

    您好、Bruce、

    没错。 按下按钮后、电机才会运行。 我还可以将每个寄存器设置为零、然后像代码中那样将增量设置为3300:例如、对于一个 pwmconfig 结构:

    Timer_A_PWMConfig pwmConfig2 =

    Timer_A_CLOCKSOURCE_SMCLK、
    Timer_A_CLOCKSOURCE_divider _1、
    10000、
    Timer_A_CAPTURECOMPARE 寄存器_2,TA0.2、P2.5->2A 的//CCR2位置寄存器--- 客户经理(&R)
    Timer_A_OUTPUTMODE_RESET_SET、
    0
    };

    问题是当我按下 P1.1或1.4时、它一次只能运行一个电机、不能一起运行、并且绝对不能反向运行。

    我检查了接线、看起来不错。 当按下 P1.1时、我预期 TA0CCR1 (P2、4) PWM (TA0CCR2=0 (P2.5))和 P2.7 (TA0CCR4) PWM (P2.6)(((TA0CCR3=0)、驱动两个电机前进、当按下 P1.4时则相反。

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

    如果您获得的是预期的 PWM 信号、但它没有预期的(物理)效果、这表明 MCU 外部正在发生什么情况。

    我不是一个电机驱动向导、但这里有一些问题。 如果您发布原理图、可能有人会提出一些建议。

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

    Bruce 和 Pablo 您好:

    它正在工作! 在我进行每种配置后、代码正常。 问题是、由于试验电路板电路上的 SN754410电机驱动器、我需要绕过 TI-RSLK 机箱板的电机驱动器。 感谢所有帮助。 我只需进一步细化代码。 实际上、我使用轮询和 ISR 并按照代码的要求执行了这项操作。