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.

[参考译文] MSP430FR5969:我想读取引脚4.2的模拟电压(该电压将介于0-3V 之间)并使用 UART 显示

Guru**** 2457760 points
Other Parts Discussed in Thread: MSP430FR5969

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1445152/msp430fr5969-i-want-to-read-the-analog-voltage-at-pin-4-2-which-will-be-between-0-3v-and-display-it-using-uart

器件型号:MSP430FR5969

工具与软件:

您好、TI 团队:

我想了解一下 MSP430FR5969的 ADC 模块。 我已编写此代码以从 MSP 的引脚4.2中读取电压、并在终端上使用 UART 显示该值。 我没有获得正确的电压读数、因为当我提供3伏电压时、它会产生垃圾值、即使我更改电压、该值也保持不变。

有人能看一下代码、帮我弄清楚为什么会发生这种情况吗?  

代码。

#include


/**
* main.c
*/
void initADC (void);
unsigned int adcValue = 0;
void initADC (void){
//将 P1.2配置为 ADC 输入(A2)
P1SEL0 |=位2;
P1SEL1 |=位2;

//配置 ADC
ADC12CTL0 = ADC12SHT0_2 | ADC12ON;//采样保持时间、打开 ADC
ADC12CTL1 = ADC12SHP;//正在使用采样计时器
ADC12CTL2 = ADC12RES_2;// 12位分辨率

ADC12MCTL0 = ADC12INCH_4;  

ADC12IER0 = 0;//禁用 ADC 中断

__delay_cycles (1000);  
}

void intToStr (int num、char * str){
INT I = 0;
Int isNegative = 0;


如果(num < 0){
IsNegative = 1;
num =-num;
}

//以相反的顺序提取数字并存储
执行{
STR[i++]=(num % 10)+'0';
数字/=10;
} while (数字> 0);

//添加负号(如果适用)
如果(负){
STR[i++]='-';
}
STR[i]="\0";
内部 j;

对于(j = 0;j < i / 2;j++){
char temp = str[j];
str[j]= str[i - j - 1];
STR[i - j - 1]=温度;
}
}

int main (void)

字符缓冲器[10];
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
PM5CTL0 &=~μ H LOCKLPM5;

UCA0CTLW0 |= UCSWRST;

UCA0CTLW0 |= UCSSEL__SMCLK;// CLK = SMCLK
//波特率计算
// 16000000/(16*115200)= 8.6805
//分数部分= 0.6805
//使用系列用户指南中的表24-5
UCA0BR0 = 8;// 16000000/16/9600

UCA0MCTLW |= 0xD600;//0xF700是 UCBRSx = 0xF7


//设置端口
//配置 GPIO
P2SEL1 |= BIT0 | BIT1;// USCI_A0 UART 操作
P2SEL0且=~Ω(BIT0 | BIT1);


PM5CTL0 &=~μ H LOCKLPM5;

UCA0CTLW0 &=~μ s UCSWRST;

UCA0IE |= UCRXIE;
___ enable_interrupt ();

while (1){


UCA0RXBUF ="t";
如果(UCA0RXBUF ="t")

ADC12CTL0 |= ADC12ENC | ADC12SC;//开始采样/转换
while (ADC12CTL1 & ADC12BUSY);//等待转换完成

adcValue = ADC12MEM0;//读取 ADC 值

//将 ADC 值转换为电压
Int voltage =(adcValue * 3.3)/ 4095.0;//假设基准电压为3.3V 且 ADC 为12位

intToStr (电压、缓冲器);

内部 I;

for (i = 0;buffer[i]!='\0';i++)

while (! (UCA0IFG & UCTXIFG));//等待 TX 缓冲区准备就绪
UCA0TXBUF = buffer[i];//发送字符
}
}

__delay_cycles (1000000);  

}

返回0;
}

谢谢!

此致、

Pukhraj Singh

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

    您在要使用哪个 ADC 通道上似乎有点困惑。 您说要使用4.2、但代码将引脚1.2配置为供 ADC 使用。

    此外、ADC12INCH4可以为您提供输入 A4。 引脚1.2为 A2、4.2为 A10。

    此外、还可以使用编辑器的"插入:代码"功能包括代码。 这为代码提供了一个很好的可滚动窗口。 这必须在阅读后才能发布 常见问题解答

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

    谢谢你大卫!
    您还能解释一下如何理解 MSP430的引脚配置、我不仅在这里感到如此困惑、而且在进行引脚选择时也感到困惑、因为每个引脚可执行不同的任务。  

    谢谢!

    此致、

    Pukhraj Singh

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

    每个器件的数据表都包含一节引脚 I/O 图、其中详细说明了如何配置每个引脚。 6.11在这种情况下。

    当然、还需要查看所用特定封装的引脚排列、从而了解哪一个引脚符合您的需求。

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

    此外、我还将  ADC12INCH4更改为 ADC12INCH2、以使用引脚1.2、但我在 ADC 读取时仍获得0V

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

    ADC12MEM0中的这个值是零还是通过串行端口发送的"0"? 如果后者,那么你真的需要重新考虑这一点:

    int voltage = (adcValue * 3.3) / 4095.0; // Assuming 3.3V reference and 12-bit ADC

    还有其他问题。

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

    ADC 会将一些数字(如16)发送到电压公式、然后进行转换、电压输出小于0。 INTEGER 将其保存为0会导致其无法处理浮点类型数据、UART 显示为0。 而 ADC 无法按预期工作。

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

    UCA0RXBUF == 't';
    if (UCA0RXBUF == 't')
    {

    我不知道你为什么这样做,但条件总是失败,因为"UCA0RXBUF =='t';不存储任何东西。 它是一个条件测试,就像在生成 true 或 false 值的 if ()语句中一样。

    因此、启动转换的代码将只工作一次、因为您未根据需要切换 ADC12ENC。