[X]关闭

MiZ702学习笔记9——XADC采集片上数据PS版

文档创建者:宋桓公
浏览次数:7828
最后更新:2016-03-16
本帖最后由 宋桓公 于 2016-1-4 08:13 编辑

这次借助zynq的内嵌的XADC来采集zynq内部的一些参数:
•VCCINT:内部PL核心电压
•VCCAUX:辅助PL电压
•VREFP:XADC正参考电压
•VREFN:XADC负参考电压
•VCCBram:PL BRAM电压
•VCCPInt:PS内部核心电压
•VCCPAux:PS辅助电压
•VCCDdr:DDR RAM的工作电压
这次这个程序的开发流程和之前讲的别无二致,希望大家能够完全的熟悉这个流程~~
还是和往常一样,新建一个Block Design,并且向其中添加zynq核以及XADC IP。

对XADC核进行设置

依次执行这两项:
执行之后如下图所示:

依次执行Generate Output Products 和 Create HDL Wrapper

最后编译,直到生成bit文件。
导出硬件,并通过vivado打开SDK。

进入SDK,如何新建工程,就不再次啰嗦了,请参考之前的章节。新建main.c之后为其添加代码如下~~(这段代码是参考国外的一个大神Adam写的,向大神致敬~~)
  1. #include <stdio.h>
  2. //#include "platform.h"
  3. #include "xadcps.h"
  4. #include "xil_types.h"
  5. #define XPAR_AXI_XADC_0_DEVICE_ID 0
  6. //void print(char *str);
  7. static XAdcPs XADCMonInst;
  8. int main()
  9. {
  10.   XAdcPs_Config *ConfigPtr;
  11.   XAdcPs *XADCInstPtr = &XADCMonInst;
  12.   //status of initialisation
  13.   int Status_ADC;
  14.   //temperature readings
  15.   u32 TempRawData;
  16.   float TempData;
  17.   //Vcc Int readings
  18.   u32 VccIntRawData;
  19.   float VccIntData;
  20.   //Vcc Aux readings
  21.   u32 VccAuxRawData;
  22.   float VccAuxData;
  23.   //Vbram readings
  24.   u32 VBramRawData;
  25.   float VBramData;
  26.   //VccPInt readings
  27.   u32 VccPIntRawData;
  28.   float VccPIntData;
  29.   //VccPAux readings
  30.   u32 VccPAuxRawData;
  31.   float VccPAuxData;
  32.   //Vddr readings
  33.   u32 VDDRRawData;
  34.   float VDDRData;
  35. // init_platform();
  36.     //printf("Adam Edition MicroZed Using Vivado How To Printf \n\r");
  37.     printf("新年快乐~~!!!2015-12-31 \n\r");
  38.     //XADC initilization
  39.      ConfigPtr = XAdcPs_LookupConfig(XPAR_AXI_XADC_0_DEVICE_ID);
  40.        if (ConfigPtr == NULL) {
  41.            return XST_FAILURE;
  42.          }
  43.        Status_ADC = XAdcPs_CfgInitialize(XADCInstPtr,ConfigPtr,ConfigPtr->BaseAddress);
  44.        if(XST_SUCCESS != Status_ADC){
  45.            print("ADC INIT FAILED\n\r");
  46.            return XST_FAILURE;
  47.         }
  48.        //self test
  49.        Status_ADC = XAdcPs_SelfTest(XADCInstPtr);
  50.      if (Status_ADC != XST_SUCCESS) {
  51.        return XST_FAILURE;
  52.      }
  53.                 //stop sequencer
  54.                 XAdcPs_SetSequencerMode(XADCInstPtr,XADCPS_SEQ_MODE_SINGCHAN);
  55.                 //disable alarms
  56.                 XAdcPs_SetAlarmEnables(XADCInstPtr, 0x0);
  57.                 //configure sequencer to just sample internal on chip parameters
  58.                 XAdcPs_SetSeqInputMode(XADCInstPtr, XADCPS_SEQ_MODE_SAFE);
  59.                 //configure the channel enables we want to monitor
  60.                 XAdcPs_SetSeqChEnables(XADCInstPtr,XADCPS_CH_TEMP|XADCPS_CH_VCCINT|XADCPS_CH_VCCAUX|XADCPS_CH_VBRAM|XADCPS_CH_VCCPINT| XADCPS_CH_VCCPAUX|XADCPS_CH_VCCPDRO);
  61.                 while(1)
  62.                 {
  63.                         TempRawData = XAdcPs_GetAdcData(XADCInstPtr, XADCPS_CH_TEMP);
  64.                         TempData = XAdcPs_RawToTemperature(TempRawData);
  65.                         printf("Raw Temp %lu Real Temp %f \n\r", TempRawData, TempData);
  66.                         VccIntRawData = XAdcPs_GetAdcData(XADCInstPtr, XADCPS_CH_VCCINT);
  67.                         VccIntData = XAdcPs_RawToVoltage(VccIntRawData);
  68.                         printf("Raw VccInt %lu Real VccInt %f \n\r", VccIntRawData,VccIntData);
  69.                         VccAuxRawData = XAdcPs_GetAdcData(XADCInstPtr, XADCPS_CH_VCCAUX);
  70.                         VccAuxData = XAdcPs_RawToVoltage(VccAuxRawData);
  71.                         printf("Raw VccAux %lu Real VccAux %f \n\r", VccAuxRawData,VccAuxData);
  72.                         VBramRawData = XAdcPs_GetAdcData(XADCInstPtr, XADCPS_CH_VBRAM);
  73.                         VBramData = XAdcPs_RawToVoltage(VBramRawData);
  74.                         printf("Raw VccBram %lu Real VccBram %f \n\r", VBramRawData, VBramData);
  75.                         VccPIntRawData = XAdcPs_GetAdcData(XADCInstPtr, XADCPS_CH_VCCPINT);
  76.                         VccPIntData = XAdcPs_RawToVoltage(VccPIntRawData);
  77.                         printf("Raw VccPInt %lu Real VccPInt %f \n\r", VccPIntRawData, VccPIntData);
  78.                         VccPAuxRawData = XAdcPs_GetAdcData(XADCInstPtr, XADCPS_CH_VCCPAUX);
  79.                         VccPAuxData = XAdcPs_RawToVoltage(VccPAuxRawData);
  80.                         printf("Raw VccPAux %lu Real VccPAux %f \n\r", VccPAuxRawData, VccPAuxData);
  81.                         VDDRRawData = XAdcPs_GetAdcData(XADCInstPtr, XADCPS_CH_VCCPDRO);
  82.                         VDDRData = XAdcPs_RawToVoltage(VDDRRawData);
  83.                         printf("Raw VccDDR %lu Real VccDDR %f \n\r", VDDRRawData, VDDRData);
  84.                  }
  85.                 return 0;
  86. }
