打印

占空比乱跳

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

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

相关帖子

沙发
jiaxw| | 2017-1-8 20:33 | 只看该作者
楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
板凳
huangchui|  楼主 | 2017-1-8 20:35 | 只看该作者
我用的是MSP430G2553

//===========================================================================
    TA1CCR0 = Lum100-1;                          // PWM Period 1000us/(1/8MHZ)   这里不减1 高电平还不能到100%
    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
{
         TA1CCR1 = PWM1_duty_cycle;
         TA1CCR2 = PWM1_duty_cycle;
}

使用特权

评论回复
地板
午夜粪车| | 2017-1-8 20:38 | 只看该作者
然后呢?你是怎么应对这个的呢

使用特权

评论回复
5
huangchui|  楼主 | 2017-1-8 20:41 | 只看该作者
#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;
}

使用特权

评论回复
6
zhanghqi| | 2017-1-8 20:43 | 只看该作者
代码没看出有什么问题
找时间我在板子上验证下

使用特权

评论回复
7
wyjie| | 2017-1-8 21:06 | 只看该作者
设置不对吧

使用特权

评论回复
8
dengdc| | 2017-1-8 21:08 | 只看该作者
计数是不是弄错了

使用特权

评论回复
9
jiahy| | 2017-1-8 21:10 | 只看该作者
重新换一块板子的试试的啦

使用特权

评论回复
10
lizye| | 2017-1-8 21:12 | 只看该作者
这个主要检查下cpu芯片的主时钟工作是否正常不

使用特权

评论回复
11
jlyuan| | 2017-1-8 21:15 | 只看该作者
不要设置0% 就好了

使用特权

评论回复
12
huangchui|  楼主 | 2017-1-8 21:18 | 只看该作者
我测试 1%-100% PWM一点问题没有  OK 就这样吧 解决问题  

使用特权

评论回复
13
huangchui|  楼主 | 2017-1-8 21:20 | 只看该作者
反过向   0%-99% OK   他们只是没说 只能这样  刚开始弄走了弯路

使用特权

评论回复
14
lizye| | 2017-1-8 21:22 | 只看该作者
占空比的问题在软件上还是需要好好设置下的

使用特权

评论回复
15
shimx| | 2017-1-8 21:24 | 只看该作者
avr 时代的IC 都一个毛病  更新占空比 要中周期结束的时候更新 才不会出错

使用特权

评论回复
16
spark周| | 2017-1-8 21:26 | 只看该作者
不过通病 都是 0%-99%

使用特权

评论回复
17
huangchui|  楼主 | 2017-1-8 21:31 | 只看该作者
唉,还是没有什么结果,算了,先结贴吧,多谢大家啦

使用特权

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

本版积分规则

918

主题

12323

帖子

4

粉丝