zoukankan      html  css  js  c++  java
  • MiZ702学习笔记9——XADC采集片上数据PS版

    这次借助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。

    wps85C2.tmp

    对XADC核进行设置

    wps8611.tmp

    依次执行这两项:wps8612.tmp

    执行之后如下图所示:

    wps874B.tmp

    依次执行Generate Output Products 和 Create HDL Wrapper

    wps874C.tmp

    最后编译,直到生成bit文件。

    导出硬件,并通过vivado打开SDK。

    wps875C.tmp

    进入SDK,如何新建工程,就不再次啰嗦了,请参考之前的章节。新建main.c之后为其添加代码如下~~(这段代码是参考国外的一个大神Adam写的,向大神致敬~~)

    #include <stdio.h>
    //#include "platform.h"
    #include "xadcps.h"
    #include "xil_types.h"
    #define XPAR_AXI_XADC_0_DEVICE_ID 0
    
    
    //void print(char *str);
    
    static XAdcPs XADCMonInst;
    
    int main()
    {
    
      XAdcPs_Config *ConfigPtr;
      XAdcPs *XADCInstPtr = &XADCMonInst;
    
      //status of initialisation
      int Status_ADC;
    
      //temperature readings
      u32 TempRawData;
      float TempData;
    
      //Vcc Int readings
      u32 VccIntRawData;
      float VccIntData;
    
      //Vcc Aux readings
      u32 VccAuxRawData;
      float VccAuxData;
    
      //Vbram readings
      u32 VBramRawData;
      float VBramData;
    
      //VccPInt readings
      u32 VccPIntRawData;
      float VccPIntData;
    
      //VccPAux readings
      u32 VccPAuxRawData;
      float VccPAuxData;
    
      //Vddr readings
      u32 VDDRRawData;
      float VDDRData;
    
     // init_platform();
    
        //printf("Adam Edition MicroZed Using Vivado How To Printf 
    
    ");
        printf("新年快乐~~!!!2015-12-31 
    
    ");
        //XADC initilization
    
         ConfigPtr = XAdcPs_LookupConfig(XPAR_AXI_XADC_0_DEVICE_ID);
           if (ConfigPtr == NULL) {
               return XST_FAILURE;
             }
    
           Status_ADC = XAdcPs_CfgInitialize(XADCInstPtr,ConfigPtr,ConfigPtr->BaseAddress);
           if(XST_SUCCESS != Status_ADC){
               print("ADC INIT FAILED
    
    ");
               return XST_FAILURE;
            }
    
           //self test
           Status_ADC = XAdcPs_SelfTest(XADCInstPtr);
         if (Status_ADC != XST_SUCCESS) {
           return XST_FAILURE;
         }
    
            //stop sequencer
            XAdcPs_SetSequencerMode(XADCInstPtr,XADCPS_SEQ_MODE_SINGCHAN);
    
            //disable alarms
            XAdcPs_SetAlarmEnables(XADCInstPtr, 0x0);
    
            //configure sequencer to just sample internal on chip parameters
            XAdcPs_SetSeqInputMode(XADCInstPtr, XADCPS_SEQ_MODE_SAFE);
    
    
            //configure the channel enables we want to monitor
    
            XAdcPs_SetSeqChEnables(XADCInstPtr,XADCPS_CH_TEMP|XADCPS_CH_VCCINT|XADCPS_CH_VCCAUX|XADCPS_CH_VBRAM|XADCPS_CH_VCCPINT| XADCPS_CH_VCCPAUX|XADCPS_CH_VCCPDRO);
    
            while(1)
            {
                TempRawData = XAdcPs_GetAdcData(XADCInstPtr, XADCPS_CH_TEMP);
                TempData = XAdcPs_RawToTemperature(TempRawData);
                printf("Raw Temp %lu Real Temp %f 
    
    ", TempRawData, TempData);
    
                VccIntRawData = XAdcPs_GetAdcData(XADCInstPtr, XADCPS_CH_VCCINT);
                VccIntData = XAdcPs_RawToVoltage(VccIntRawData);
                printf("Raw VccInt %lu Real VccInt %f 
    
    ", VccIntRawData,VccIntData);
    
                VccAuxRawData = XAdcPs_GetAdcData(XADCInstPtr, XADCPS_CH_VCCAUX);
                VccAuxData = XAdcPs_RawToVoltage(VccAuxRawData);
                printf("Raw VccAux %lu Real VccAux %f 
    
    ", VccAuxRawData,VccAuxData);
    
    
                VBramRawData = XAdcPs_GetAdcData(XADCInstPtr, XADCPS_CH_VBRAM);
                VBramData = XAdcPs_RawToVoltage(VBramRawData);
                printf("Raw VccBram %lu Real VccBram %f 
    
    ", VBramRawData, VBramData);
    
                VccPIntRawData = XAdcPs_GetAdcData(XADCInstPtr, XADCPS_CH_VCCPINT);
                VccPIntData = XAdcPs_RawToVoltage(VccPIntRawData);
                printf("Raw VccPInt %lu Real VccPInt %f 
    
    ", VccPIntRawData, VccPIntData);
    
                VccPAuxRawData = XAdcPs_GetAdcData(XADCInstPtr, XADCPS_CH_VCCPAUX);
                VccPAuxData = XAdcPs_RawToVoltage(VccPAuxRawData);
                printf("Raw VccPAux %lu Real VccPAux %f 
    
    ", VccPAuxRawData, VccPAuxData);
    
                VDDRRawData = XAdcPs_GetAdcData(XADCInstPtr, XADCPS_CH_VCCPDRO);
                VDDRData = XAdcPs_RawToVoltage(VDDRRawData);
                printf("Raw VccDDR %lu Real VccDDR %f 
    
    ", VDDRRawData, VDDRData);
             }
    
            return 0;
    }

    1.  Use the "XAdcPs_SelfTest()"   这个自检就不用说了

    2.  Use "XAdcPs_SetSequencerMode()"  这个是设置采样模式。

    3.  Use "XAdcPs_SetAlarmEnables()"   这个是设置采样值报警的,直接关闭,不需要报警

    4.  Use "XAdcPs_SetSeqInputMode()"   这个是设置输入模式的

    5.  Use "XAdcPs_SetSeqChEnables()    这个是使能采样通道的

    编译之后,记得先下载bit文件~~连上串口,然后就可以执行程序了:

    wps875D.tmp

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

    wps876E.tmp

    新年新气象~~从这篇文章开始,vivado升级到2015.2版本~~如果你需要下载,网盘地址如下~~

    vivado 2015.2 http://yunpan.cn/c3I7aVCGVneEh  访问密码 7d64

  • 相关阅读:
    分布式系统之CAP原理
    分布式缓存一致性哈希算法
    数据库三范式 无重复列 完全依赖主键 属性不依赖非主属性
    二叉树 B-树B+树
    数据库索引 主键 聚集索引 非聚集索引
    数据库水平拆分
    线程池ScheduledThreadPoolExecutor
    线程池之ThreadPoolExecutor
    mybatis一级缓存和二级缓存
    vue框架的搭建
  • 原文地址:https://www.cnblogs.com/douzi2/p/5097727.html
Copyright © 2011-2022 走看看