TI中文支持网
TI专业的中文技术问题搜集分享网站

用msp430f1132产生PWM

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

Peter_Zheng:

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

Young Hu:

Lawson,

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

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

Lawson lan:

回复 Peter_Zheng:

跳变是偶然的来一下。

Lawson lan:

回复 Young Hu:

下面是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;

 }

}

Lawson lan:

回复 Young Hu:

 

下面是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; 

 

  }

 

 

Lawson lan:

回复 Lawson lan:

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

Lawson lan:

回复 Peter_Zheng:

我把程序贴上来了,有劳你看下~

Hanson He:

回复 Lawson lan:

改成如下,测试一下

Case 10:

__disable_interrupt();

CCR1 =D;

  __enable_interrupt();

Lawson lan:

回复 Hanson He:

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

Peter_Zheng:

回复 Lawson lan:

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

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

CCR0=400,

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

           TACTL &= ~TAIFG;

           ADC10CTL0|=ENC+ADC10SC;

           break;}

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

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

赞(0)
未经允许不得转载:TI中文支持网 » 用msp430f1132产生PWM
分享到: 更多 (0)