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.

[参考译文] CCS/MSP430F5438A:ADC12不读取值

Guru**** 2539500 points
Other Parts Discussed in Thread: MSP430F5438A

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/583607/ccs-msp430f5438a-adc12-does-not-read-a-value

部件号:MSP430F5438A

工具/软件:Code Composer Studio

您好,

我正在使用MSP430F5438A,以便通过5个ADC12通道获取5个模拟信号,并将这些值通过UART发送到PC。 主要问题是ADC12无法读取该值。 程序不会进入ADC中断例程,而在去毛刺机的情况下,程序始终处于“同时”(1)状态。

ADC每隔1毫秒通过计时器A0触发一次。 ADCMEMMx寄存器更改其值,但由于未执行例程,因此它永远不会将这些值传递到缓冲区。

有人能帮我吗?

这是我的代码:

/*******************************************************
****** 全局变量***********************
*************** /
#define MAX_SIZE 128 //缓冲区大小
#define index_increment 5 // ADC采集之间的增量

//数据存储在两个缓冲区
unsigned int buffer_1[MAX_SIZE];//缓冲区1
unsigned int buffer_2[MAX_SIZE];//Buffer 2

unsigned int buffer_status=0;//status of buffer 1和2


/***********************************************************************
**************** 配置功能**********************
*************** ///
外设端口初始化
void port_init (void)
{
P1DIR |=0x03;// WFP 1.0 和WFP 1.1 输出
	P3SEL=0x30; //WFP 3.4 --> Tx
				//WFP P6sel=0x80 3.5

	; //WFP 6.7 --> A7

	P7SEL=0xF0; 	//WFP 7.4 --> A12.
				//WFP 7.5 --> A13.
				//WFP 7.6 --> A14.
				//WFP 7.7 --> A15
}//

定时器A初始
化void timer_init (void)
{
	TA0CCR0 = 33-1;							//设置为1ms
	TA0CCR1=0;
	TA0CTL = tassel_1 + MC_1 + TCLR; // aclk,upmode,clear TAR
	TA0CCTL0=OUTMOD_4;
}//



ADC12初始
化无效ADC12_INIT (void)
{//
	ADC12开,S&H 64个周期,多个转换
	ADC12CTL0=ADC12ON+ADC12MSC12_4+ADC12+ADC12A1;

	//ADCASPHE/ADC12SC1=ADC12SC1+SEC12SC21
	
	
ADC12CTL2=ADC12RES_2;//12位分辨率(13个周期)

	ADC12IE = 0x01; //启用中断
	ADC12IE = 0x10; //启用ADC12IFG.4

	ADC12MCTL0 = ADC12INCH_7; //通道= A7
	ADC12MCTL1 = ADC12INCH_12; //通道= A12
	ADC12MCTL2 = ADC12INCH_13; //通道= A13
	ADC12MCTL2 = ADC12INCH_14; //通道= A14
	ADC12MCTL3 = ADC12INCH_15+ADC12EOS; //通道= A15,结束序列

}//



UART初始
化无效UART_INIT (void){/*cambiar

波特率*/
UCA0CTL1 |= UCSWRST; //**将状态机置于复位**
UCA0CTL1 || UCSSEL_2; // SMCLK
UCA0BR0 = 6; // 1MHz 9600 (请参阅用户指南)
UCA0BR1 = 0; // 1MHz 9600
UCA0MCTL = UCBRS_0 + UCBRF_13 + UCOS16;// Modln UCBRSx=0,UCBRFx=0,
//过度采样

