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.

[参考译文] CCS/MSP432P401R:输出多个 PWM 信号

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/589977/ccs-msp432p401r-outputting-multiple-pwm-signals

器件型号:MSP432P401R

工具/软件:Code Composer Studio

大家好、

因此、在使用 TIMER_A_PWM_MODE 项目修整一段时间后、我成功地以不同的速度驱动无刷电机。

但是、当我尝试对4个不同的引脚执行相同的操作时、只有第一个设置为外设输出的引脚才会实际生成 PWM 信号。

如下面的代码所示(突出显示为黄色)、我已经尝试对计时器 A 配置以及第二天模块使用不同的基址、但这没有产生任何变化。

// DriverLib 包括
#include 

//标准包括
#include 

#include 

// Timer_A PWM 配置参数
Timer_A_PWMConfig pwmConfig0 =
{
Timer_A_CLOCKSOURCE_SMCLK、
Timer_A_CLOCKSOURCE_divider _1、
1280、//此 num/64k =周期 OG 32000
Timer_A_CAPTURECOMPARE 寄存器_1、
Timer_A_OUTPUTMODE_RESET_SET、
64 // 5%或1ms 占空比 OG 3200
};
// Timer_A1 PWM 配置参数
Timer_A_PWMConfig pwmConfig1 =
{
Timer_A_CLOCKSOURCE_SMCLK、
Timer_A_CLOCKSOURCE_divider _1、
1280、//此 num/64k =周期 OG 32000
Timer_A_CAPTURECOMPARE 寄存器_1、
Timer_A_OUTPUTMODE_RESET_SET、
96 // 7.5%或1.5ms 占空比 OG 3200
};

int main (void)
{

//停止看门狗
MAP_WDT_A_HOLDTimer();

//对于 LF 模式、将 MCLK 设置为 REFO 128Khz
//将 SMCLK 设置为64Khz
MAP_CS_setReferenceOscillatorFrequency (CS_REFO_128KHZ);
MAP_CS_initClockSignal (CS_MCLK、CS_REFOCLK_SELECT、CS_CLOCK_DELUGER_1);
MAP_CS_initClockSignal (CS_SMCLK、CS_REFOCLK_SELECT、CS_CLOCK_DEVIDER_2);
MAP_PCM_setPowerState (PCM_AM_LF_VCORE0);

//将 GPIO 2.4配置为 PWM 的外设输出,将 P1.1配置为按钮中断
MAP_GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P2、GPIO_PIN4、GPIO_PRIMARY_MODULE_Function);
MAP_GPIO_setAsInputPinWithPullUpResistor (GPIO_PORT_P1、GPIO_PIN1);
MAP_GPIO_clearInterruptFlag (GPIO_PORT_P1、GPIO_PIN1);
MAP_GPIO_enableInterrupt (GPIO_PORT_P1、GPIO_PIN1);

//将 GPIO 2.7、2.6、5.6配置为 PWM 的外设输出
MAP_GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P2、GPIO_PIN7、GPIO_secondary 模块_function);
// MAP_GPIO_setAssetModuleOutFunctionOutputPin (GPIO_PORT_P2、GPIO_PIN6、GPIO_primary_module_function);
// MAP_PeripheralPUT_PeripheralPin (GPIO_setPin) GPIO_PIN6、GPIO_PRIMARY_MODULE_FUNCTION); 


//将 P1.0设置为输出方向(LED)
MAP_GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN0);

// OG 将 Timer_A 的周期配置为大约500ms、初始占空比为10%(3200个周期)
//将 Timer_A 的周期配置为大约20ms、初始占空比为其5%(64个周期)
MAP_Timer_A_generatePWM (TIMER_A0_BASE、&pwmConfig0);


//
MAP_Timer_A_generatePWM (timer_A1_base、&pwmConfig1); 

//启用中断并启动看门狗计时器
MAP_Interrupt_enableInterrupt (INT_Port1);
MAP_Interrupt_enableSlepOnIsrExit();
MAP_Interrupt_enableMaster();

//不使用时休眠
while (1)
{
MAP_PCM_gotoLPM0 ();
}
}

