目前寄存器的值还是无法读取,但是已经能够采集数据,改变寄存器配置的值,采集数据也有变化,所以我觉得寄存器的值已经写进去了
我现在用ads247 AIN1=GND,AIN2为模拟信号输入,当AIN2输入为0,也就是接地时采集数据位1A7000(低16位数据一直变化),当输入为1.6V时为7FFFFF,PGA=1,可我要求的范围是0—2.5V,该怎么调增寄存器,我试了好多次值都不行,当为0时采集的数据比1A7000还大,我希望的是当为0时采集为0000000, 2.5V时采集为7FFFFF,
在线坐等答案,各位大侠速速来帮忙哦
Van Yang:
你还是先完成寄存器的正常读写操作,再来调试转化结果
Lion chang:
回复 Van Yang:
我也想先把寄存器的读写操作完成再调试下一步,可现在是我不知道问题出在哪,还望大神帮忙分析下,需要看源代码还是电路图,我发给你
Lion chang:
回复 Van Yang:
我用示波器看了一下时序,根据手册当配置寄存器是ST信号必须拉高,可当我把ST拉高后DRDY自动被拉低,然后每隔一段时间就会有一个正脉冲出来,按道理就算有脉冲也应该是负脉冲啊,不知道是为什么
Lion chang:
回复 Van Yang:
现在寄存器的值读出来了,可是采集的数据一直为00000;DRADY信号一直为低
Lion chang:
回复 Lion chang:
搞定了,可那个增益和偏移调整还不太明白,我现在输入0V时采集数据为9CEEB2,我配置的单端输入,把OFC设置成9CECF5之后可以了,可低12位一直不稳定,不知道我这样设置对不对
Lion chang:
回复 Lion chang:
还有,那个自动增益和偏移校正怎么用啊
Lion chang:
回复 Lion chang:
看来还得靠自己,哈哈
Van Yang:
回复 Lion chang:
我这有个参考代码,你看看。
#include <msp430f5529.h>
long a[512];
unsigned int j;
unsigned char nop=0xff;
unsigned char rdatac=0x14;
int test;
int main(void)
{
volatile unsigned int i;
WDTCTL = WDTPW+WDTHOLD; // Stop watchdog timer
P1IES |= BIT0; //P5.1口作为ADC的DRDY接口,下降沿触发中断
P1IE |= BIT0; //P5.1中断使能
P1IFG &= ~BIT0;
P6DIR |= BIT7; //P1.1 as start signal
P6OUT |= BIT7;
test=0;
for(i=0;i<512;i++)
{
a[i]=0;
}
P4SEL |= BIT4+BIT5+BIT0; // P4.0,4,5 option select
UCA1CTL1 |= UCSWRST; // **Put state machine in reset**
UCA1CTL0 |= UCMST+UCSYNC+UCMSB; // 3-pin, 8-bit SPI master
UCA1CTL1 |= UCSSEL_2; // SMCLK
UCA1BR0 = 0; //
UCA1BR1 = 0; //
UCA1MCTL = 0; // No modulation
UCA1CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
j=0;
for(i=50000;i>0;i–); // Wait for slave to initialize
while (!(UCA1IFG&UCTXIFG));
UCA1TXBUF = 0x42;
while (!(UCA1IFG&UCTXIFG));
UCA1TXBUF = 0x01;
while (!(UCA1IFG&UCTXIFG));
UCA1TXBUF = 0x60; //MUX1
while (!(UCA1IFG&UCTXIFG));
UCA1TXBUF = 0x02; //SYS0
while (!(UCA1IFG&UCTXIFG));
UCA1TXBUF = 0x4A;
while (!(UCA1IFG&UCTXIFG));
UCA1TXBUF = 0x01;
while (!(UCA1IFG&UCTXIFG));
UCA1TXBUF = 0x04; //IDAC0
while (!(UCA1IFG&UCTXIFG));
UCA1TXBUF = 0x23; //IDAC1
while (!(UCA1IFG&UCTXIFG)); // USCI_A0 TX buffer ready?
UCA1TXBUF = rdatac; // Transmit first character
for(i=0;i<100;i++);
while(1)
{
if((P1IN & BIT0)==0)
{
for(i=0;i<3;i++)
{
while (!(UCA1IFG&UCTXIFG)); // USCI_A0 TX buffer ready?
UCA1TXBUF = nop; // Transmit first character
while (!(UCA1IFG&UCRXIFG));
a[j] = a[j]*256+UCA1RXBUF;
}
j++;
if(j>511)
{
j=0;
for(i=0;i<100;i++);
while(1);
for(i=0;i<512;i++)
{
a[i]=0;
}
}
}
}
}
Lion chang:
回复 Van Yang:
关于寄存器部分和数据采集部分的问题应经解决了,就差校正部分,OFC和SFC寄存器的配置,发送自动校正命令得输入最大电压和最小电压,然后系统会自动校正这些寄存器么,那样的话是不是每次都得校正,如果直接配置OFC和SFC是不是就不需要发送自动校正命令了,那这两个寄存器的值是怎么计算出来的
wang ziyuan:
回复 Lion chang:
请问你怎么解决读寄存器读不出来的问题?我现在用stm32,我读任何一个寄存器,发现都是0.写是应该写进去了。真不知道哪里出了问题。读寄存器也要把st拉高。?DRDY我现在直接是接地的