工具与软件:
您好、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