请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号:MSP432P401R 工具/软件:TI-RTOS
您好,我正在尝试使用PWM引脚来控制4个电机。 我正在使用引脚2.4 ,2.5 ,2.6 和2.7 ,因此我编辑了PWM LED示例以使用这些引脚。 我将计时器从TA1更改为TA0,并将应用程序.cfg文件的计时器ID设置为1,2和3,但我仍然收到错误"PWM_0 did not open"。 即使由于该错误而导致系统中止,该功能的执行仍会继续, 电机开始工作,但存在loader_exit。 我遵循了此线程中描述的步骤:
我做了以下更改:
Board.h
...
#define Board_PWM0 MSP_EXP432P401R_PWM_TA0_1 #define Board_PWM1 MSP_EXP432P401R_PWM_TA0_2 #define Board_PWM2 MSP_EXP432P401R_PWM_TA0_3 #define Board_PWM3 MSP_EXP432P401R_PWM_TA0_4
...
MSP_EXP432P401R.h
...
typedef enum MSP_EXP432P401R_PWMName {
MSP_EXP432P401R_PWM_TA0_1 = 0,
MSP_EXP432P401R_PWM_TA0_2,
MSP_EXP432P401R_PWM_TA0_3,
MSP_EXP432P401R_PWM_TA0_4,
MSP_EXP432P401R_PWMCOUNT
} MSP_EXP432P401R_PWMName;
...
MSP_EXP432P401R.c
...
const PWMTimerMSP432_HWAttrsV1 pwmTimerMSP432HWAttrs[MSP_EXP432P401R_PWMCOUNT]={
{
timerBaseAddr = timer_A0_base,
.clockSource = TIME_A_CLOCKSOURCE_SMCLK,
compareRegister = timer_a_CAPTURECOMPare_register_1,
.gpioPort = gPIO_PORT_P2,
.gpioPinIndex = gPIO_PIN4,
.pwmMode = gPI_primary_module_function
},
{
timerBaseAddr = timer_A0_base,
.clockSource = TIME_A_CLOCKSOURCE_SMCLK,
compareRegister = timer_a_CAPTURECOMPare_register_2,
.gpioPort = gPIO_PORT_P2,
.gpioPinIndex = gPIO_PIN5,
.pwmMode = gPI_primary_module_function
},
{
timerBaseAddr = timer_A0_base,
.clockSource = TIME_A_CLOCKSOURCE_SMCLK,
compareRegister = timer_a_CAPTURECOMPare_register_3,
.gpioPort = gPIO_PORT_P2,
.gpioPinIndex = gPIO_PIN6,
.pwmMode = gPI_primary_module_function
},
{
timerBaseAddr = timer_A0_base,
.clockSource = TIME_A_CLOCKSOURCE_SMCLK,
compareRegister = timer_a_CAPTURECOMPare_register_4,
.gpioPort = gPIO_PORT_P2,
.gpioPinIndex = gPIO_PIN7,
.pwmMode = gPI_primary_module_function
}
};
const PWM_Config PWM_config[]={
{
.fxnTablePtr =&PWMTimerMSP432_fxnTable,
.object =&pwmTimerMSP432Objects[0],
.hwAttrs =&pwmTimerMSP432HWAttrs[0]
},
{
.fxnTablePtr =&PWMTimerMSP432_fxnTable,
.object =&pwmTimerMSP432Objects[1],
.hwAttrs =&pwmTimerMSP432HWAttrs[1]
},
{
.fxnTablePtr =&PWMTimerMSP432_fxnTable,
.object =&pwmTimerMSP432Objects[2],
.hwAttrs =&pwmTimerMSP432HWAttrs[2]
},
{
.fxnTablePtr =&PWMTimerMSP432_fxnTable,
.object =&pwmTimerMSP432Objects[3],
.hwAttrs =&pwmTimerMSP432HWAttrs[3]
},
{NULL, NULL, NULL}
;
/*
==== MSP_EXP432P401R_INITPWM =========
*/
void MSP_EXP432P401R_initPWM (void)
{
/*在端口2上使用端口映射获取引脚(2.4 ,2.5 ,2.6 ,2.7)上的计时器输出*/
const uint8_t端口映射[]={
PM_NONE,PM_NONE,PM_NONE,PM_NONE,
PM_TA0CCR1A,PM_TA0CCR2A,PM_TA0CCR3A,PM_TA0CCR4A
};
/*映射捕获将寄存器与端口2进行比较*/
MAP_PMAP_configurePorts((const uint8_t *)端口映射,PMAP_P2MAP,1,
PMAP_禁用_重新配置);
PWM_init();
}...
以下是功能和主要功能:
电机.c...
pwm_handle pwm1;
pwm_handle pwm2;
void init_motors()
{
uINT16_t pwmPeriod = 2万; // T = 20ms
uINT16_t j=1299; //rampa
uINT16_t i=0;
PWM_Params参数1;
PWM_Params参数2;
/*PWM0*/
pwm_params_init(¶ms1);
params1.dutyUnits = PWM_Duty_US;
params1.dutyValue = duty1;
params1.periodUnits = PWM_period_US;
params1.periodValue = pwmPeriod;
pwm1 = pwm_open (Board_PWM1,¶ms1);
IF (pwm1 == NULL){System_abort ("Board_PWM1 Did not open");}
PWM_START (pwm1);
/*PWM1*/
PWM_Params_init (¶ms2);
params2.dutyUnits = PWM_Duty_US;
params2.dutyValue = duty2;
params2.periodUnits = PWM_period_US;
params2.periodValue = pwmPeriod;
pwm2 = pwm_open(Board_PWM2,¶ms2);
IF (pwm2 == NULL){System_abort ("Board_PWM2 did not open");}
PWM_START (pwm2);
同时(duty1 < 1299){
用于(i=0;i<j;i=i+10){
_delay_cycles(1000);
}
duty1++;
二元2++;
pwm_setDuty (pwm1,duty1);
pwm_setDuty (pwm2,duty2);
J=j-1;
}
}
int main(void)
{/*
Call board init functions */
Board_initGeneral ();
Board_initGPIO ();
Board_initPWM();
Board_initI2C();
// Board_initSDSPI();
// Board_initSPI();
// Board_initUART();
// Board_initWatchdog ();
// Board_initWiFi();
init_motors(); //此处是函数
System_flush();
/* Start BIOS */
BIOS_start();
return (0);
}...
谢谢你。
