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/MSP430G2553:ADC无法读取光敏电阻通过UART改变电压的问题?? ADC可能设置不正确

Guru**** 2595770 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/639010/ccs-msp430g2553-issue-with-adc-not-reading-photoresistor-changing-voltages-over-uart-the-adc-might-be-incorrectly-set-up

部件号:MSP430G2553

工具/软件:Code Composer Studio

大家好,TI论坛,如果我提交此问题的方法不符合所有论坛规则,请原谅我,因为这是我在这里的第一篇帖子。 我的ADC引脚出现问题,无法从光敏电阻读取变化的电压(MSP430G2553)。 
目前,我的代码允许我通过UART输出多个ADC值(来自WFP 1.3),在这里,我的PC可以使用一个名为CoolTerm的程序读取这些值。 现在我知道CoolTerm中的打印值不能准确地表示
与"强度"相关的任何内容,因为此代码的大部分来自从内部传感器感测温度的示例程序。 但我的主要问题是,光敏电阻器分别串联到Vcc和GND的电阻器,我无法读取
将这两个组件之间的电线馈入微处理器的WFP 1.3 ADC插针时,电压值的任何变化。 将ADC引脚直接插入Vcc显示打印值没有变化,这意味着ADC完全读取Vcc
时间,即使用光敏电阻和电阻器(10k Ω)制作分压器也是如此。 但将其插入GND会打印强度值0而不是102。 即使在未连接到任何设备的情况下触碰ADC线,也会通过UART显示更改。 所以
一切似乎都正常工作,但是,此代码中必须有一两行的ADC设置不正确,要么就是简单的光敏电阻电路不正确(Vcc --> 10k电阻-->线到ADC引脚-->光敏电阻--> GND)。
关于我的问题在哪里有什么想法? 感谢所有的帮助。

#include "msp430g2553.h"
#include <stdio.h>

未签名的短数据; //从ADC读取的数据

//全局变量
volatile unsigned int latest_adc_result;
volatile unsigned int timer_count =0;
char buffer[32];

void init_led ();
void init_UART ();
void init_timer();
void init_adc();
void start_conversion ();

void main(void)
{
	WDTCTL	= WDTPW + WDTHOLD;	//停止WDT
	BCSCTL1 = CALC1_1MHz;		//基本时钟系统的校准
	DCOCTL	= CALDCO_1MHz;		//初

	始化控制振荡器的校准//初始化外围设备
	_ADC_LAD();INIT_ADC_INIT_TIMER
	
	
	

	//启用中断并将CPU置于睡眠
	_Bis_SR_register(GIE+LPM0_bits);
}//

帮助器功能
void init_LED()
{
	P1DIR = 0x01 + 0x40;
}

void init_UART()
{
	P1SEL = BIT1 + BIT2;//	DROP 1.1 = RXD,DPOSTP1SEBL2 1.2 =
	BIT2; 	// WFP 1.1 = RXD,WFP 1.2 = TXD
	UCA0CTL1 |= UCSSEL_2;	// SMCLK
	UCA0BR0 = 104;			//参见UCA0BR1以上的波特率分配器
	=0;
	UCA0MCTL = UCBRS0;		//调制UCBRSx = 1
	UCA0CTL1 &=~UCSWR1	
	;ST= UCA0MCTL初始化UCBRS0;UI** ST= UCA0ST/ ST0;UCA0 		//启用USI_A0 TX中断
}

void init_timer()
{
	TA0CTL |= TALCLR;//		重置计时器
	TA0CTL = tassel_2		// SMCLK
			+ ID_0			//输入分隔符=1
			+ MC_2;			//连续模式,中断禁用
	TA0CCTL0 = OUTMOD_2		//比较模式
			+ CCIE			/ IFG;中断启用
			
}

void init_ADC()
{
	ADC10CTL1 = inch_3		//对ADC
			的光敏电阻输入+ SHS_0			//使用ADC10SC位触发采样
			+ ADC10DIV_3	//时钟分隔器=4
			+ ADC10SSEL_3	//时钟源= SMCLK
			+ CONSEQ_0;		//单通道,单
				个ADC10DTC1 = 1个传输/每个块
//ADC10AE0 = 0x08; //启用A4模拟输入
	ADC10CTL0 = SREF_1		//参考电压为VSS和Vcc
			+ ADC10SHT_3	// 64 ADC10采样和保持时间时钟(最慢)
			+ REFON			//参考发生器打开
			+ ADC10ON		//打开ADC10
			+ ENC; 			//启用(但尚未启动)转换
}

void start_conversion ()
{
	IF ((ADC10CTL1 & ADC10BUSY)==0){//	如果尚未转换
		P1OUT ^= 0x40;//绿色LED
		ADC10CTL0|= ADC10CTL0;
		ADC10SA =(
	



矢量)&latest_ADC_result;
_

	count // pragma {_TIME0_AVE_0 }_IMER0
	如果(timer_count >1){//default为16表示1秒刷新raet
		timer_count =0;
		start_conversion ();
		IE2 |= UCA0TXIE;}
	


#pragma vector = USCIAB0TX_vector
__interrupt void USCI0TX_ISR(void)
{
	P1OUT |=0x01;//red \led /wed/int_intiteriment
	=					
	0; int_int_intiment; f;/f: intiteriment p(int_int) //将文本输出到PC。包括stdio.h

	while (buffer[i]!='\0'){
		while (!(IFG2 & UCA0TXIFG));	// USI_A0 TX buffer ready?
		UCA0TXBUF = BUFFER[I+];}
	

	P1OUT &=~0x01;//红色LED
	IE2 &=~UCA0TXIFG;
}

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

    SREF=1请求VSS->Vref (1.5V)。 [另见SLAU144J sec 22.3。1]
    如果您的光敏电阻显示>=10K (我怀疑始终如此),则您的ADC报告将显示1023/10=102。 尝试:

    > ADC10CTL0 = SREF_0 //参考电压为VSS和Vcc
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    哇,完美无瑕! 似乎只需将SREF_1更改为SREF_0,就可以使微处理器准确地测量光敏电阻的强度。 我唯一做的硬件更改是将光敏电阻连接到Vcc,将10k电阻连接到GND,这使我的UART在全光下发送强度值几乎为100,在零光下发送强度值几乎为0。 感谢帮助人!