查看代码以读取外部adc值

时间:2012-10-01 20:07:10

标签: c embedded avr avr-gcc

我已经开始新使用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值。

提前致谢

1 个答案:

答案 0 :(得分: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次,使其为零,除非编译器自动转发类型。