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.

[参考译文] MSP430FR6047:使用 MSP430FR6047测量 ADC 电池电压

Guru**** 2382960 points
Other Parts Discussed in Thread: MSP430FR6047, TPS62740
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1318992/msp430fr6047-adc-battery-voltage-measuring-using-msp430fr6047

器件型号:MSP430FR6047
主题中讨论的其他器件: TPS62740

我正在尝试使用 MSP430FR6047测量电池电压、测量的电压通过 UART 传输。

MSP430由3.6V 电池电源供电、3.3V 稳压至 MSP430、当电池低至3V 时、我无法测量电池电压

我已在下面附上我的 ADC 代码

#包含
//定义一个常量来启用 I/O 引脚
#define ENABLE_PINS 0xFFFE

//函数原型
void uart_init (void);
void uart_sendData (char data);
悬空 ADC_Read (void);


int main (void){
//停止看门狗计时器
WDTCTL = WDTPW | WDTHOLD;

//启用 I/O 引脚
PM5CTL0 = ENABLE_PINS;

//解锁 I/O 引脚
PM5CTL0 &=~μ A LOCKLPM5;
// setLogic0OnP2_2 ();
//初始化 UART 模块
uart_init();

//启用全局中断
__enable_interrupt ();

//将基准电压设置为3.3V
// setReferenceVoltage();
浮点 adcValue;

//连续循环
while (1){
//从 P2.2读取 ADC 值
adcValue = adc_read ();
//在此处应用校准(调整偏移和比例因子)
// adcValue =(adcValue -偏移量)* scaling_factor;

//将 ADC 值作为字符串发送
char adc_str[5];//存储一个4位 ADC 值
int adc_int =(int) adcValue;
adc_str[0]=(adc_int / 1000)+'0';
adc_str[1]=((adc_int / 100)% 10)+'0';
adc_str[2]=((adc_int / 10)% 10)+'0';
adc_str[3]=(adc_int % 10)+'0';
adc_str[4]='\0';
//发送换行符
uart_sendData ('\n');

INT I;
for (i = 0;adc_str[i ]!='\0';i++){
uart_sendData (adc_str[i]);

//使用 ADC 值和基准电压(3.3V)计算电压
浮点基准电压= 3.3;//替换为基准电压
浮点电压=(adcValue * referenceVoltage)/ 4095.0;

//在不使用 snprintf 的情况下将"电压"转换为字符串
char number_str[10];//存储浮点值
Int Entity Part =(int)电压;
int decimalPart =(int)((voltage - integrPart)* 1000);//小数位数

//使用前导零格式化整个部分
if (EntityPart <10){
number_str[0]='0';
number_str[1]='0'+全零件;
}否则,如果(整件<100){
number_str[0]='0'+整体部分/10;
number_str[1]='0'+全部分% 10;
}其他{
//如果需要,可以处理较大的值

number_str[2]='.';//作为十进制分隔符的单个点

//设置带前导零的小数部分的格式,而不需要额外的小数点
number_str[3]='0'+ DecimalPart / 100;
number_str[4]='0'+(decimalPart / 10)% 10;
number_str[5]='0'+ DecimalPart % 10;
number_str[6]='\r\n;//添加回车字符
number_str[7]='\n';//添加换行符
number_str[8]='\0';// Null-终止字符串

//通过 UART 发送电压
for (i = 0;number_str[i ]!='\0';i++){
uart_sendData (number_str[i]);

//控制传输速率的延迟(可选)
__delay_cycles (1000000);

//用于初始化 UART 的函数
void uart_init (void){
//配置 UART 引脚(P8.2和 P8.3)
P8SEL0 |= BIT2 | BIT3;
P8SEL1 &=~(BIT2 | BIT3);

//将 UART 模块置于复位状态
UCA3CTLW0 |= UCSWRST;

//选择 SMCLK 作为时钟源
UCA3CTLW0 |= UCSSEL__SMCLK;

//波特率设置为9600波特
UCA3BR0 = 104;
UCA3BR1=0;
UCA3MCTLW = 0x20;// UCBRSx = 0、UCBRFx = 2

//初始化 UART 模块
UCA3CTLW0 &=~μ H UCSWRST;

//通过 UART 发送字符的函数
void uart_sendData (char data){
while (! (UCA3IFG & UCTXIFG));//等待 TX 缓冲区准备就绪
UCA3TXBUF =数据;

//从 P2.2读取 ADC 的函数
悬空 ADC_Read (void)
{
//配置用于模拟输入的 ADC 输入引脚(P2.2)
P2SEL1 |= BIT2;
P2SEL0 |= BIT2;

//禁用 ADC 以对其进行配置
ADC12CTL0 &=~ADC12ENC;
ADC12MCTL1 = ADC12VRSEL_4;
//设置单次转换的 ADC 控制寄存器
ADC12CTL0 = ADC12SHT0_4 | ADC12ON;// 16个采样保持时间周期,ADC 开启
ADC12CTL1 = ADC12SHP;//使用采样计时器、单通道、单转换
ADC12CTL2 |= ADC12RES_2;
//配置 ADC 输入通道
ADC12MCTL0 = ADC12INCH_14;//选择 A2作为输入通道(P2.2)


//启用 ADC
ADC12CTL0 |= ADC12ENC | ADC12SC ;
//开始转换并等待它完成
while (ADC12CTL1和 ADC12BUSY);
__ delay_cycles (1000);
// float adcValue =(float) ADC12MEM0;
//返回 ADC 结果
返回 ADC12MEM0;

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

    尊敬的 Aravind:

    您是说一旦电压降至3V 以下、您就能够正确读取电压吗? 我不清楚问题是什么。 您能否详细说明问题是什么、您看到的问题以及您为实现此目标而采取的步骤?

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

    您好,Dylan Oberin

    MSP430FR6047由电池供电

    当电池3.3V 与 MSP430连接时、我可以读取 ADC 电压3.3V

    当电池电压降至3V 时、我无法使用 MSP430 ADC 读取3V 电池电压

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

    "你说什么? 在3.1V 和3.0V 之间会发生什么情况?

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

    无法读取到低于3.3V 的电压、只能读取3.3V 的电压

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

    ADC 值是否发生变化? 尝试使用外部电位计。

    如果电池电压发生变化、则不能使用3.3V 基准。

    您需要使用1.8V 基准和分压器。

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

    您是否相当确定您的 MCU 仍在运行? 3.0V 可能是稳压器的欠压。

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

    正如 Bruce 提到的、您能否指定您正在使用的稳压器、并且/或确认3.0V 没有欠压? 此外、您能否指定在无法读取时 ADC 读数显示的内容? MCU 肯定在运行吗?

    Keith 还说得很好、如果电池电压发生变化、则不能将其用作电压基准。  

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

    "不能"

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

    我正在使用 TPS62740稳压器。 使用3.6V 电池时、截止电压为2.0V、

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

    如何测量我的基准电压是否在变化  

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

    基准电压需要保持稳定才能发挥作用。 为了获得准确的读数、您需要能够产生稳定/稳定的电压以用作基准。

    快速谷歌搜索得到了这样的一些结果: 你如何在电路中生成一个基准电压? 您可能想要研究一下如何在您的设计中创建基准电压。

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

    您应该能够使用一个外部分压器和 REF_A 的内部1.2基准电压。

    如果您希望最大电压为4V (以便为自己留出一些余量)、则可以将分压器设置为0.3的比率。