打印
[开发工具]

占空比乱跳

[复制链接]
600|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sourceInsight|  楼主 | 2017-3-12 16:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
PWM, se, TI, TE, pi
调一个 死值的占空比 没事 ,我将占空比 100% 慢慢降到 0% 快到 0%时
出现一次 占空比100%的一个脉冲 LED灯闪一下,调光中间不闪.
现在还不知道是我程序的BUG还是这IC本来就有这鸟问题 不能用于调光.
这要命 ,,,

我已经在 PWM 那路中断 中 去更新占空比了,
前面我还试了 在MAIN中更新 和 另一组定时器中更新  结果就是中间不断有闪烁感 有时无.
#include <msp430.h>

typedef unsigned char  u8;
typedef unsigned int   u16;
typedef unsigned long  u32;

typedef signed char    s8;
typedef signed int     s16;
typedef signed long    s32;

#define LED1()                     (P2OUT ^=  BIT0)

#define PWM1_duty_cycle_Val        8000

u16 PWM1_duty_cycle             = 0;
u16 PWM1_duty_cycle_CCR         = 0;

//=============================================================================
void InitSystemClock(void)
{
    BCSCTL1 = CALBC1_8MHZ;
    DCOCTL  = CALDCO_8MHZ;   // DCO 8MHZ

    FCTL2 = FWKEY + FSSEL0 + 0x18;             // MCLK/3 for Flash Timing 8M / 25 320K  //FLASH IN 257-476KHZ

}

//=============================================================================
void Init_IO(void)
{

        P2DIR |=BIT0;                          //P2.0 Output LED


        //P2OUT &= ~BIT1;                           //LOW
        //P2OUT |= BIT1;                            //HIGH

    P2DIR |= BIT1;                            // P2.1 pwm output  详见硬件手册
    P2SEL |= BIT1;                            // P2.1 Pin9 Multiplexing
    //P2DIR |= BIT2;                            // P2.1 pwm output  2.1 2.2只能输出相同波形
    //P2SEL |= BIT2;                            // P2.1 Pin9

    //P2OUT &= ~BIT4;                           //LOW
    P2DIR |= BIT4;                            // P2.4 pwm output
    P2SEL |= BIT4;                            // P2.4 Pin12  Multiplexing
    //P2DIR |= BIT5;                            // P2.4 pwm output  2.4 2.5只能输出相同波形
    //P2SEL |= BIT5;                            // P2.4 Pin12

}

//=============================================================================
void InitPWM(void)
{
/*
        //===========================================================================
        TA0CCR0 = 2550;                          // PWM Period
        TA0CCR1 = 1000;                             // CCR1 PWM duty cycle
        //TA0CCR2 = 800;                             // CCR2 PWM duty cycle 28Pins

        TA0CCTL0 = CCIE;                          // CCR0 interrupt enabled
        //TA0CCTL1 = OUTMOD_7;                      // CCR1 reset/set
        //TA0CCTL2 = OUTMOD_7;                      // CCR2 reset/set   28Pins
        TA0CTL = TASSEL_2 + TACLR + MC_1;            // SMCLK, up mode  定时器_A 控制寄存器
*/
        //===========================================================================
    TA1CCR0 = PWM1_duty_cycle_Val-1;                          // PWM Period 1000us/(1/8MHZ)
    TA1CCR1 = 0;//PWM1_duty_cycle_Val;                        // CCR1 PWM duty cycle 2.1
    TA1CCR2 = 0;//PWM1_duty_cycle_Val;                        // CCR2 PWM duty cycle 2.4

    TA1CCTL0 = CCIE;                          // CCR0 interrupt enabled
    TA1CCTL1 = OUTMOD_7;                      // CCR1 reset/set
    TA1CCTL2 = OUTMOD_7;                      // CCR2 reset/set
    TA1CTL = TASSEL_2 + TACLR + MC_1;         // SMCLK, up mode



}

// Timer1 A0 interrupt service routine
#pragma vector=TIMER1_A0_VECTOR   //TA1 CCR0
__interrupt void Timer1_A0 (void)  //1khz
{
    if (PWM1_duty_cycle_CCR < PWM1_duty_cycle)   //Smooth
    {
            PWM1_duty_cycle_CCR++;
    }
    else if (PWM1_duty_cycle_CCR > PWM1_duty_cycle)
    {
            if (PWM1_duty_cycle_CCR)
            PWM1_duty_cycle_CCR--;
    }

         TA1CCR1 = PWM1_duty_cycle_CCR;
         TA1CCR2 = PWM1_duty_cycle_CCR;


}

//=============================================================================
void DelaymS(unsigned int n)
{
volatile u16 i = 0;
volatile u16 j = 0;

   for (i=n;i>0;i--)
   {
     for (j=680;j>0;j--)
     {
             _NOP();
     }
   }

}

/*
* main.c
*/
int main(void)
{
        int i = 0;

        _DINT();                      // disable_interrupt

    WDTCTL = WDTPW | WDTHOLD;        // Stop watchdog timer
        
    InitSystemClock();

    InitPWM();      //TA1

    Init_IO();

    _EINT() ;                     // enable_interrupt

    while(1)
    {
            LED1();
        if (++i == 1)
        {
                PWM1_duty_cycle = 0;
        }
        else if (i == 2)
        {
                i = 0;
                PWM1_duty_cycle = PWM1_duty_cycle_Val;
        }
        DelaymS(3000);
    }

        //return 0;
}
沙发
feiqi1| | 2017-3-12 16:47 | 只看该作者
代码没看出有什么问题,找时间在板子上验证下。。

使用特权

评论回复
板凳
androidbus| | 2017-3-12 16:50 | 只看该作者
感觉这个应该是设置不对吧!

使用特权

评论回复
地板
litengg| | 2017-3-12 16:52 | 只看该作者
你这个是不是计数弄错了啊!

使用特权

评论回复
5
qiangweii| | 2017-3-12 16:56 | 只看该作者
重新换一块板子的试试的啦

使用特权

评论回复
6
shashaa| | 2017-3-12 16:58 | 只看该作者
这个主要检查下cpu芯片的主时钟工作是否正常不。。

使用特权

评论回复
7
xia00| | 2017-3-12 17:02 | 只看该作者
估计不要设置0% 就好了吧

使用特权

评论回复
8
xia00| | 2017-3-12 17:04 | 只看该作者
我测试 1%-100% PWM一点问题没有 。。

使用特权

评论回复
9
hfdy01| | 2017-3-12 17:07 | 只看该作者
占空比的问题在软件上还是需要好好设置下的。

使用特权

评论回复
10
CallReceiver| | 2017-3-12 17:08 | 只看该作者
这个只是通病了, 都是 0%-99%。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

138

主题

1619

帖子

1

粉丝