Zedboard学习(六):XADC读取数据
zynq 的內(nèi)嵌了 XADC,可以用來采集電壓;
Temp:芯片溫度
VCCINT: 內(nèi)部PL核心電壓
VCCAUX: 輔助PL電壓
VCCBram: PL BRAM電壓
VCCPInt: PS內(nèi)部核心電壓
VCCPAux: PS輔助電壓
VCCDDR: DDR RAM的工作電壓
VREFP: XADC正參考電壓
VREFN: XADC負(fù)參考電壓
1、新建工程,添加block design。添加zynq7 processor和xadc模塊。
2、Run Block Automation后會(huì)自動(dòng)配置zynq7處理器;Run Connection Automation 會(huì)自動(dòng)將模塊進(jìn)行連接,將xadc模塊掛載在axi總線下,這樣xadc的相關(guān)寄存器會(huì)映射到處理器的內(nèi)存(DDR)上。自動(dòng)添加的兩個(gè)模塊,一個(gè)用于管理全局復(fù)位,一個(gè)用于同步axi總線。
點(diǎn)擊 自動(dòng)重新對(duì)整個(gè)block design布局。
3、保存并生成頂層頭文件。
4、生成比特流文件,等會(huì)兒就生成好了。
5、導(dǎo)出比特流,打開sdk。sdk下新建工程,輸入如下代碼:
/** main.c** Created on: 2017年7月16日* Author: XHB*/#include <stdio.h> #include "xparameters.h" #include "xadcps.h" #include "xil_types.h" #include "xadcps_hw.h" #include "sleep.h"int main() {static XAdcPs Adc_Struct;XAdcPs_Config *Adc_Config;int xStatus;//temperature readingsu32 TempRawData;float TempData;//Vcc Int readingsu32 VccIntRawData;float VccIntData;//Vcc Aux readingsu32 VccAuxRawData;float VccAuxData;//Vbram readingsu32 VBramRawData;float VBramData;//VccPInt readingsu32 VccPIntRawData;float VccPIntData;//VccPAux readingsu32 VccPAuxRawData;float VccPAuxData;//Vddr readingsu32 VDDRRawData;float VDDRData;Adc_Config = XAdcPs_LookupConfig(XPAR_PS7_XADC_0_DEVICE_ID);if(Adc_Config == NULL){print("error to look up config!!!\n");return XST_FAILURE;}xStatus = XAdcPs_CfgInitialize(&Adc_Struct, Adc_Config, Adc_Config->BaseAddress);if(xStatus != XST_SUCCESS){print("error to initialize!!!\n");return XST_FAILURE;}xStatus = XAdcPs_SelfTest(&Adc_Struct);if(xStatus != XST_SUCCESS){print("error to Self Test!!!\n");return XST_FAILURE;}//設(shè)置采樣模式XAdcPs_SetSequencerMode(&Adc_Struct, XADCPS_SEQ_MODE_SINGCHAN);//設(shè)置報(bào)警使能,直接關(guān)閉掉XAdcPs_SetAlarmEnables(&Adc_Struct, 0x0);//設(shè)置使能采樣通道XAdcPs_SetSeqChEnables(&Adc_Struct, 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(&Adc_Struct, XADCPS_CH_TEMP);TempData = XAdcPs_RawToTemperature(TempRawData);printf("Raw Temp %lu Real Temp %f \n", TempRawData, TempData);VccIntRawData= XAdcPs_GetAdcData(&Adc_Struct, XADCPS_CH_VCCINT);VccIntData = XAdcPs_RawToVoltage(VccIntRawData);printf("Raw VccInt %lu Real VccInt %f \n", VccIntRawData,VccIntData);VccAuxRawData = XAdcPs_GetAdcData(&Adc_Struct, XADCPS_CH_VCCAUX);VccAuxData = XAdcPs_RawToVoltage(VccAuxRawData);printf("Raw VccAux %lu Real VccAux %f \n", VccAuxRawData,VccAuxData);VBramRawData = XAdcPs_GetAdcData(&Adc_Struct, XADCPS_CH_VBRAM);VBramData = XAdcPs_RawToVoltage(VBramRawData);printf("Raw VccBram %lu Real VccBram %f \n", VBramRawData, VBramData);VccPIntRawData = XAdcPs_GetAdcData(&Adc_Struct, XADCPS_CH_VCCPINT);VccPIntData = XAdcPs_RawToVoltage(VccPIntRawData);printf("Raw VccPInt %lu Real VccPInt %f \n", VccPIntRawData, VccPIntData);VccPAuxRawData = XAdcPs_GetAdcData(&Adc_Struct, XADCPS_CH_VCCPAUX);VccPAuxData = XAdcPs_RawToVoltage(VccPAuxRawData);printf("Raw VccPAux %lu Real VccPAux %f \n", VccPAuxRawData, VccPAuxData);VDDRRawData = XAdcPs_GetAdcData(&Adc_Struct, XADCPS_CH_VCCPDRO);VDDRData = XAdcPs_RawToVoltage(VDDRRawData);printf("Raw VccDDR %lu Real VccDDR %f \n", VDDRRawData, VDDRData);sleep(1);}return 0; }頭文件:
#include "xparameters.h"//定義了相關(guān)的硬件設(shè)備的參數(shù),如設(shè)備ID、基地址等 #include "xadcps.h"//定義了與操作xadc相關(guān)的庫(kù)函數(shù)和結(jié)構(gòu)體結(jié)構(gòu)體:
XAdcPs_Config結(jié)構(gòu)體:存放與XADC/ADC有關(guān)的初始化信息。
XAdcPs結(jié)構(gòu)體:庫(kù)函數(shù)在對(duì)ADC操作時(shí)所使用的結(jié)構(gòu)體。
typedef struct {XAdcPs_Config Config; /**< XAdcPs_Config of current device */u32 IsReady; /**< Device is initialized and ready */} XAdcPs;庫(kù)函數(shù):
a、通過設(shè)備ID號(hào),返回定義有相關(guān)信息的XAdcPs_Config結(jié)構(gòu)體;
b、初始化ADC;
int XAdcPs_CfgInitialize(XAdcPs *InstancePtr, XAdcPs_Config *ConfigPtr,u32 EffectiveAddr)c、自測(cè),就是字面意思;
int XAdcPs_SelfTest(XAdcPs *InstancePtr)d、設(shè)置采樣模式;
void XAdcPs_SetSequencerMode(XAdcPs *InstancePtr, u8 SequencerMode)采樣模式有以下幾種:
- Default safe mode (XADCPS_SEQ_MODE_SAFE) - One pass through sequence (XADCPS_SEQ_MODE_ONEPASS) - Continuous channel sequencing (XADCPS_SEQ_MODE_CONTINPASS) - Single Channel/Sequencer off (XADCPS_SEQ_MODE_SINGCHAN) - Simulataneous sampling mode (XADCPS_SEQ_MODE_SIMUL_SAMPLING) - Independent mode (XADCPS_SEQ_MODE_INDEPENDENT)e、設(shè)置報(bào)警模式,關(guān)掉就行了;
void XAdcPs_SetAlarmEnables(XAdcPs *InstancePtr, u16 AlmEnableMask)掩碼AlmEnableMask填0,屏蔽掉了所有位。
f、使能采樣通道。
int XAdcPs_SetSeqChEnables(XAdcPs *InstancePtr, u32 ChEnableMask)通道如下:
#define XADCPS_CH_TEMP 0x0 /**< On Chip Temperature */ #define XADCPS_CH_VCCINT 0x1 /**< VCCINT */ #define XADCPS_CH_VCCAUX 0x2 /**< VCCAUX */ #define XADCPS_CH_VPVN 0x3 /**< VP/VN Dedicated analog inputs */ #define XADCPS_CH_VREFP 0x4 /**< VREFP */ #define XADCPS_CH_VREFN 0x5 /**< VREFN */ #define XADCPS_CH_VBRAM 0x6 /**< On-chip VBRAM Data Reg, 7 series */ #define XADCPS_CH_SUPPLY_CALIB 0x07 /**< Supply Calib Data Reg */ #define XADCPS_CH_ADC_CALIB 0x08 /**< ADC Offset Channel Reg */ #define XADCPS_CH_GAINERR_CALIB 0x09 /**< Gain Error Channel Reg */ #define XADCPS_CH_VCCPINT 0x0D /**< On-chip PS VCCPINT Channel , Zynq */ #define XADCPS_CH_VCCPAUX 0x0E /**< On-chip PS VCCPAUX Channel , Zynq */ #define XADCPS_CH_VCCPDRO 0x0F /**< On-chip PS VCCPDRO Channel , Zynq */ #define XADCPS_CH_AUX_MIN 16 /**< Channel number for 1st Aux Channel */ #define XADCPS_CH_AUX_MAX 31 /**< Channel number for Last Aux channel */6、先下載比特流文件配置硬件,后在sdk中run程序。
運(yùn)行結(jié)果:
總結(jié)
以上是生活随笔為你收集整理的Zedboard学习(六):XADC读取数据的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Zedboard学习(五):MIO与EM
- 下一篇: caffe学习(一):开发环境搭建,编译