注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
missforever的个人空间 https://home.eeworld.com.cn/space-uid-317524.html [收藏] [复制] [分享] [RSS]
日志

lm3s811控制 PWM波的问题

已有 1844 次阅读2011-5-5 10:50

求助: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、停止
但是遇到问题了 每次加速加到最大时候电机就反转了
请教各位 给予小弟一些指导
发表评论 评论 (1 个评论)
回复 wll 2012-5-23 17:21
请问您的问题解决了吗?

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章