当器件最初上电时、第一个脉冲始终比所需的设定点长很多。 一旦器件运行并输入、将其引导回主代码的开始、脉冲宽度始终正确。 我只会看到第一个脉冲的启动问题。
//Setup Timer for PWM
TACCR0 = 360 - 1; // Pulse Frequency
TACCR1 = 0; // Pulse Width - 0 is OFF ?
TACCTL1 = OUTMOD_2; // TA0CCR2 toggle mode
TACCTL2 = OUTMOD_6; // TA0CCR2 toggle mode
TA0CTL = TASSEL_2 + MC_0; // SMCLK, up/down mode
TACCR2 = (TACCR0 - TACCR1); // Set Hi/Lo Pulse Equal
//function called to start PWM output
volatile int Test_Volt(volatile int m)
{
volatile int i = 0;
TACCR1 = 25; // Set width value
TA0CTL = TASSEL_2 + MC_3; // Start
TACCR2 = (TACCR0 - TACCR1);
for (i=0;i<10;) // Code to loop
{
while ((TACTL & CCIFG) == 1)
{i++;
break;
}
}
TACCR1 = 0;
TACCR2 = (TACCR0 - TACCR1);
TA0CTL = TASSEL_2 + MC_0; // Stop pulses for test
TA0CTL = TASSEL_2 + MC_3;
for (i=0;i<60;) // Code to loop
{
while ((TACTL & CCIFG) == 1)
{i++;
break;
}
}
ADC10CTL1 |= INCH_1; //Select Analog Input
ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start
__bis_SR_register(CPUOFF + GIE);
if (ADC10MEM < 512)
{
P1OUT &= ~BIT0; // Turn off 1 LED
P1OUT |=BIT1; // Turn on 2 LED
ADC10CTL0 &= ~ENC; // Stop ADC
ADC10CTL1 &= ~ INCH_15; // Clear ADC Pin Select
m = 1;
return m;
}
else{
P1OUT |= BIT0; // Turn on 1 LED
ADC10CTL0 &= ~ENC; // Stop ADC
ADC10CTL1 &= ~ INCH_15;} // Clear ADC Pin Select
m = 0;
return m;
}
