TA的每日心情 | 开心 2020-7-25 10:37 |
---|
签到天数: 40 天 连续签到: 1 天 [LV.5]常住居民I
|
ZYNQ SoC 的 XADC 模块包括两个 12 位的模数转换器,转换速率可以达到 1MSPS(每秒一百万次采样)。它带有片上温度和电压传感器,可以测量芯片工作时的温度和供电电压。用户可以设置报警阈值,用来检测温度过高或者供电电压异常等事件。除此之外,通过 XADC 内部的模拟多路复用器,它还支持最多17 路外部模拟输入信号的测量,且支持单极、双极和差分等信号类型。 在 7 系列的 FPGA 中,XADC 提供了 JTAG 和 DRP(dynamic reconfiguration port)接口,用于访问其内部的状态和控制寄存器。在 ZYNQ-7000 SoC 器件中,XADC 增加了一个 PS-XADC 接口,用于 PS 中的软件控制 XADC 模块。
XADC 模块的系统框图如下所示:
从上图可以看出FPGA访问XADC有多种方式:DRP、JTAG、AXI接口、PS-ADC接口,其中PS-ADC接口使用起来最为方便,这里我使用这个接口来测试一下XADC,通过XADC读出片内电压和温度。
在《米尔MYD-C7Z020开发板试用2---helloworld》中说了如何建立一个基本工程,这次我再Helloworld工程的基础上建立XADC测试程序。在Vivado中我们不需要做任何变动,只需要在SDK中,重写编写程序即可.
编写代码如下:
- #include "xparameters.h"
- #include "xadcps.h"
- #include "stdio.h"
- #include "xil_printf.h"
- #include "sleep.h"
- #define XADC_DEVICE_ID XPAR_XADCPS_0_DEVICE_ID //PS XADC 器件ID
- static XAdcPs xadc_inst; //XADC 驱动实例
- int main(void)
- {
- XAdcPs_Config *ConfigPtr; //XADC 配置指针
- u32 temp_rawdata; //温度 原始数据
- u32 vcc_pint_rawdata; //PS 内核电压 原始数据
- u32 vcc_paux_rawdata; //PS 辅助电压 原始数据
- u32 vcc_pddr_rawData; //PS DDR电压 原始数据
- u32 vcc_int_rawdata; //PL 内核电压 原始数据
- u32 vcc_aux_rawdata; //PL 辅助电压 原始数据
- u32 vcc_bram_rawData; //PL BRAM电压 原始数据
- float temp; //温度
- float vcc_pint; //PS 内核电压
- float vcc_paux; //PS 辅助电压
- float vcc_pddr; //PS DDR电压
- float vcc_int; //PL 内核电压
- float vcc_aux; //PL 辅助电压
- float vcc_bram; //PL BRAM电压
- //初始化XADC驱动
- ConfigPtr = XAdcPs_LookupConfig(XADC_DEVICE_ID);
- XAdcPs_CfgInitialize(&xadc_inst, ConfigPtr, ConfigPtr->BaseAddress);
- //设置XADC操作模式为“默认安全模式”
- XAdcPs_SetSequencerMode(&xadc_inst, XADCPS_SEQ_MODE_SAFE);
- while(1){
- //获取原始温度传感器数据
- temp_rawdata = XAdcPs_GetAdcData(&xadc_inst, XADCPS_CH_TEMP);
- //转换成温度信息
- temp = XAdcPs_RawToTemperature(temp_rawdata);
- //获取VCCPINT传感器数据,并转换成电压信息
- vcc_pint_rawdata = XAdcPs_GetAdcData(&xadc_inst, XADCPS_CH_VCCPINT);
- vcc_pint = XAdcPs_RawToVoltage(vcc_pint_rawdata);
- //获取VCCPAUX传感器数据,并转换成电压信息
- vcc_paux_rawdata = XAdcPs_GetAdcData(&xadc_inst, XADCPS_CH_VCCPAUX);
- vcc_paux = XAdcPs_RawToVoltage(vcc_paux_rawdata);
- //获取VCCPDRO传感器数据,并转换成电压信息
- vcc_pddr_rawData = XAdcPs_GetAdcData(&xadc_inst, XADCPS_CH_VCCPDRO);
- vcc_pddr = XAdcPs_RawToVoltage(vcc_pddr_rawData);
- //获取VCCINT传感器数据,并转换成电压信息
- vcc_int_rawdata = XAdcPs_GetAdcData(&xadc_inst, XADCPS_CH_VCCINT);
- vcc_int = XAdcPs_RawToVoltage(vcc_int_rawdata);
- //获取VCCAUX传感器数据,并转换成电压信息
- vcc_aux_rawdata = XAdcPs_GetAdcData(&xadc_inst, XADCPS_CH_VCCAUX);
- vcc_aux = XAdcPs_RawToVoltage(vcc_aux_rawdata);
- //获取VBRAM传感器数据,并转换成电压信息
- vcc_bram_rawData = XAdcPs_GetAdcData(&xadc_inst, XADCPS_CH_VBRAM);
- vcc_bram = XAdcPs_RawToVoltage(vcc_bram_rawData);
- //打印温度、电压信息
- printf("Raw Temp %lu, Real Temp %fC \n", temp_rawdata, temp);
- printf("Raw VccPInt %lu, Real VccPInt %fV \n", vcc_pint_rawdata, vcc_pint);
- printf("Raw VccPAux %lu, Real VccPAux %fV \n", vcc_paux_rawdata, vcc_paux);
- printf("Raw VccPDDR %lu, Real VccPDDR %fV \n", vcc_pddr_rawData, vcc_pddr);
- printf("Raw VccInt %lu, Real VccInt %fV \n", vcc_int_rawdata, vcc_int);
- printf("Raw VccAux %lu, Real VccAux %fV \n", vcc_aux_rawdata, vcc_aux);
- printf("Raw VccBram %lu, Real VccBram %fV \n\r", vcc_bram_rawData, vcc_bram);
- //延时5s
- sleep(5);
- }
- return 0;
- }
编译并下载后程序,实现现象如下:
附上我的工程代码:
MYiRtest1.zip
(4.19 MB, 下载次数: 3, 售价: 1 与非币)
|
|