ZYNQ(六)使用ps端上xilinx的XADC

本次实验的目的,借助zynq的内嵌XADC(anolag-digital converter)来采集zynq内部的一些参数。
(1)创建vivado工程以及block design
(2)配置PS端(时钟与DDR),添加XADC ip(XADC无需任何配置)
run connection automation(自动连接)

在这里插入图片描述
(3)generation output products
(4)creat HDL wrapper
(5)生成bit文件
加载到SDK中
(6)创建一个新的工程,以及加入main.c
其中main.c 如下所示:

#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;
//指针实例,XADC的ps配置(使用结构体)

  //status of initialisation
  int Status_ADC;

  //temperature readings
  u32 TempRawData;
  float TempData;

  //Vcc Int readings 内部PL核心电压
  u32 VccIntRawData;
  float VccIntData;

  //Vcc Aux readings 辅助PL电压
  u32 VccAuxRawData;
  float VccAuxData;

  //Vbram readings PL BRAM电压
  u32 VBramRawData;
  float VBramData;

  //VccPInt readings PS内部核心电压
  u32 VccPIntRawData;
  float VccPIntData;

  //VccPAux readings PS辅助电压
  u32 VccPAuxRawData;
  float VccPAuxData;

  //Vddr readings DDR RAM的工作电压
  u32 VDDRRawData;
  float VDDRData;

 // init_platform();

    //printf("Adam Edition MicroZed Using Vivado How To Printf \n\r");
    printf("新年快乐~~!!!\n\r");
    //XADC initilization
//XAdcPs_LookupConfig 是xilinx官方提供查找配置的函数
     ConfigPtr = XAdcPs_LookupConfig(XPAR_AXI_XADC_0_DEVICE_ID);
       if (ConfigPtr == NULL) {
           return XST_FAILURE;
         }
//XAdcPs_CfgInitialize 是xilinx官方初始化xadc的函数
       Status_ADC = XAdcPs_CfgInitialize(XADCInstPtr,ConfigPtr,ConfigPtr->BaseAddress);
       if(XST_SUCCESS != Status_ADC){
           print("ADC INIT FAILED\n\r");
           return XST_FAILURE;
        }

       //self test(自检)
       Status_ADC = XAdcPs_SelfTest(XADCInstPtr);
     if (Status_ADC != XST_SUCCESS) {
       return XST_FAILURE;
     }

		//stop sequencer  XAdcPs_SetSequencerMode设置采样模式
		XAdcPs_SetSequencerMode(XADCInstPtr,XADCPS_SEQ_MODE_SINGCHAN);

		//disable alarms XAdcPs_SetAlarmEnables设置采样值报警,直接关闭
		XAdcPs_SetAlarmEnables(XADCInstPtr, 0x0);

		//configure sequencer to just sample internal on chip parameters XAdcPs_SetSeqInputMode 设置输入模式
		XAdcPs_SetSeqInputMode(XADCInstPtr, XADCPS_SEQ_MODE_SAFE);


		//configure the channel enables we want to monitor XAdcPs_SetSeqChEnables 使能采样通道
		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 \n\r", TempRawData, TempData);

			VccIntRawData= XAdcPs_GetAdcData(XADCInstPtr, XADCPS_CH_VCCINT);
			VccIntData = XAdcPs_RawToVoltage(VccIntRawData);
			printf("Raw VccInt %lu Real VccInt %f \n\r", VccIntRawData,VccIntData);

			VccAuxRawData = XAdcPs_GetAdcData(XADCInstPtr, XADCPS_CH_VCCAUX);
			VccAuxData = XAdcPs_RawToVoltage(VccAuxRawData);
			printf("Raw VccAux %lu Real VccAux %f \n\r", VccAuxRawData,VccAuxData);


			VBramRawData = XAdcPs_GetAdcData(XADCInstPtr, XADCPS_CH_VBRAM);
			VBramData = XAdcPs_RawToVoltage(VBramRawData);
			printf("Raw VccBram %lu Real VccBram %f \n\r", VBramRawData, VBramData);

			VccPIntRawData = XAdcPs_GetAdcData(XADCInstPtr, XADCPS_CH_VCCPINT);
			VccPIntData = XAdcPs_RawToVoltage(VccPIntRawData);
			printf("Raw VccPInt %lu Real VccPInt %f \n\r", VccPIntRawData, VccPIntData);

			VccPAuxRawData = XAdcPs_GetAdcData(XADCInstPtr, XADCPS_CH_VCCPAUX);
			VccPAuxData = XAdcPs_RawToVoltage(VccPAuxRawData);
			printf("Raw VccPAux %lu Real VccPAux %f \n\r", VccPAuxRawData, VccPAuxData);

			VDDRRawData = XAdcPs_GetAdcData(XADCInstPtr, XADCPS_CH_VCCPDRO);
			VDDRData = XAdcPs_RawToVoltage(VDDRRawData);
			printf("Raw VccDDR %lu Real VccDDR %f \n\r", VDDRRawData, VDDRData);
		 }

		return 0;
}

(7)debug as->debug configuration,并设置系统调试
(8)打开系统自带的窗口调试助手,点击开始运行程序
注意需要连接USB-232

发布了54 篇原创文章 · 获赞 4 · 访问量 1041

猜你喜欢

转载自blog.csdn.net/buzhiquxiang/article/details/103553167