S02_CH06_XADC实验
6.1实验概述
这次借助zynq的内嵌的XADC来采集zynq内部的一些参数:
•VCCINT:内部PL核心电压
•VCCAUX:辅助PL电压
•VREFP:XADC正参考电压
•VREFN:XADC负参考电压
•VCCBram:PL BRAM电压
•VCCPInt:PS内部核心电压
•VCCPAux:PS辅助电压
•VCCDdr:DDR RAM的工作电压
6.2 新建一个VIVADO工程
Step1:新建一个名为为Miz_sys的工程,芯片类型根据自身情况设置。
Step2:创建一个BD文件,并命名为system。
Step3:添加 ZYNQ7 Processing System,根据自己的硬件类型配置好输入时钟频率与内存型号。
Step4:单击添加IP按钮,输入Xadc添加一个XADC的IP进入BD文件中。
Step5:无需对XADC IP进行任何配置,直接单击run connection automation,然后按OK完成整体电路的设计。
Step6:右键单击Block文件,文件选择Generate the Output Products。
Step7:右键单击Block文件,选择Create a HDL wrapper,根据Block文件内容产生一个HDL 的顶层文件,并选择让vivado自动完成。
Step8:生成Bit文件。
6.3 加载到SDK
Step1:导出硬件。
Step2:新建一个空SDK工程,并添加一个main.c的文件。
Step3:在main.c文件中添加以下程序,按Ctrl+S保存后自动开始编译。
/* * main.c * * Created on: 2016年6月25日 * Author: Administrator */ #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(); 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; } |
Step4:右击工程,选择Debug as ->Debug configuration。
Step5:选中system Debugger,双击创建一个系统调试。
Step6:设置系统调试。
打开系统自带的窗口调试助手,点击运行按钮开始运行程序。
系统运行结果如下图所示:
6.4函数介绍
1. Use the "XAdcPs_SelfTest()" 这个自检就不用说了
2. Use "XAdcPs_SetSequencerMode()"这个是设置采样模式。
3. Use "XAdcPs_SetAlarmEnables()"这个是设置采样值报警的,直接关闭,不需要报警
4. Use "XAdcPs_SetSeqInputMode()" 这个是设置输入模式的
5. Use "XAdcPs_SetSeqChEnables() 这个是使能采样通道的
6.5 本章小结
本章讲解了如果采集片上电压以及温度的方法,这个实验在实际工程运用中可以通过测试自生的电压和稳定判断系统是否可以正常工作,是否要做出一些报警之类的行动。