第九章 MIZ702 ZYNQ片上ADC的使用


 

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的工程

wpsC5AE.tmp

Step2:選擇RTL Project 勾選Do not specify source at this time

wpsC5AF.tmp

Step3:由於Miz702兼容zedboard 因此選擇zedboard開發包

wpsC5B0.tmp

Step4:單擊Finish

wpsC5C1.tmp

Step5:新建一個Block Design,並且向其中添加zynq核以及XADC IP。

wpsC5C2.tmp

Step6:新建一個Block Design,並且向其中添加zynq核以及XADC IP。

wpsC5C3.tmp

Step7:對XADC核進行設置

wpsC5C4.tmp

Step8:依次執行這兩項

wpsC5C5.tmp

Step9:執行之后如下圖所示

wpsC5D6.tmp

Step10:依次執行Generate Output Products 和 Create HDL Wrapper

wpsC5D7.tmp

9.3 產生bit文件

此時可以,開始生成bit文件了(這個過程會彈出保存對話框單擊保存,然后彈出Implementation對話框單擊OK,重新編譯一次):

wpsC5D8.tmp

9.4 導出硬件和bit文件

編譯成功之后,依然是導出硬件:

wpsC5D9.tmp

9.5 加載到SDK

9.5 .1編寫代碼

進入SDK,如何新建工程,就不再次啰嗦了,請參考之前的章節。新建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;

  //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文件~~連上串口,然后就可以執行程序了:

wpsC5E9.tmp

於是乎,通過打開串口調試助手,便能看見打印出如下信息~~

wpsC5EA.tmp

9.6 本章小結

本章講解了如果采集片上電壓以及溫度的方法,這個實驗在實際工程運用中可以通過測試自生的電壓和穩定判斷系統是否可以正常工作,是否要做出一些報警之類的行動。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM