您好!
我有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.