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.

[参考译文] MSP430F5438A-EP:ADC12定时器触发

Guru**** 2538950 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1184596/msp430f5438a-ep-adc12-timer-trigger

器件型号:MSP430F5438A-EP

您好! 每个人。

我想使用计时器 B 来触发 ADC12  

我的计划是计时器 B 大约每0.1秒触发一次 ADC12。  

我配置了计时器 B 和 ADC12。 但它不起作用。 我在哪里找不到?

我了解 ADC12CTL1中的 I SHS 是否为'10'(定时器 B)、  ADC12每0.1秒工作一次。

我明白了吗?

我的代码仅在 执行第一个转换时起作用、然后不起作用。

这是我的文本下的代码。

定时器 B =上行模式、ACLK、输出=齿形   ADC12 = A0、单通道单次转换、Vref = 2.5V

ACLK = 32、768Hz    

TB0CCR0 = 3275;  
TB0CTL |= TIMER_B_MC_UP + TIMER_B_TBSSEL_ACLK;
TB0CCTL0 = TIMER_B_CCIE+TIMER_B_OUTMOD_4;
TB0CTL |= TIMER_B_TBCLR;

P6SEL |= BIT0;
REFCTL0|= REFON + REFMSTR + REFVSEL_2 + REFTCOFF;

ADC12CTL0 |= ADC12ON + ADC12SHT0_2;
ADC12CTL1 |= ADC12SHS_2 + ADC12SHP;
ADC12MCTL0 |= ADC12SREF_1;
ADC12IE |= ADC12IE0;
ADC12CTL0 |= ADC12SHS_2 + ADC12ENC;

// temp variable = Global variable
#pragma vector = ADC12_VECTOR
__interrupt void ADC12_A_ISR(void)
{
	static int i =0;
    switch(_even_in_range(ADC12IV, 0x24))
		{
			case 0x06:
			    if(i==10) i = 0;
			    temp[i++] = ADC12MEM0;
				break;
			default:
				break;
		}
}

未使用 ADC12SC。 因为它不精确。

任何人都能帮助我~!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    当使用 SH>0时、您需要在每次转换后切换 ADC12ENC (=0、然后=1)以获得下一个触发[参考用户指南(SLAU208Q) 第28.2.7.1]节。 ADC ISR 通常是执行此操作的好地方。

    ----------

    未经请求:

    > TB0CCTL0 = TIMER_B_CCIE+TIMER_B_OUTMOD_4;

    这会启用 CCR0中断、但我看不到它的 ISR (TIMER0_B0_VECTOR)。 如果您对计时器中断不感兴趣、 请尝试:

    > TB0CCTL0 = Timer_B_OUTMOD_4;

    OUTMOD=4 (切换)输出以一半的计时器周期速率运行、因此我希望每0.2秒触发一次 您可能需要设置 TB0CCR0=3275/2。

    --------

    >ADC12CTL0 |= ADC12SHS_2 + ADC12ENC;

    SHS 字段位于 CTL1中、而不是 CTL0中。 这实际上是将 SHT0设置为较大的值。 请尝试:

    >ADC12CTL0 |= ADC12ENC;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回答。

    我在听取您的建议后更正了错误的部分。

     1.引号(SLAU208Q 28.2.7.1]:'当使用任何其它触发源时、ADC12ENC 必须在每次转换之间切换"

    我没 能说这句话。  

    =>在 ADC12ISR 中、我修改了 ADC12ENC 被切换。

    #pragma vector = ADC12_VECTOR
    __interrupt void ADC12_ISR(void)
    {
    	static int i =0;
        switch(_even_in_range(ADC12IV, 0x24))
    		{
    			case 0x06:
    			    if(i==10) {i = 0;}
    				while(ADC12CTL1 & ADC12BUSY);
    			    adc12v.temp[i++] = ADC12MEM0;
    				break;
    			default:
    				break;
    		}
    	ADC12CTL0 &= ~(ADC12ENC);
    	ADC12CTL0 |= ADC12ENC;
    }

    2.定时器中断

    => 在这个问题中、我没有编写时间 ISR。 但在我的代码中、它是在时间 ISR 中。  

    #pragma vector = TIMER0_B0_VECTOR
    __interrupt void TIMER0_B0_ISR(void)
    {
    	P7OUT ^= BIT7; // LED 
    }

    输出0.1秒

    =>我修改 了 TB0CCR0 = 1638-1;

     ADC12CTL0 |= ADC12SHS_2 + ADC12ENC

    =>我修改 了 ADC12CTL0 |= ADC12ENC。

    因此、ADC 正在工作。