[求助] ADS7824 软件驱动调试,测量AD值错误

tomsx   2018-12-26 23:39 楼主


ADS7824调试时,ADC没有接电压源时,读取值为0x3437,计算值-0.32V,接电压3.3V时,读取值也大约-1.6V,
有没有调试过ADS7824的,原看看驱动和电路有没有问题?



  1. #include "ADS7824.h"
  2. #include "system.h"
  3. #include "altera_avalon_pio_regs.h"
  4. #include <stdlib.h>
  5. #include <unistd.h>



  6. #define BYTE_H()  IOWR_ALTERA_AVALON_PIO_DATA(ADC_BYTE_BASE , 1 );
  7. #define BYTE_L()  IOWR_ALTERA_AVALON_PIO_DATA(ADC_BYTE_BASE , 0 );

  8. #define CONTC_H()  IOWR_ALTERA_AVALON_PIO_DATA(ADC_CONTC_BASE , 1 );
  9. #define CONTC_L()  IOWR_ALTERA_AVALON_PIO_DATA(ADC_CONTC_BASE , 0 );

  10. #define CS_H()  IOWR_ALTERA_AVALON_PIO_DATA(ADC_CS_BASE , 1 );
  11. #define CS_L()  IOWR_ALTERA_AVALON_PIO_DATA(ADC_CS_BASE , 0 );

  12. #define RC_H()  IOWR_ALTERA_AVALON_PIO_DATA(ADC_RC_BASE , 1 );
  13. #define RC_L()  IOWR_ALTERA_AVALON_PIO_DATA(ADC_RC_BASE , 0 );

  14. #define BUSY() (IORD_ALTERA_AVALON_PIO_DATA(ADC_BUSY_BASE))



  15. int ADS7824_Init(void)
  16. {
  17.         RC_H()
  18.         CS_H()
  19.         IOWR_ALTERA_AVALON_PIO_DATA(ADC_CONTC_BASE , 0 );
  20.         return 0;
  21. }

  22. unsigned char ADS7824_Read8Bit(void)
  23. {
  24.         unsigned char ADC_Value = 0;
  25.         unsigned int bit0 = IORD_ALTERA_AVALON_PIO_DATA(ADC_D0_BASE);
  26.         unsigned int bit1 = IORD_ALTERA_AVALON_PIO_DATA(ADC_D1_BASE);
  27.         unsigned int bit2 = IORD_ALTERA_AVALON_PIO_DATA(ADC_D2_BASE);
  28.         unsigned int bit3 = IORD_ALTERA_AVALON_PIO_DATA(ADC_D3_BASE);
  29.         unsigned int bit4 = IORD_ALTERA_AVALON_PIO_DATA(ADC_D4_BASE);
  30.         unsigned int bit5 = IORD_ALTERA_AVALON_PIO_DATA(ADC_D5_BASE);
  31.         unsigned int bit6 = IORD_ALTERA_AVALON_PIO_DATA(ADC_D6_BASE);
  32.         unsigned int bit7 = IORD_ALTERA_AVALON_PIO_DATA(ADC_D7_BASE);

  33.         ADC_Value = (bit7 << 7)|(bit6 << 6)|(bit5 << 5)|(bit4 << 4)|(bit3 << 3)|(bit2 << 2)|(bit1 << 1)| (bit0 << 0);

  34.         //printf("ADC_Value=0x%X\n",ADC_Value);
  35.         return ADC_Value;
  36. }



  37. int ADS7824_Select_Channel(int channel )
  38. {
  39.         // Channel Address. Input if CONTC LOW, output if CONTC HIGH. See Table I.
  40.         IOWR_ALTERA_AVALON_PIO_DATA(ADC_CONTC_BASE , 0 );
  41.         switch(channel )
  42.         {
  43.         case 0:
  44.                 IOWR_ALTERA_AVALON_PIO_DATA(ADC_A1_BASE , 0 );
  45.                 IOWR_ALTERA_AVALON_PIO_DATA(ADC_A0_BASE , 0 );
  46.                 break;
  47.         case 1:
  48.                 IOWR_ALTERA_AVALON_PIO_DATA(ADC_A1_BASE , 0 );
  49.                 IOWR_ALTERA_AVALON_PIO_DATA(ADC_A0_BASE , 1 );
  50.                 break;
  51.         case 2:
  52.                 IOWR_ALTERA_AVALON_PIO_DATA(ADC_A1_BASE , 1 );
  53.                 IOWR_ALTERA_AVALON_PIO_DATA(ADC_A0_BASE , 0 );
  54.                 break;
  55.         case 3:
  56.                 IOWR_ALTERA_AVALON_PIO_DATA(ADC_A1_BASE , 1 );
  57.                 IOWR_ALTERA_AVALON_PIO_DATA(ADC_A0_BASE , 1 );
  58.                 break;
  59.         default:
  60.                 return -1;
  61.                 break;
  62.         }
  63.         return 0;
  64. }


  65. float ADS7824_GetFloatValue(int channel )
  66. {
  67.         short AdValue = ADS7824_GetValue(channel);
  68.         float Value = 0;
  69.         if ( (AdValue & 0x0800)==0x0800 )
  70.         {
  71.                 AdValue = AdValue& 0xF7FF;
  72.                 AdValue = (AdValue^0x07FF)+1;
  73.                 Value = 0-AdValue* 0.00048;
  74.         }
  75.         else
  76.         {
  77.                 Value = AdValue * 0.00048;
  78.         }
  79.         return Value;
  80. }




  81. unsigned short ADS7824_GetValue(int channel)
  82. {
  83.         unsigned short ADC_Data = 0;
  84.         unsigned char ADCDataH,ADCDataL;

  85.         ADS7824_Select_Channel(channel);
  86.         while(BUSY()==0)
  87.         {
  88.         }
  89.         CS_H()

  90.         RC_H()
  91.         usleep(1);
  92.         RC_L()
  93.         CS_L()

  94.         usleep(12);


  95.         while(BUSY()==0)
  96.         {
  97.         }

  98.         CS_H()


  99.         RC_H()
  100.         CS_L()

  101.         usleep(1);
  102.         BYTE_L()
  103.         usleep(1);
  104.         ADCDataH = ADS7824_Read8Bit();
  105.         //printf("ADCDataH=%X\n",ADCDataH);


  106.         CS_H()
  107.         usleep(1);
  108.         CS_L()

  109.         BYTE_H()

  110.         ADCDataL = ADS7824_Read8Bit();
  111.         //printf("ADCDataL=%X\n",ADCDataL);


  112.         ADC_Data = ((unsigned int)ADCDataH << 4) |  (( (unsigned int)ADCDataL >>4)&0x0F) ;
  113.         //printf("ADC_Data=%X\n",ADC_Data);

  114.         CS_H()


  115.         usleep(250);

  116.         return ADC_Data;
  117. }






  • 1.jpg

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复