当前位置:   article > 正文

Zynq-Linux移植学习笔记之59-国产ZYNQ XADC使用说明_linux xadc

linux xadc

1、背景介绍

国产ZYNQ XADC位于PL部分,和进口的对应关系如下:

外部的AUX只有8个通道,最终支持8路外部监测。

2、fpga设置

XADC不需要在linux内核中添加驱动,也不需要在设备数中添加节点,只需要知道FPGA中的XADC基地址,在应用程序中通过/dev/mem方式进行读写。

FPGA中建议将所有使用到的通道全部打开,AUX通道设置为0-11

然后确认XADC的基地址

3、应用设计

应用中可以使用一套代码,需要改动的部分包括:

  • XADC基地址

  • 外部AUX通道采集的数据经过电阻分压的转换公式

转换公式一般是将读到的原始数据先除以65536 再进行转换

注意:由于和进口存在区别,程序读到的值为下图右侧XADC的通道值,硬件设计是使用下图左侧XADC的通道值。

 

硬件只提供左侧的通道采样的信息:

应用程序中换算为右侧对应的通道,获取采样值。

举例 通道9就是应用中读到的XADCPS_CH_AUX[2]

除了8个外部通道AUX外,其他通道不需要转换。

使用XADC采样前,需要对XADC进行初始化部分。

