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.

[参考译文] MSP432P401R:在连续模式下使用TimerA0[1]触发ADC14样本

Guru**** 2587345 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/618721/msp432p401r-triggering-an-adc14-sample-using-timera0-1-in-continuous-mode

部件号:MSP432P401R

您好,

我正在开发一个应用程序,我想以给定的速率(22.05 kHz,但这并不重要)对信号进行采样。 我也在对该信号进行处理,所以我想将程序的处理部分包含在计时器中断中,并将采样包含在ADC中断中。 我已按如下所示配置了计时器和ADC14外围设备:

void timer_init(void){/*

	enable interrupts */
	NVIC->ISER[0]|=1<<(TA0_0_IRQn);NVIC->ISER[0]
	|=1<<(TA0_N_IRQn)&31);TIMER

	A0->CCT1]|=
		TIMER ->ISER[0]|=1(AO /NO_ECUTIM/ UN_REG_ICAT_IAT_ECAT_IATE/IE7*REQUIATE_REQUIORIORIATE_REQUIORIOR_IATE_REAL:IATE_REQUITE_IAT存在		
								中断
	
	/ UNSE_I
TIME_A0->CCR[1]= 1000;

/*设置时钟源和模式*/
	TIMER_A0->CTL |=
		TIMER_A_CTL_Ssel__SMCLK |//	SMCLK作为源
		TIMER_A_CTL_ID__8|//			时钟分配器(1,2,4,8)
		TIMER_A_CTL_MC__CONTINUAL |//	连续模式
		TIMER_A_CTL_CL_CLR;				//清除计时器计数

TIME_A0->Ex0 |= TAIDEX__1;//扩展时钟分配器(1,2,3,4,5,6,7,8)
}

void ADC14_init(void){/*
	启用中断*/
	NVIC->ISER[0]|1 <<((ADC14_IRQn)& 31);

	/*配置MIC_OUTPUT以实现MIC_OUTPUT
	~MIC_MIC_MIC_EN=
	
	

	
	~输出;MIC_MIC_PIN_PIN=输出;MIC_SECC_PIN_PIN_OUTPL14=输出MIC_MIC_MIC_PIN/输出=输出=输出;MIC_MIC_MIC_MIC_PIN=输出MIC_MIC_MIC_MIC_PIN=输出;MIC_PIN=输出=输出=输出;MIC_MIC_MIC_MIC_PIN_PIN_PIN=输出=输出输出=输出;MIC_MIC_MIC_MIC_MIC_MIC_
	
	/*配置控制寄存器0 */
	ADC14->CTL0 =
		ADC14_CTL0_SHS_1|//	从0.1 中开始转换ADC14_CTL0_SHP
		|//	脉冲模式
		ADC14_CTL0_SHT0_2 |//	16时钟周期采样时间
		ADC14_CTL0_ON;		//
		
	配置控制寄存器ADC14_ADC14_
	
		
	
	/*选择A10作为源*/
	ADC14->MCTL[0]|= MIC_OUT通道;
	
	/*在A0上的转换完成时启用中断*/
	ADC14->IER0 = ADC14_IER0_IE0;
	
	/*启用转换*/
	ADC14->CTL0 |= ADC14_CTL0_ENC;
} 

下面是我的中断服务例程的一个最小示例

// timer ISR
void TA0_N_IRQHandler(void){
	timer_counter++;
	timer_A0->CCR[1]+= period;
	timer_A0->CCTL[1]&=~CCIFG;
}//

ISR
void ADC14_IRQHandler(void){
	IF(++index >=2万){ index =0;}_ADEM_counter
	=0;}/clean_counter }/ADD+>
	音频标志

当我运行此程序时,计时器的ISR可以很清楚地运行(通过观察内存中timer_counter的值),但ADC ISR似乎运行一次(ADC_counter的值增加一次,然后似乎停止)。

我认为我没有正确掌握如何从计时器触发ADC14转换,以及如何将其与ISR联系起来。 我正在寻找有关如何以不同方式配置或实施此功能的建议。

谢谢!

Thomas

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

    Thomas

      请确保将序列模式设置为重复单通道。

    Chris

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

    设置顺序模式解决了我最初的ADC14无法正常激活的问题,谢谢。

    现在我已经完成了,我遇到了速度问题。 在ADC14_CTL0寄存器中,我选择SMCLK作为我的来源(运行频率为48 MHz),但ADC的采样速率比TimerA慢得多。 我通过查看内存中timer_counter和adc_counter的值观察到这一点,其中timer_counter要大得多,这表明计时器ISR被调用的次数比ADC14 ISR多得多。

    如何加速ADC14以匹配采样率?

    谢谢!
    Thomas
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Thomas
    您正在使用计时器来触发ADC,但它是基于输出而不是ISR。 因此,在您的示例中,设置为outmode 7,在CCR1上重置并在CCR 0上设置。 这意味着输出将保持在重置状态,直到计时器从0xFFFF计数到0。 因此,当您正在重置CCR1的周期时,输出不会改变,也不会触发ADC。

    您可能会发现此示例很有帮助。
    e2e.ti.com/.../202.3396万

    Chris
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢您的帮助! 这是我正在处理的项目的最后一个主要障碍,这一点代码示例帮助我了解计时器输出的工作原理。

    通过将计时器置于设置/重置模式,然后更新计时器中断中的CCR[0]和CCR[1]值,使CCR[0]略大于CCR[1],我获得了我所需的结果。 这使ADC和Timer_A中断完全同步。

    再次感谢,
    Thomas