用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是不会出现跳变,因为它不受中断影响。如果是规律性跳变倒是需要检查是不是程序溢出引起的复位。然而,您现在出现的偶尔跳变,我觉得可能需要在硬件上检查一下。