// Port1 ISR -此 ISR 将在按下 void
Port1_IRQHandler (void)
{时逐步升高 PWM 的占空比
uint32_t status = MAP_GPIO_getEnabledInterruptStatus (GPIO_PORT_P1);
MAP_GPIO_clearInterruptFlag (GPIO_PORT_P1、状态);
int32_t speedChange; //按钮按16更改百分比以增加1.25%,或按0.25ms 32以增加2.5%或0.5ms
IF (STATUS & GPIO_PIN1)
{
if (pwmConfig0.dutyCycle = 128)// 10% cycle at 128、 OG 28800 90%
{
speedChange =-16;
// pwmConfig.dutyCycle += speedChange;
}
if (pwmConfig0.dutyCycle = 64)// 5% cycle、1ms OG 28800 90%
{
speedChange = 16;
// pwmConfig.dutyCycle += speedChange;//增加1.25%或0.25ms 32 (2.5%或0.5ms) OG 3200 10%
}
// pwmConfig.dutyCycle = 64;//重置为5%或1ms 3200 10%
// 其他
pwmConfig0.dutyCycle += speedChange;//增加1.25%或0.25ms 32 (2.5%或0.5ms) OG 3200 10%

MAP_Timer_A_generatePWM (TIMER_A0_BASE、&pwmConfig0);
volatile uint32_t i;

//按钮按 DEBUG
//切换 P1.0输出调试按钮按压
MAP_GPIO_toggleOutputOnPin (GPIO_PORT_P1、GPIO_PIN0);
//延迟
for (i=1000;i>0;i--);
}
}

要使其他3个引脚(以蓝色突出显示)输出各自的独立 PWM 信号、需要满足哪些条件?

谢谢、  

Robert ***

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

    仅供未来参考、但当发布类似这样的代码时、我认为最好将实际文件作为附件包含、因为它更易于阅读。 此外、突出显示功能看起来有点麻烦、只是在我的屏幕上看起来很糟糕、这使它变得有点困难(我可以尝试联系论坛管理人员并告知他们这一点、但现在它显示得不是很好)。

    很抱歉、从好的方面来看、我现在将尝试对其进行分析、看看我能为您找到什么。 如果您看到这种情况、并且可以提供您用作附件的代码、它将对我有所帮助。 但即使你不这样做、也应该足够简单、我可以很快地为你找到答案。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    John、

    如何将.c 文件附加到答复中? 或者、先生、您希望我通过电子邮件将其发送给您吗?
    切勿介意、请参阅下面的回复。

    谢谢、  

    Robert

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

    e2e.ti.com/.../4380.timer_5F00_a_5F00_pwm_5F00_mode.c

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

    您的代码非常接近于正确。  因此、引脚 p2.7不是 TA1所需输出的正确引脚。  数据表 中有一个引脚功能部分、介绍了引脚的主要和次要功能。  例如、您可以将输出引脚更改为引脚 P7.7、您应该会在该引脚上看到所需的 TA1 PWM 输出。  您可以在数据表中搜索相应的引脚、以查找哪些引脚允许 TA2和 TA3。  

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

    John、

    非常感谢您的指导! 我没有实现引脚的特定功能。 我现在就开始工作了!

    奇怪的是、我是否能够仅依靠计时器 A0来运行多个 PWM 信号? 如果是、我将如何访问 TA0.2、TA0.3…… 等等

    对于以后参考电机驱动器的任何人、下面是我在4个单独引脚上驱动4个电机的工作代码。 我没有按下按钮、因此目前只有2个处于活动状态、但代码可能仍然有用。

    e2e.ti.com/.../8561.timer_5F00_a_5F00_pwm_5F00_mode.c

    此致、

    Robert

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

    要回答我自己的问题、"奇怪的是、我是否能够仅依靠计时器 A0来运行多个 PWM 信号? 如果是、我将如何访问 TA0.2、TA0.3…… 等等"

    我可以通过将 TIMER_A_CAPTURECMPARE 寄存器_1更改为 TIMER_A_CAPTURECOMPARE 寄存器_2等来实现这一点...

    下面的代码现在只依赖于 TA1、释放 TA0、TA2和 TA3:

    e2e.ti.com/.../7558.timer_5F00_a_5F00_pwm_5F00_mode.c

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