复制代码


1.  Use the "XAdcPs_SelfTest()"   这个自检就不用说了
2.  Use "XAdcPs_SetSequencerMode()"  这个是设置采样模式。
3.  Use "XAdcPs_SetAlarmEnables()"   这个是设置采样值报警的,直接关闭,不需要报警
4.  Use "XAdcPs_SetSeqInputMode()"   这个是设置输入模式的
5.  Use "XAdcPs_SetSeqChEnables()    这个是使能采样通道的
编译之后,记得先下载bit文件~~连上串口,然后就可以执行程序了:

于是乎,通过打开串口调试助手,便能看见打印出如下信息~~

新年新气象~~从这篇文章开始,vivado升级到2015.2版本~~如果你需要下载,网盘地址如下~~
vivado 2015.2 http://yunpan.cn/c3I7aVCGVneEh  访问密码 7d64

发表评论已发布 3

missilesong

发表于 2016-2-10 23:46:17 | 显示全部楼层

根据宋工的工程!的确可以实现内部ADC!那怎么使用外部IO做ADC?因为普遍使用到ADC都是为了外部模拟量转换!

missilesong

发表于 2016-2-12 17:41:37 | 显示全部楼层

最近再研究zynq 7020的XADC 根据楼主!实验是成功了!但发现采样应该是有问题的!除了温度部分在连续采样会发生变化!其他值未发生变化!可能只在开始的时候采了一次样!之后就没继续循环进行ADC了!还有进一步挖掘的空间!等研究出来了贴出来共享!

gyj82117

发表于 2016-3-16 17:39:42 | 显示全部楼层

学习下!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则