UCA0CTL1 &=~UCSWRST; //**初始化USCI状态机**
}/**************************************************************


*********** 用户的功能**********************
*************** /
void UART_TX (无符号int *vector,无符号char大小)
{
while (size !=0)
{
//等待TX缓冲区为新数据做好准备
while (!(UCA0IFG和UCTXIFG));

//将数据推送到TX缓冲区
UCA0TXBUF =*矢量;
//更新变量
大小--;
vector++;
}//

等待直到最后一个字节完全发送
,同时(UCA0STAT & UCBUSY);

}/******************************************************


*********** 主要方案
*************** /

int main (void){
WDTCTL = WDTPW | WDTHOLD;	//停止看门狗计时器
	
//外围设备初始化
port_init();// I/O
timer_init();//计时器
ADC12_init();// ADC
UART_INIT();// UART

ADC12CTL0|=ADC12ENC;

__bis_sr_register (GIE);

同时(1)
{

	ADC12CTL0 |= ADC12SC; //开始转换

	开关(BUFFER_STATUS)
	{
		案例1:
			UART_TX (BUFFER_1,MAX_SIZE);
			中断;

		案例2:
			UART_TX (BUFFER_2,MAX_SIZE);
			中断;

		默认:
			中断;
	}

}}/**********************************************************************



************** 中断***************************
*************** /

//ADC12中断
#IF已定义(__TI_Compiler_version__)||已定义(__IAR_SYSTEMS _ICC__)
#pragma vector=ADC12_vector
__interrupt void ADC12ISR (void)
#Elif已定义(__GNUC__)
void __attribute__(interrupt (ADC12_vector))

)#REF!编译器#12不支持
#endif
{

static unsigned int index=0;

switch(__ench_in_range(ADC12IV,34)){

案例0:中断; //矢量0:无中断
情况2:中断; //矢量2:ADC溢出
情况4:中断; //矢量4:ADC计时溢出
情况6:中断; //向量6:ADC12IFG0
案例8:中断; //矢量8:ADC12IFG1
案例10:中断; //矢量10:ADC12IFG2
案例12:中断; //矢量12:ADC12IFG3
案例14: //矢量14:ADC12IFG4

P1OUT ^= 0x01; //切换WFP 1.0

IF (BUFFER_STATUS!= 1)
{
Buffer_1[index]=ADC12MEM0;//移动A7结果
Buffer_1[index+1]=ADC12MEM1;//移动A12结果
Buffer_1[index+2]=ADC12MEM2;//移动A13结果
Buffer_1[index+3]=ADC12MEM3;//移动A14结果
Buffer_1[index+4]=ADC12MEM4;//移动A15结果

index=index+index_increment;//下一次采集
IF (index>=MAX_SIZE)
{
索引=0; //重新启动时间值
buffer_status=1; //更改状态缓冲
区}
}
否则
{
Buffer_2[index]=ADC12MEM0;//移动A7结果
Buffer_2[index+1]=ADC12MEM1;//移动A12结果
Buffer_2[index+2]=ADC12MEM2;//移动A13结果
Buffer_2[index+3]=ADC12MEM3;//移动A14结果
Buffer_2[index+4]=ADC12MEM4;//移动A15结果

index=index+index_increment;//下一次采集
IF (index>=MAX_SIZE)
{
索引=0; //重新启动时间值
buffer_status=2; //更改状态缓冲
区}
}
中断;

情况16:中断; 						//矢量16:ADC12IFG5
案例18:中断; //矢量18:ADC12IFG6
案例20:中断; //矢量20:ADC12IFG7
案例22:中断; //矢量22:ADC12IFG8
案例24:中断; //矢量24:ADC12IFG9
案例26:中断; //矢量26:ADC12IFG10
案例28:中断; //矢量28:ADC12IFG11
案例30:中断; //矢量30:ADC12IFG12
案例32:中断; //矢量32:ADC12IFG13
案例34:中断; //矢量34:ADC12IFG14
默认:中断;
}

提前感谢!

此致,

米格尔

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

    您的EOS是ADC12MCTL3,而不是ADC12MCTL4 (可能是由于ADC12MCTL2的重复),因此ADC12IE.4无效,因为代码在完成转换序列后设置ADC12IFG.3。

    此致,
    Ryan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好Ryan:
    没错,重复ADC12MCTL2是问题所在。

    另一个问题:
    ADC模式获取5个通道的最佳配置是什么? 单通道单转换,通道序列,重复单通道还是重复通道序列?

    我不太理解它们和ADC12MSC位之间的区别。

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

    由于您使用的是计时器触发器,因此ADC12MSC和ADC12SHP设置的信道序列模式是最佳解决方案。 请参阅用户指南第28.2 章节中的图,并确保在每个序列之间切换ADC12ENC位。

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

    使用此代码时,我在PC中接收到失真信号。 我在ADC引脚中使用50 Hz信号,但我无法在PC中显示相同的信号。
    我认为可能是波特率或发送方式错误。
    如何计算正确的波特率?

    谢谢!

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

    您的波特率设置正确,如《用户指南》的表36-5所示。 您可能希望尝试不要使用过度采样模式来获得更多的宽大处理。 您可以使用逻辑分析仪或示波器验证数据是否正确发送,但我怀疑UART是问题所在。 ADC的源ACLK太慢,无法在下一个计时器触发之前采样和转换5个通道,因此采样速率可能比预期的1毫秒慢得多。 当然,ADC12MSC和ADC12SHP都设置为重复通道序列模式,因此在第一次序列转换后,计时器触发器不会产生太多的影响。 请查看代码示例以及用户指南第28章,并使用ADC12 ISR内的GPIO引脚切换器来确定您的转换速率的实际速度。

    此致,
    Ryan