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.

[参考译文] TM4C123GH6PM:相移 PWM 发生器

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1205089/tm4c123gh6pm-phase-shifted-pwm-generator

器件型号:TM4C123GH6PM

您好!

我有2通道 PWM 发生器。 我需要尝试 在输出上放置180度相移、因此两个输出不是同时为1。 自然、我们应将 PWM 占空比限制为最大50%、以适应两个输出不同时导通的情况。

我可以生成左对齐或中心对齐的 PWM 信号、在该论坛上搜索我提出的主题的先前文章:

#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>

#include "inc/hw_gpio.h"
#include "inc/hw_i2c.h"
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/hw_nvic.h"
#include "driverlib/sw_crc.h"
#include "driverlib/fpu.h"
#include "driverlib/timer.h"
#include "driverlib/gpio.h"
#include "driverlib/i2c.h"
#include "driverlib/interrupt.h"
#include "driverlib/pin_map.h"
#include "driverlib/rom_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
#include "driverlib/pwm.h"
#include "driverlib/eeprom.h"
#include "driverlib/flash.h"
#include "driverlib/systick.h"
#include "driverlib/qei.h"
#include "driverlib/adc.h"
#include "driverlib/uart.h"
#include "driverlib/hibernate.h"
#include "driverlib/ssi.h"




int main(void) {

    MAP_FPUEnable();
    MAP_FPULazyStackingEnable();
    MAP_SysCtlClockSet(SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | SYSCTL_OSC_MAIN);

    MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);


    uint8_t PWM_DIV = 16;
    uint16_t PWM_SCALE = 256;
    MAP_SysCtlPWMClockSet(SYSCTL_PWMDIV_16);

    uint16_t PWM_FRQ = 100;
    uint32_t ui32SysClkFreq = MAP_SysCtlClockGet();

    uint32_t ui32PWMClock = ui32SysClkFreq / PWM_DIV;
    uint32_t ui32Load = (ui32PWMClock / PWM_FRQ) - 1;

    MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM0);

    MAP_GPIOPinConfigure(GPIO_PB6_M0PWM0);
    MAP_GPIOPinConfigure(GPIO_PB7_M0PWM1);

    MAP_GPIOPinTypePWM(GPIO_PORTB_BASE, GPIO_PIN_6);
    MAP_GPIOPinTypePWM(GPIO_PORTB_BASE, GPIO_PIN_7);

    MAP_PWMGenConfigure(PWM0_BASE, PWM_GEN_0,
           (PWM_GEN_MODE_UP_DOWN |
            PWM_GEN_MODE_GEN_SYNC_LOCAL |
            PWM_GEN_MODE_DB_SYNC_LOCAL)
    );

    // MAP_PWMGenConfigure(PWM0_BASE, PWM_GEN_0, PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC);

    MAP_PWMGenPeriodSet(PWM0_BASE, PWM_GEN_0, ui32Load);

    MAP_PWMGenEnable(PWM0_BASE, PWM_GEN_0);
    MAP_PWMOutputState(PWM0_BASE, PWM_OUT_0_BIT | PWM_OUT_1_BIT, true);

    // calculate pulse width
    uint32_t ui32Width = (64 * ui32Load) / PWM_SCALE;

    MAP_PWMSyncTimeBase(PWM0_BASE, PWM_GEN_0_BIT | PWM_GEN_2_BIT | PWM_GEN_3_BIT);
    MAP_PWMSyncUpdate(PWM0_BASE, PWM_GEN_0_BIT | PWM_GEN_2_BIT | PWM_GEN_3_BIT);

    MAP_PWMPulseWidthSet(PWM0_BASE, PWM_OUT_0, ui32Width);
    MAP_PWMPulseWidthSet(PWM0_BASE, PWM_OUT_1, ui32Width * 2);


    while(true) {
        MAP_SysCtlDelay(1000);
    }
}

如何使用微控制器的同步 PWM 功能来生成相移 PWM 信号,每个变化的占空比高达50%?

此致、

C.A.

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

    您好、C.A.

    您的代码设置对我来说有点混乱。

    我们目前的主题是同步 PWM 信号、您所使用的 PWM 同步 API 提供了同步 PWM 信号的能力、但同步是在多个发生器之间进行的。 您的 API 的确调用多个发生器进行同步、但是您的实际 PWM 输出只针对 GEN_0、所以 GEN_2和 GEN_3在这里甚至不使用。

    由于您试图获得180度相移、因此一次只有一个信号为"1"、是否考虑使用 MAP_PWMOutputInvert?

    此致、

    拉尔夫·雅各比

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

    您好、Ralph Jacobi:

    我将仅使用1个 PWM 发生器、但使用2个输出来获取2个独立的 PWM 信号。

    我知道为了同步 PWM、我需要使用2个不同的发生器、对吧?

    是否也可以分别使用连接到两个不同 PWM 发生器的相同引脚 PB6和 PB7? 或者我需要更改硬件吗?

    由于您试图获得180度相移,因此一次只有一个信号为"1",您是否考虑使用 MAP_PWMOutputInvert?

    我并不是要获得180度的相移、我需要两个独立的 PWM 信号、每个信号都是独立的、但仍然不同时开启。

    这种情况还可以吗?

    此致、

    C.A.

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

    您好 C.A.、

    是否也可以分别使用相同的引脚 PB6和 PB7连接到两个不同的 PWM 发生器?

    不、这些引脚连接到 PWM0 Gen 0。

    我并不是要获得180度的相移、我需要两个独立的 PWM 信号、每个信号都是独立的、但仍然不同时开启。

    这种情况还可以吗?

    [/报价]

    如果您希望它们完全独立、则需要使用单独的生成器。 虽然您可以控制单个发生器的单个输出、但相同的周期用于给定发生器的每个信号、因此您受到它的约束、我认为这将使您的特定需要避免它们同时打开、从而变得更加困难。 我认为、单个 PWM 发生器会使您更容易获得所需的功能。

    此致、

    拉尔夫·雅各比