9.0難度系數★☆☆☆☆☆☆
9.1實驗概述
這次借助zynq的內嵌的XADC來采集zynq內部的一些參數:
•VCCINT:內部PL核心電壓
•VCCAUX:輔助PL電壓
•VREFP:XADC正參考電壓
•VREFN:XADC負參考電壓
•VCCBram:PL BRAM電壓
•VCCPInt:PS內部核心電壓
•VCCPAux:PS輔助電壓
•VCCDdr:DDR RAM的工作電壓
9.2 新建一個VIVADO工程
Step1:新建一個名為為Miz702_sys的工程
Step2:選擇RTL Project 勾選Do not specify source at this time
Step3:由於Miz702兼容zedboard 因此選擇zedboard開發包
Step4:單擊Finish
Step5:新建一個Block Design,並且向其中添加zynq核以及XADC IP。
Step6:新建一個Block Design,並且向其中添加zynq核以及XADC IP。
Step7:對XADC核進行設置
Step8:依次執行這兩項
Step9:執行之后如下圖所示
Step10:依次執行Generate Output Products 和 Create HDL Wrapper
9.3 產生bit文件
此時可以,開始生成bit文件了(這個過程會彈出保存對話框單擊保存,然后彈出Implementation對話框單擊OK,重新編譯一次):
9.4 導出硬件和bit文件
編譯成功之后,依然是導出硬件:
9.5 加載到SDK
9.5 .1編寫代碼
進入SDK,如何新建工程,就不再次啰嗦了,請參考之前的章節。新建main.c之后為其添加代碼如下。
//#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 \n\r"); printf("新年快樂~~!!!2015-12-31 \n\r"); //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\n\r"); 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 \n\r", TempRawData, TempData); VccIntRawDat= 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; } |
9.5 .2函數介紹
1. Use the "XAdcPs_SelfTest()" 這個自檢就不用說了
2. Use "XAdcPs_SetSequencerMode()"這個是設置采樣模式。
3. Use "XAdcPs_SetAlarmEnables()"這個是設置采樣值報警的,直接關閉,不需要報警
4. Use "XAdcPs_SetSeqInputMode()" 這個是設置輸入模式的
5. Use "XAdcPs_SetSeqChEnables() 這個是使能采樣通道的
9.5 .3測試結果
編譯之后,記得先下載bit文件~~連上串口,然后就可以執行程序了:
於是乎,通過打開串口調試助手,便能看見打印出如下信息~~
9.6 本章小結
本章講解了如果采集片上電壓以及溫度的方法,這個實驗在實際工程運用中可以通過測試自生的電壓和穩定判斷系統是否可以正常工作,是否要做出一些報警之類的行動。