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.
工具/软件: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 ***
John、
如何将.c 文件附加到答复中? 或者、先生、您希望我通过电子邮件将其发送给您吗?
切勿介意、请参阅下面的回复。
谢谢、
Robert
您的代码非常接近于正确。 因此、引脚 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: