lm3s811控制 PWM波的问题

2019-03-24 12:29发布

求助: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、停止但是遇到问题了 每次加速加到最大时候电机就反转了请教各位 给予小弟一些指导 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
19条回答
shilaike
2019-03-26 01:34
一般的H桥都是用BJT的做,很少用MOSFET做。。前段时间用MOSFET做了H桥驱动4驱的飞卡车,由于功率太高,必须用MOSFET才能满足要求,但在其它方面的性能感觉相当不满意了。。

一周热门 更多>

相关问题

    相关文章