FPGA_ZYNQ_XADC

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

使用芯片内部 XADC 采集片上电压以及温度

一、ADC介绍

Xilinx 7 系列的 ADC 是一个双 12 位分辨率的而且每秒一兆(MSPS, 1 Mega sample per second)采样速率的模数转换器,是一种通用的、高精度的模数转换器,双通道的 ADC 支持单极和差分输入工作模式,其最多可支持 17路外部模拟输入通道。

在这里插入图片描述

由图可看到 ADC 分为 12 位的 A 和 B 两个其中
ADC A 可以对供电电压进行采样,供电电压包括 VCCINT、VCCAUX、VCCBRAM,其中 Zynq-7000 系列的芯片还支持对 VCCPINT、VCCPAUX 和 VCCO_DDR 的采样,还包括温度的采样和外部模拟输入的采样。ADC B 只能对外部模拟输入进行采样转换

二、使用步骤

1.搭建FPGA BD工程

1.1新建工程

新建工程
板卡选择

1.2搭建 FPGA BD 工程

创建BD文件,添加并配置ZYNQ处理器
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
把PS的时钟可以接入PL部分,连接FCLK_CLK0和M_AXI_GPO_ACLK
在这里插入图片描述双击ZYNQ CPU IP,对其进行设置,使其对应我们的硬件设置,否则SDK的程序会崩溃。
时钟配置
在这里插入图片描述
内存配置
MZ7XA-7020、MZ7XB-7020、MZ702N、MZ702P、MZ7015、MZ7035、MZ7100 的内存型号为 1024GB,选取内存型号MT41K256M16RE-125
MZ7XA-7010mini 的内存为 512MB,选取内存型号:MT41K128M16 JT-125
在这里插入图片描述
设置外设接口,Bank0 IO Voltage为LVCMOS3.3V,Bank1 IO Voltage为LVCMOS1.8V
QSPI FLASH配置:
在这里插入图片描述串口配置:
在这里插入图片描述
添加XADC的IP到BD文件
在这里插入图片描述双击XADC进行配置
采样方式采用 AXI4Lite,连续采样模式,Channel Sequencer 模式,DCLK 设置 100M
在这里插入图片描述
勾选采集信号
VCCINT:内部 PL 核心电压
VREFP:XADC 正参考电压
VREFN:XADC 负参考电压
VCCBram:PL BRAM 电压
VCCPInt:PS 内部核心电压
VCCPAux:PS 辅助电压
VCCDdr:DDR RAM 的工作电压在这里插入图片描述
在这里插入图片描述

右击 system.bd, 单击Generate Output Products
在这里插入图片描述
在这里插入图片描述
右击system.bd 选择 Create HDL Wrapper
在这里插入图片描述

1.3生成bit文件导入硬件加载SDK

生成 Bit 文件。导出到硬件: FileExport HardwareInclude bitstream
加载 SDK:FileLaunch SDKOK

2.新建SDK工程

选择 File->New->Application Project
在这里插入图片描述
将例程主函数复制到工程工程函数

<fo代码如下(示例):

/*
 * 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();

    //printf("Adam Edition MicroZed Using Vivado How To Printf \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);

			VccIntRawData= 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;
}



3.代码分析

代码如下(示例):

data = pd.read_csv(
    'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())

该处使用的url网络请求的数据。


代码分析

在系统查找,是否有这个设备的定义
  ConfigPtr = XAdcPs_LookupConfig(XPAR_AXI_XADC_0_DEVICE_ID);
       if (ConfigPtr == NULL) {
           return XST_FAILURE;
         }
将传入的ID参数与xilinx头文件中已定义的XADC的设备ID进行相等判断
如果一致将XAdcPs_ConfigTable地址返回,否则返回空
XAdcPs_Config *XAdcPs_LookupConfig(u16 DeviceId)
{
	XAdcPs_Config *CfgPtr = NULL;
	u32 Index;

	for (Index=0; Index < 1; Index++) {
		if (XAdcPs_ConfigTable[Index].DeviceId == DeviceId) {
			CfgPtr = &XAdcPs_ConfigTable[Index];
			break;
		}
	}

	return CfgPtr;
}
设备初始化
       Status_ADC = XAdcPs_CfgInitialize(XADCInstPtr,ConfigPtr,ConfigPtr->BaseAddress);
       if(XST_SUCCESS != Status_ADC){
           print("ADC INIT FAILED\n\r");
           return XST_FAILURE;
        }
采样前自检
       Status_ADC = XAdcPs_SelfTest(XADCInstPtr);
     if (Status_ADC != XST_SUCCESS) {
       return XST_FAILURE;
     }

停止定序器并关闭警告
		XAdcPs_SetSequencerMode(XADCInstPtr,XADCPS_SEQ_MODE_SINGCHAN);
		XAdcPs_SetAlarmEnables(XADCInstPtr, 0x0);
复位定序器并设为输入模式,使能采样通道
XAdcPs_SetSeqInputMode(XADCInstPtr, XADCPS_SEQ_MODE_SAFE);		XAdcPs_SetSeqChEnables(XADCInstPtr,XADCPS_CH_TEMP|XADCPS_CH_VCCINT|XADCPS_CH_VCCAUX|XADCPS_CH_VBRAM|XADCPS_CH_VCCPINT| XADCPS_CH_VCCPAUX|XADCPS_CH_VCCPDRO);
最后通过XAdcPs_GetAdcData获取对应值,库中有对应数值转换函数
以获取温度为例
		TempRawData = XAdcPs_GetAdcData(XADCInstPtr, XADCPS_CH_TEMP);
			TempData = XAdcPs_RawToTemperature(TempRawData);
在库中有#define XAdcPs_RawToTemperature(AdcData)				\
	((((float)(AdcData)/65536.0f)/0.00198421639f ) - 273.15f)

总体步骤:

1,查询id
2,初始化设备
3,关闭定定序器
4,关闭报警
5,复位定序器,设为输入模式
6,使能采样通道
7,获取采样值

  • 2
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
UG480是Xilinx 7系列FPGA的用户指南,其中的XADC是用于模拟信号转换的外设模块。测试UG480_7series_XADC需要以下步骤: 1. 准备测试平台:首先,您需要准备一块支持7系列FPGA的开发板,例如Xilinx的Zynq-7000系列开发板。确保您已经成功安装了Vivado开发套件,并且设备正确连接和供电。 2. 打开Vivado开发工具:使用Vivado打开一个新的项目或加载现有的项目,确保已经选择了正确的7系列FPGA设备。 3. 添加XADC模块:打开设计工程,在设计视图中添加一个XADC模块。可以通过点击“添加IP”按钮并搜索“XADC”,然后将其添加到设计中。 4. 配置XADC模块:打开XADC模块的配置界面,选择适当的通道和采样率,并进行其他相关设置。 5. 连接和引脚分配:使用Vivado工具进行引脚约束和连接,将XADC模块的输入引脚与所需的信号连接起来。 6. 合成和实现:在Vivado工具中对设计进行综合和实现,以生成位流文件。 7. 下载到开发板:将位流文件下载到目标开发板中,确保设备正确连接和供电。 8. 执行测试:执行所需的测试流程,可以使用Vivado提供的调试工具进行波形查看和验证。 通过以上步骤,您可以测试UG480_7series_XADC并验证其功能是否按照预期工作。请注意,在测试过程中,您可能需要参考UG480指南的具体章节,以了解有关配置和使用XADC模块的更多详细信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值