参考代码如下:

  1. #ifndef _XADC_CORE_H
  2. #define _XADC_CORE_H
  3. #include "../global/xil_types.h"
  4. #define XADC_BASE_ADDR 0x83C30000U
  5. #define XADCPS_CH_TEMP 0x200 /**< On Chip Temperature */
  6. #define XADCPS_CH_VCCINT 0x204 /**< VCCINT */
  7. #define XADCPS_CH_VCCAUX 0x208 /**< VCCAUX */
  8. #define XADCPS_CH_VPVN 0x20c /**< VP/VN Dedicated analog inputs */
  9. #define XADCPS_CH_VREFP 0x210 /**< VREFP */
  10. #define XADCPS_CH_VREFN 0x214 /**< VREFN */
  11. #define XADCPS_CH_VBRAM 0x218 /**< On-chip VBRAM Data Reg, 7 series */
  12. #define XADCPS_CH_SUPPLY_CALIB 0x220 /**< Supply Calib Data Reg */
  13. #define XADCPS_CH_ADC_CALIB 0x224 /**< ADC Offset Channel Reg */
  14. #define XADCPS_CH_GAINERR_CALIB 0x228 /**< Gain Error Channel Reg */
  15. #define XADCPS_CH_VCCPINT 0x234 /**< On-chip PS VCCPINT Channel , Zynq */
  16. #define XADCPS_CH_VCCPAUX 0x238 /**< On-chip PS VCCPAUX Channel , Zynq */
  17. #define XADCPS_CH_VCCPMEM 0x23c /**< On-chip PS VCCPMEM Channel , Zynq */
  18. #define XADCPS_CH_AUX_MIN 0x240 /**< Channel number for 1st Aux Channel */
  19. #define XADCPS_CH_AUX_MAX 0x27c /**< Channel number for Last Aux channel */
  20. enum EConvType
  21. {
  22. EConvType_None,
  23. EConvType_Raw_to_Scale,
  24. EConvType_Scale_to_Raw,
  25. EConvType_Max
  26. };
  27. float conv_temperature(float input, enum EConvType conv_direction);
  28. float conv_voltage(float input, enum EConvType conv_direction);
  29. void xadc_initialization();
  30. #endif
  1. /*
  2. * xadc_core.c
  3. *
  4. * Created on: 2017年9月20日
  5. * Author: Administrator
  6. */
  7. #define __XADC_CORE_C_
  8. #include <stdio.h>
  9. #include <string.h>
  10. #include <errno.h>
  11. #include <unistd.h>
  12. #include <dirent.h>
  13. #include <stdlib.h>
  14. #include <sys/ioctl.h>
  15. #include <fcntl.h>
  16. #include <ctype.h>
  17. #include <pthread.h>
  18. #include <assert.h>
  19. #include "xadc_core.h"
  20. #include "../global/xil_io.h"
  21. void xadc_initialization()
  22. {
  23. Xil_Out32(XADC_BASE_ADDR+0x000, 0xA);
  24. Xil_Out32(XADC_BASE_ADDR+0x010, 0x1);
  25. Xil_Out32(XADC_BASE_ADDR+0x010, 0x0);
  26. }
  27. //utility functions
  28. float conv_voltage(float input, enum EConvType conv_direction)
  29. {
  30. float result=0;
  31. switch(conv_direction)
  32. {
  33. case EConvType_Raw_to_Scale:
  34. result = ((input * 3.0)/65536.0);
  35. break;
  36. default:
  37. break;
  38. }
  39. return result;
  40. }
  41. float conv_temperature(float input, enum EConvType conv_direction)
  42. {
  43. float result=0;
  44. switch(conv_direction)
  45. {
  46. case EConvType_Raw_to_Scale:
  47. result = ((input / 65536.0)/0.00198421639) - 273.15;
  48. break;
  49. default:
  50. break;
  51. }
  52. return result;
  53. }
  54. //transfer float to unsigned char
  55. unsigned char transfer(float temp)
  56. {
  57. unsigned char result;
  58. char buff[100];
  59. int before,end;
  60. memset(buff,0,sizeof(buff));
  61. sprintf(buff,"%.2f",temp);
  62. sscanf(buff,"%d.%d",&before,&end);
  63. result=(before<<4)|end;
  64. return result;
  65. }
  66. void printadc()
  67. {
  68. float raw_data=0;
  69. float true_data=0;
  70. raw_data = Xil_In32(XADC_BASE_ADDR+XADCPS_CH_TEMP);
  71. //printf("XADCPS_CH_TEMP is %f\n",raw_data);
  72. true_data=conv_temperature(raw_data,EConvType_Raw_to_Scale);
  73. printf("XADCPS_CH_TEMP TRUE DATA is %.2fCent\n",true_data);
  74. raw_data = Xil_In32(XADC_BASE_ADDR+XADCPS_CH_VCCINT);
  75. //printf("XADCPS_CH_VCCINT is %f\n",raw_data);
  76. true_data=conv_voltage(raw_data,EConvType_Raw_to_Scale);
  77. printf("XADCPS_CH_VCCINT TRUE DATA is %.2fV\n",true_data);
  78. raw_data = Xil_In32(XADC_BASE_ADDR+XADCPS_CH_VCCAUX);
  79. //printf("XADCPS_CH_VCCAUX is %f\n",raw_data);
  80. true_data=conv_voltage(raw_data,EConvType_Raw_to_Scale);
  81. printf("XADCPS_CH_VCCAUX TRUE DATA is %.2fV\n",true_data);
  82. raw_data = Xil_In32(XADC_BASE_ADDR+XADCPS_CH_VBRAM);
  83. //printf("XADCPS_CH_VBRAM is %f\n",raw_data);
  84. true_data=conv_voltage(raw_data,EConvType_Raw_to_Scale);
  85. printf("XADCPS_CH_VBRAM TRUE DATA is %.2fV\n",true_data);
  86. raw_data = Xil_In32(XADC_BASE_ADDR+XADCPS_CH_VCCPINT);
  87. //printf("XADCPS_CH_VCCPINT is %f\n",raw_data);
  88. true_data=conv_voltage(raw_data,EConvType_Raw_to_Scale);
  89. printf("XADCPS_CH_VCCPINT TRUE DATA is %.2fV\n",true_data);
  90. raw_data = Xil_In32(XADC_BASE_ADDR+XADCPS_CH_VCCPAUX);
  91. //printf("XADCPS_CH_VCCPAUX is %f\n",raw_data);
  92. true_data=conv_voltage(raw_data,EConvType_Raw_to_Scale);
  93. printf("XADCPS_CH_VCCPAUX TRUE DATA is %.2fV\n",true_data);
  94. raw_data = Xil_In32(XADC_BASE_ADDR+XADCPS_CH_VCCPMEM);
  95. //printf("XADCPS_CH_VCCPMEM is %f\n",raw_data);
  96. true_data=conv_voltage(raw_data,EConvType_Raw_to_Scale);
  97. printf("XADCPS_CH_VCCPMEM TRUE DATA is %.2fV\n",true_data);
  98. printf("\n****************AUX DATA****************** \n");
  99. raw_data = Xil_In32(XADC_BASE_ADDR+(XADCPS_CH_AUX_MIN));
  100. true_data=(raw_data/65536.0)*2.0; //换算公式
  101. printf("XADCPS_CH_AUX[%d] 1V2 is %.2fV\n",0,true_data);
  102. raw_data = Xil_In32(XADC_BASE_ADDR+(XADCPS_CH_AUX_MIN+1*4));
  103. true_data=(raw_data/65536.0)*2.0; //换算公式
  104. printf("XADCPS_CH_AUX[%d] 1V2 is %.2fV\n",1,true_data);
  105. raw_data = Xil_In32(XADC_BASE_ADDR+(XADCPS_CH_AUX_MIN+2*4));
  106. true_data=raw_data/65536.0; //换算公式
  107. printf("XADCPS_CH_AUX[%d] 1V0 is %.2fV\n",2,true_data);
  108. raw_data = Xil_In32(XADC_BASE_ADDR+(XADCPS_CH_AUX_MIN+3*4));
  109. true_data=raw_data/65536.0; //换算公式
  110. printf("XADCPS_CH_AUX[%d] 1V5 is %.2fV\n",2,true_data);
  111. raw_data = Xil_In32(XADC_BASE_ADDR+(XADCPS_CH_AUX_MIN+4*4));
  112. true_data=(raw_data/65536.0*3.0)/2.0; //换算公式
  113. printf("XADCPS_CH_AUX[%d] 3V3 is %.2fV\n",4,true_data);
  114. raw_data = Xil_In32(XADC_BASE_ADDR+(XADCPS_CH_AUX_MIN+8*4));
  115. true_data=(raw_data/65536.0*3.0)/2.0; //换算公式
  116. printf("XADCPS_CH_AUX[%d] 3V3 is %.2fV\n",8,true_data);
  117. raw_data = Xil_In32(XADC_BASE_ADDR+(XADCPS_CH_AUX_MIN+10*4));
  118. true_data=(raw_data/65536.0*3.0)/2.0; //换算公式
  119. printf("XADCPS_CH_AUX[%d] 1V2 is %.2fV\n",10,true_data);
  120. raw_data = Xil_In32(XADC_BASE_ADDR+(XADCPS_CH_AUX_MIN+11*4));
  121. true_data=(raw_data/65536.0)*2.0; //换算公式
  122. printf("XADCPS_CH_AUX[%d] 2V5 is %.2fV\n",11,true_data);
  123. printf("\n************************************** \n");
  124. printf("\n************************************** \n");
  125. printf("\n************************************** \n");
  126. }
  127. int main()
  128. {
  129. xadc_initialization();
  130. printadc();
  131. return 0;
  132. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/509898
推荐阅读
相关标签
  

闽ICP备14008679号