求助: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、停止但是遇到问题了 每次加速加到最大时候电机就反转了请教各位 给予小弟一些指导
此帖出自
小平头技术问答
不知LZ用的光偶隔离将驱动电路与主电路分隔了的吗????
一周热门 更多>