2

我刚开始使用 AVR 微控制器。我正在使用 ATmega32-A 微控制器。我已经连接了一个外部 ADC(AD7798)。我想使用 SPI 通信读取外部 ADC 值。我尝试了很多,但我无法获得 ADC 值。我的项目是我必须使用带有可编程波形发生器的微控制器生成波形。我成功地做到了这一点并将这个信号传递给传感器。我想从 ADC 读取传感器输出。我在下面附上了简单的电路图。我写了这样的代码

// I have initialized PORTB like this

PORTB=0x00;
DDRB=0xBF;

// SPI initialisation
// SPI clock rate fck/16
// SPI master
// SPI MSB first
// SPI CPOL = 1, CPHA = 1

SPCR=0x5D;
PORTB.3 = 1; 

void main (void){

 printf("adc value :%x\n",ReadAd());

}

我在另一个文件中写了所有函数

我已经阅读了数百次数据表,但我仍然能够读取 ADC 值。我很困惑我在做什么错误。我检查了每个引脚,并使用示波器检查了 ADC 输入引脚,我得到 0.6V 输入信号。请帮我解决这个问题。Tommarow 是这个项目的最后期限。请任何人帮助我读取ADC值。

提前致谢

4

1 回答 1

2

我无法查明问题所在,但我注意到以下几点可能会有所帮助:

  • 查看波形发生器芯片对 SDATA 线的作用。当您使用 ADC 时,它必须是高阻抗的,因为它们共享相同的总线 (MOSI)。确保芯片不总是驱动总线,否则您的 ADC 通信将永远无法工作。

  • 片选线上没有上拉电阻,这可能会导致 ADC 在 uC 上电时进入异常状态等。您可能希望使用此信息在端口 3 和 4 上启用内部上拉电阻来自 atmega32 数据表(第 50 页):

“如果在引脚配置为输入引脚时将 PORTxn 写入逻辑 1,则激活上拉 > 电阻”

  • 确保您的 SPI 时钟极性和相位与 ADC 的通信协议匹配,并且 ADC 支持硬件 SPI 的每次 8 位通信

  • 您的 ChipSelectAD 函数有一行可能是不必要的,但也许我只是不知道当该位设置为输出时读取引脚的目的

    "while(PINB.3); //等待片选引脚"

  • 您的 ADC 的引脚接线是否正确?该图未显示电源或参考电压连接。

  • 可能会减慢您的 SPI SCLK 频率,直到您确定一切正常,尽管看起来 ADC 可以处理相当高的输入时钟速度。

  • 确保在 adc 读取发生在 16 位值上时左移...看起来 SPI 读取的 8 位字符结果实际上被移位了 8 次,除非编译器自动向上转换类型,否则将其设为零.

于 2012-10-01T20:56:23.260 回答