主题中讨论的其他器件: 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;
}