求助:PB0/PWM2和PB1/PWM3管脚产生一对带死区延时的PWM方波
下面为代码:
#include "hw_memmap.h"
#include "hw_types.h"
#include "sysctl.h"
#include "gpio.h"
#include "pwm.h"
#include "systemInit.h"
#define PB0_PWM2 GPIO_PIN_0
#define PB1_PWM3 GPIO_PIN_1
#define KEY_PERIPH SYSCTL_PERIPH_GPIOD
#define KEY_PORT GPIO_PORTD_BASE
#define KEY0 GPIO_PIN_0
#define KEY1 GPIO_PIN_1
#define KEY2 GPIO_PIN_2
#define KEY3 GPIO_PIN_3
unsigned i=100;
unsigned m=0;
unsigned n=0;
int main (void)
{
jtagWait(); // 防止JTAG失效,重要!
clockInit();
SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_6MHZ);
/* 配置6MHz外部晶振作为主时钟 */
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); /* 使能PWM2和PWM3输出所在GPIO */
SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM); /* 使能PWM模块 */
SysCtlPWMClockSet(SYSCTL_PWMDIV_1); /* PWM时钟配置:不分频 */
GPIOPinTypePWM(GPIO_PORTB_BASE, /* PB0和PB1配置为PWM功能 */
GPIO_PIN_0 | GPIO_PIN_1);
PWMGenConfigure(PWM_BASE, PWM_GEN_1, /* 配置PWM发生器1:加减计数 */
PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC);
PWMGenPeriodSet(PWM_BASE, PWM_GEN_1, 1000); /* 设置PWM发生器1的周期 */
PWMPulseWidthSet(PWM_BASE, PWM_OUT_2, 5*i); /* 设置PWM2输出的脉冲宽度 */
PWMDeadBandEnable(PWM_BASE, /* 使能PWM死区,并设置死区延时 */
PWM_GEN_1,
45, /* 设置上升沿延时(7.5μs) */
60); /* 设置下降沿延时(10μs) */
PWMOutputState(PWM_BASE, /* 使能PWM2和PWM3的输出 */
PWM_OUT_2_BIT | PWM_OUT_3_BIT,
true);
SysCtlPeriEnable(KEY_PERIPH); // 使能KEY所在的GPIO端口
GPIOIntTypeSet(KEY_PORT, KEY0|KEY1|KEY2|KEY3, GPIO_LOW_LEVEL); // 设置KEY管脚的中断类型
GPIODirModeSet(KEY_PORT,KEY0|KEY1|KEY2|KEY3,GPIO_DIR_MODE_IN);
GPIOPadConfigSet(KEY_PORT,KEY0|KEY1|KEY2|KEY3,GPIO_STRENGTH_8MA,GPIO_PIN_TYPE_STD_WPU);
GPIOPinIntEnable(KEY_PORT, KEY0|KEY1|KEY2|KEY3); // 使能KEY所在管脚的中断
IntEnable(INT_GPIOD); // 使能GPIOD端口中断
IntMasterEnable(); // 使能处理器中断
PWMGenEnable(PWM_BASE, PWM_GEN_1); /* 使能PWM发生器1*/
/* 开始产生PWM方波 */
while(1);
}
// GPIOD的中断服务函数
void GPIO_Port_D_ISR(void)
{
unsigned long ulStatus;
ulStatus = GPIOPinIntStatus(KEY_PORT, true); // 读取中断状态
GPIOPinIntClear(KEY_PORT, ulStatus); // 清除中断状态,重要
if (ulStatus & (KEY0 | KEY1 | KEY2 | KEY3)) // 如果KEY的中断状态有效
{
if(ulStatus == KEY0)
{
i=200-i;
n++;
}
if(ulStatus == KEY1)
{
if(n%2==0)
{
if(i<160)
{
i++;
PWMOutputState(PWM_BASE, /* 使能PWM2和PWM3的输出 */
PWM_OUT_3_BIT|PWM_OUT_2_BIT,
true);
}
else if(i>=160)
{
PWMOutputState(PWM_BASE, /* 使能PWM2和PWM3的输出 */
PWM_OUT_3_BIT,
false);
PWMPulseWidthSet(PWM_BASE, PWM_OUT_2, 900); /* 设置PWM2输出的脉冲宽度 */
}
}
if(n%2==1)
{
if(i>40)
{
i--;
PWMOutputState(PWM_BASE, /* 使能PWM2和PWM3的输出 */
PWM_OUT_3_BIT|PWM_OUT_2_BIT,
true);
}
else if(i<=40)
{
PWMOutputState(PWM_BASE, /* 使能PWM2和PWM3的输出 */
PWM_OUT_3_BIT,
false);
PWMPulseWidthSet(PWM_BASE, PWM_OUT_2, 100); /* 设置PWM2输出的脉冲宽度 */
}
}
}
if(ulStatus == KEY2)
{
if(n%2==1)
{
if(i<160)
{
i++;
PWMOutputState(PWM_BASE, /* 使能PWM2和PWM3的输出 */
PWM_OUT_3_BIT|PWM_OUT_2_BIT,
true);
}
else if(i>=160)
{
PWMOutputState(PWM_BASE, /* 使能PWM2和PWM3的输出 */
PWM_OUT_3_BIT,
false);
PWMPulseWidthSet(PWM_BASE, PWM_OUT_2, 900); /* 设置PWM2输出的脉冲宽度 */
}
}
if(n%2==0)
{
if(i>40)
{
i--;
PWMOutputState(PWM_BASE, /* 使能PWM2和PWM3的输出 */
PWM_OUT_3_BIT|PWM_OUT_2_BIT,
true);
}
else if(i<=40)
{
PWMOutputState(PWM_BASE, /* 使能PWM2和PWM3的输出 */
PWM_OUT_3_BIT,
false);
PWMPulseWidthSet(PWM_BASE, PWM_OUT_2, 100); /* 设置PWM2输出的脉冲宽度 */
}
}
}
if(ulStatus == KEY3)
{
m++;
if(m%2 == 1)
PWMOutputState(PWM_BASE, /* 使能PWM2和PWM3的输出 */
PWM_OUT_2_BIT | PWM_OUT_3_BIT,
false);
if(m%2 == 0)
PWMOutputState(PWM_BASE, /* 使能PWM2和PWM3的输出 */
PWM_OUT_2_BIT | PWM_OUT_3_BIT,
true);
}
SysCtlDelay(10 * (TheSysClock / 3000)); // 延时约10ms,消除按键抖动
while (GPIOPinRead(KEY_PORT, ulStatus) == 0x00); // 等待KEY抬起
SysCtlDelay(10 * (TheSysClock / 3000)); // 延时约10ms,消除松键抖动
}
PWMPulseWidthSet(PWM_BASE, PWM_OUT_2, 5*i); /* 设置PWM2输出的脉冲宽度 */
}
时钟初始化和防止JTAG失效的就略了
我的目标是通过四个按键控制电机
1、反转
2、加速
3、减速(占空比最高可达到95%以上)
4、停止
但是遇到问题了 每次加速加到最大时候电机就反转了
请教各位 给予小弟一些指导