当前位置:   article > 正文

ZYNQ学习之旅--PS_XADC_zynq ps和pl读温度

zynq ps和pl读温度

简介

在ZYNQ的PL端有一个数模混合模块——XADC,它是一个硬核。XADC包含两个模数转换器(ADC),
一个模拟多路复用器,片上温度和片上电压传感器等。我们可以利用这个模块监测芯片温度和供电电压,也可以用来测量外部的模拟电压信号。
ZYNQ SoC 的 XADC 模块包括两个 12 位的模数转换器,转换速率可以达到 1MSPS(每秒一百万次采
样)。它带有片上温度和电压传感器,可以测量芯片工作时的温度和供电电压。用户可以设置报警阈值,用来检测温度过高或者供电电压异常等事件。除此之外,通过 XADC 内部的模拟多路复用器,它还支持最多17 路外部模拟输入信号的测量,且支持单极、双极和差分等信号类型。在 7 系列的 FPGA 中,XADC 提供了 JTAG 和 DRP(dynamic reconfiguration port)接口,用于访问其内部的状态和控制寄存器。在 ZYNQ-7000 SoC 器件中,XADC 增加了一个 PS-XADC 接口,用于 PS 中的软
件控制 XADC 模块。
XADC 模块的系统框图如下所示:
在这里插入图片描述
在图 中 PL-JTAG 接口可以用于开发工具(Vivado)控制 XADC 模块,包括读取芯片温度信息等。而运行在 PS 中的软件则可以通过两种方式与 XADC 进行通信:
1、 通过 PS-XADC 接口,此时不需要对 PL 进行编程配置;
2、 通过 PS 到 PL 的 AXI Master 接口(M_AXI_GP),此时需要在 PL 中调用 AXI XADC IP 核。
在使用 PS 控制 XADC 时,如果对应用的性能要求较高,则推荐第二种方式,它使用的是一个并行的数
据路径(DRP 接口)。而 PS-XADC 接口同 PL-JTAG 接口一样,使用的是串行的数据路径,相对较慢。不过使用 PS-XADC 接口不占用 PL 的资源,也不需要对 PL 进行编程,只需要对 PL 部分供电即可。需要注意的是,PL-JTAG 接口与 PS-XADC 接口不能同时使用。而 XADC 可以在 PL-JTAG 接口(或 PS-XADC 接口)与 DRP 接口之间进行仲裁。

BD设计

在这里插入图片描述
配置ZYNQ核即可。

软件设计

/*
 * main.c
 */
#include <xparameters.h>
#include <xadcps.h>
#include <stdio.h>
#include <xil_types.h>
#include <xil_printf.h>
#include <sleep.h>
#define		XADC_ID		XPAR_PS7_XADC_0_DEVICE_ID

XAdcPs xadc_InstancePtr;
XAdcPs_Config *xadc_config;
u16 temp;
float temprature;
u16 vcc;
float vcc_;

int main()
{
	int status;
	xadc_config = XAdcPs_LookupConfig(XADC_ID);
	status = XAdcPs_CfgInitialize(&xadc_InstancePtr,xadc_config,xadc_config->BaseAddress);
	if(status!=XST_SUCCESS){
		print("failed\n");
		return XST_FAILURE;
	}
	status = XAdcPs_SelfTest(&xadc_InstancePtr);
	if(status!=XST_SUCCESS){
		print("failed\n");
		return XST_FAILURE;
	}
	print("selftest success\n");
	//设置为安全模式
	XAdcPs_SetSequencerMode(&xadc_InstancePtr, XADCPS_SEQ_MODE_SAFE);
	while(1){
		//获取温度
		temp = XAdcPs_GetAdcData(&xadc_InstancePtr, XADCPS_CH_TEMP);
		temprature = XAdcPs_RawToTemperature(temp);
		printf("temperature is %.04f c\n",temprature);
		vcc = XAdcPs_GetAdcData(&xadc_InstancePtr, XADCPS_CH_VCCINT);
		vcc_ = XAdcPs_RawToVoltage(vcc);
		printf("vcc is %.04f v\n",vcc_);
		sleep(2);
	}
	return 0;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/899049
推荐阅读
相关标签
  

闽ICP备14008679号