您好!
我正在尝试使用 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、状态);
}
