This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

用msp430f1132产生PWM



用TimerA产生PWM时 占空比会偶然的一下变 1。

  • 这种跳变是周期性的还是偶尔的?从两方面考虑,硬件角度检查PWM的外围模块。如果有接其他模块建议检查一下。软件的角度配置PWM这块是否正确。先把你的程序也一并贴出来检查一下。

  • Lawson,

    应该是软件配置的问题,建议你参考一下Ti的code example中的例程。

    或者像Peter_Zheng说的,将程序贴上来

  • 跳变是偶然的来一下。

  • 下面是TimerA的配置

    #include<msp430x11x2.h>

    #include"AD.h"

    void init_PWM(void)

    {

     TACTL=TASSEL_2+TACLR+TAIE;//MCLK,IP模式

     //CCTL0 = CCIE;

     CCR0 = 400;//PWM周期 200-->>40kHZ

     CCTL1 = OUTMOD_6;//CCR1工作在翻转置位模式

     CCR1 = 80;//CCR1PWM占空比

     CCTL2 = OUTMOD_3;//CCR2工作在复位置位模式

     CCR2 = 120;//CCR2PWM占空比

     TACTL|=MC_1;

    }

    #pragma vector=TIMERA1_VECTOR

    __interrupt void Timer_A(void)

    {

     switch( TAIV )

     {

      case 2: break;                   //CCR1不使用

      case 4: break;                   //CCR2不使用

      case 10: CCR1 = D;            //溢出

              ADC10CTL0|=ENC+ADC10SC;

      break;

     }

    }

  •  

    下面是AD10的配置:

    #include<msp430x11x2.h>

    #include"AD.h"

    #define Num_of_results 8

     

     

    extern unsigned int AdcData[5]={0,0,0,0,0};

    extern  unsigned int D=0,D_1=0;

    unsigned int a[2]={0,0};

    unsigned int count=0,slope=0;

    unsigned int dianliu2=0,dianliu1=0;

    int i=0;

    void init_ADC(void)

    {

      ADC10CTL0 &= ~ENC;//停止转换

     

      ADC10CTL0 = ADC10SHT_2+SREF_0+ADC10ON+ADC10IE+MSC;//模拟采集设置

     

      ADC10CTL1=INCH_4+ADC10SSEL_2+CONSEQ_3+SHS_0;//采集通道设置 repeat multi channels

      ADC10AE |= 0X1F;//模拟输入使能

     

      while(ADC10CTL1&BUSY); 

      ADC10DTC1=0x05;

      ADC10DTC0|=ADC10CT;

      ADC10SA=(unsigned int)&AdcData[0];//ADC块的开始地址

     

    }

     

    void Start_ADC10(void)

    {

      ADC10CTL0|=ENC+ADC10SC;

     

    }

    #pragma vector=ADC10_VECTOR

    __interrupt void adc10_ISR(void)

    {

          //ADC10FLAG 自动复位

     

        ADC10CTL0 &= ~ENC ;

     

        D = (AdcData[1]>>2)+70;   //D在TimerA的中断中给CCR1,作为占空比

        if(D>360)

         D=360;

        if(D<70)

         D=70;

     //   CCR1 = D; 

     

      }

     

     

  • 附件里是整个 project。 里面有个 readme  的txt文件的简单说明

    msp430test_3V2.rar
  • 我把程序贴上来了,有劳你看下~

  • 改成如下,测试一下

    Case 10:

    __disable_interrupt();

    CCR1 =D;

      __enable_interrupt();

  • 还是和原来的一样。我的一个想法是:即使在定时器中断中修改,但定时器还在运行的。他运行的时候估计CCR1系统已经确定了,然后我们在中途修改CCR1 会不会就是这样出现的问题?

  • 测试了您timer这部分程序,pwm波正常,没有出现跳变。

    但是我有个问题不太明白,

    CCR0=400,

    case 10: {//CCR1 = D;            //溢出

               TACTL &= ~TAIFG;

               ADC10CTL0|=ENC+ADC10SC;

               break;}

    在40khz里进行adc采样?这样设计的目的是什么。

    目前来看,timer的PWM是不会出现跳变,因为它不受中断影响。如果是规律性跳变倒是需要检查是不是程序溢出引起的复位。然而,您现在出现的偶尔跳变,我觉得可能需要在硬件上检查一下。

  • 你好,你的跳变的问题解决了么?我现在也在做一个项目,与你的问题是一样的。TI的FAE没提出比较合理的建议。

  • 我通过在进行修改TA1CCR2的值之前先将定时器进入 MC_0 STOP模式时,代码如下:

    TA1CTL=MC_0+ID_0+TASELL_1

    TA1CCR2=GETVLAUE();

    TA1CTL=MC_1+ID_0+TASELL_1

    的编写,都没法解决这个问题, 我现在彻底没招了。