ADS7824调试时,ADC没有接电压源时,读取值为0x3437,计算值-0.32V,接电压3.3V时,读取值也大约-1.6V,
有没有调试过ADS7824的,原看看驱动和电路有没有问题?
- #include "ADS7824.h"
- #include "system.h"
- #include "altera_avalon_pio_regs.h"
- #include <stdlib.h>
- #include <unistd.h>
- #define BYTE_H() IOWR_ALTERA_AVALON_PIO_DATA(ADC_BYTE_BASE , 1 );
- #define BYTE_L() IOWR_ALTERA_AVALON_PIO_DATA(ADC_BYTE_BASE , 0 );
- #define CONTC_H() IOWR_ALTERA_AVALON_PIO_DATA(ADC_CONTC_BASE , 1 );
- #define CONTC_L() IOWR_ALTERA_AVALON_PIO_DATA(ADC_CONTC_BASE , 0 );
- #define CS_H() IOWR_ALTERA_AVALON_PIO_DATA(ADC_CS_BASE , 1 );
- #define CS_L() IOWR_ALTERA_AVALON_PIO_DATA(ADC_CS_BASE , 0 );
- #define RC_H() IOWR_ALTERA_AVALON_PIO_DATA(ADC_RC_BASE , 1 );
- #define RC_L() IOWR_ALTERA_AVALON_PIO_DATA(ADC_RC_BASE , 0 );
- #define BUSY() (IORD_ALTERA_AVALON_PIO_DATA(ADC_BUSY_BASE))
- int ADS7824_Init(void)
- {
- RC_H()
- CS_H()
- IOWR_ALTERA_AVALON_PIO_DATA(ADC_CONTC_BASE , 0 );
- return 0;
- }
- unsigned char ADS7824_Read8Bit(void)
- {
- unsigned char ADC_Value = 0;
- unsigned int bit0 = IORD_ALTERA_AVALON_PIO_DATA(ADC_D0_BASE);
- unsigned int bit1 = IORD_ALTERA_AVALON_PIO_DATA(ADC_D1_BASE);
- unsigned int bit2 = IORD_ALTERA_AVALON_PIO_DATA(ADC_D2_BASE);
- unsigned int bit3 = IORD_ALTERA_AVALON_PIO_DATA(ADC_D3_BASE);
- unsigned int bit4 = IORD_ALTERA_AVALON_PIO_DATA(ADC_D4_BASE);
- unsigned int bit5 = IORD_ALTERA_AVALON_PIO_DATA(ADC_D5_BASE);
- unsigned int bit6 = IORD_ALTERA_AVALON_PIO_DATA(ADC_D6_BASE);
- unsigned int bit7 = IORD_ALTERA_AVALON_PIO_DATA(ADC_D7_BASE);
- ADC_Value = (bit7 << 7)|(bit6 << 6)|(bit5 << 5)|(bit4 << 4)|(bit3 << 3)|(bit2 << 2)|(bit1 << 1)| (bit0 << 0);
- //printf("ADC_Value=0x%X\n",ADC_Value);
- return ADC_Value;
- }
- int ADS7824_Select_Channel(int channel )
- {
- // Channel Address. Input if CONTC LOW, output if CONTC HIGH. See Table I.
- IOWR_ALTERA_AVALON_PIO_DATA(ADC_CONTC_BASE , 0 );
- switch(channel )
- {
- case 0:
- IOWR_ALTERA_AVALON_PIO_DATA(ADC_A1_BASE , 0 );
- IOWR_ALTERA_AVALON_PIO_DATA(ADC_A0_BASE , 0 );
- break;
- case 1:
- IOWR_ALTERA_AVALON_PIO_DATA(ADC_A1_BASE , 0 );
- IOWR_ALTERA_AVALON_PIO_DATA(ADC_A0_BASE , 1 );
- break;
- case 2:
- IOWR_ALTERA_AVALON_PIO_DATA(ADC_A1_BASE , 1 );
- IOWR_ALTERA_AVALON_PIO_DATA(ADC_A0_BASE , 0 );
- break;
- case 3:
- IOWR_ALTERA_AVALON_PIO_DATA(ADC_A1_BASE , 1 );
- IOWR_ALTERA_AVALON_PIO_DATA(ADC_A0_BASE , 1 );
- break;
- default:
- return -1;
- break;
- }
- return 0;
- }
- float ADS7824_GetFloatValue(int channel )
- {
- short AdValue = ADS7824_GetValue(channel);
- float Value = 0;
- if ( (AdValue & 0x0800)==0x0800 )
- {
- AdValue = AdValue& 0xF7FF;
- AdValue = (AdValue^0x07FF)+1;
- Value = 0-AdValue* 0.00048;
- }
- else
- {
- Value = AdValue * 0.00048;
- }
- return Value;
- }
- unsigned short ADS7824_GetValue(int channel)
- {
- unsigned short ADC_Data = 0;
- unsigned char ADCDataH,ADCDataL;
- ADS7824_Select_Channel(channel);
- while(BUSY()==0)
- {
- }
- CS_H()
- RC_H()
- usleep(1);
- RC_L()
- CS_L()
- usleep(12);
- while(BUSY()==0)
- {
- }
- CS_H()
- RC_H()
- CS_L()
- usleep(1);
- BYTE_L()
- usleep(1);
- ADCDataH = ADS7824_Read8Bit();
- //printf("ADCDataH=%X\n",ADCDataH);
- CS_H()
- usleep(1);
- CS_L()
- BYTE_H()
- ADCDataL = ADS7824_Read8Bit();
- //printf("ADCDataL=%X\n",ADCDataL);
- ADC_Data = ((unsigned int)ADCDataH << 4) | (( (unsigned int)ADCDataL >>4)&0x0F) ;
- //printf("ADC_Data=%X\n",ADC_Data);
- CS_H()
- usleep(250);
- return ADC_Data;
- }