参考文档:
1.xilinx UG480 <<7 Series FPGAs and Zynq-7000 SoC XADC Dual 12-Bit 1 MSPS Analog-to-Digital Converter User Guide>>
2.xilinx PG019 <<LogiCORE IP AXI XADC v1.00a Product Guide>>
XADC硬件框图:
XADC包括双12位、每秒1兆样本(MSPS)的 ADC和一系列片上温度电压传感器。同时adc提供了通用的、高精度的模拟接口。该adc支持多种工作模式,例如外部触发和同步采样模式,同时支持单端或者差分模拟信号输入,最高支持外部17个通道的模拟输入。
XADC自带几个片上传感器,支持对片上电源电压和模具温度的测量。ADC转换数据存储在称为状态寄存器的专用寄存器中。这些寄存器可以通过使用称为动态重配置端口(DRP)的16位同步读写端口访问,该端口时序图见文档UG480。ADC转换数据也可以通过JTAG TAP访问,不需要实例化XADC,直接在hard mannger界面即可访问XADC内部状态寄存器,查看芯片温度电压等模拟量。
XADC支持多种操作模式。最基本的操作模式叫缺省模式,缺省模式下XADC模块专用于监视芯片上的供电电压和芯片温度,这时XADC模块并不需要用户对其进行配置。另外一个为同步采样模式,按预定的步骤顺序采样两个外部的模拟输入信号,并把采样结果存储在状态寄存器内。单通道模式,在这种模式下,用户必须通过写控制寄存器40H的CH4到CH0比特来选择一个要采样的通道。另外控制寄存器40H的BU(analog input mode)和ACQ(settling TIme)两个参数也必须设置。独立ADC模式,在这种模式下,ADC A是固定用来实现一个类似于缺省模式的“监控模式”,报警输出功能是有效的,用户必须设置正确的报警门限;ADC B只能用来测量外部的模拟输入。Single Pass模式,在这种模式下,按用户选择的采样顺序序列顺序采样一遍后停止ADC。采样顺序序列是由用户写序列通道选择寄存器48H和49H来设定的。ConTInuous Sequence连续序列模式,这种模式和Single Pass模式很相似,区别是采样完一遍后系统自动重新开始序列采样,故为连续采样。
缺省模式下XADC模块专用于监视芯片上的供电电压和芯片温度,故我们只需要使用缺省模式,上电直接读取对应传感器状态寄存器的值即可。对应的状态寄存器说明如下:
其中寄存器值对应模拟量的转换公式说明如下:
在Xilinx的SDK驱动程序中,这些转换已经封装成了一系列函数,直接使用即可。
除了直接使用XADC硬件原语的DRP接口操作XADC之外,Xilinx提供了一个封装好的AXI_lite接口的ip供我们使用。
ip框图如下:
对应的一些列寄存器详细说明参考PG019文档。
IP名:XADC Wizard(3.3)
平台:XC7K325TFFG900-2
Basic界面配置:
ADC Setup界面配置:
Alarms界面配置:
可以设定阈值,一旦超过阈值对应的alarm信号拉高(有对应的alarm寄存器)报警。
Channel Sequencer界面配置:
将配置好的axi接口的XADC挂载到MicroBlaze软核上,同时挂载一个axi_uart用于输出打印温度电压等信息。
函数说明:XSysMon_LookupConfig
函数原型
XSysMon_Config *XSysMon_LookupConfig(u16 DeviceId)
函数名
XSysMon_LookupConfig
查找XADC的配置
参数1
u16 DeviceId
XADC设备ID
返回值
XSysMon_Config *
指向XADC配置的指针
XSysMon_Config结构体定义:
typedef struct {
u16 DeviceId; /< Unique ID of device */
UINTPTR BaseAddress; /< Device base address */
int IncludeInterrupt; /< Supports Interrupt driven mode */
u8 IpType; /< 1 - System Management */
/< 0 - XADC/System Monoitor */
} XSysMon_Config;
函数说明:XSysMon_CfgInitialize
函数原型
int XSysMon_CfgInitialize(XSysMon *InstancePtr, XSysMon_Config *ConfigPtr,
UINTPTR EffectiveAddr)
函数名
XSysMon_CfgInitialize
XADC初始化
参数1
XSysMon *InstancePtr
指向XADC实例的指针
参数2
XSysMon_Config*ConfigPtr
指向XADC配置的指针
参数3
UINTPTR EffectiveAddr
XADC设备基地址
返回值
int
XST_SUCCESS
XSysMon结构体定义:
typedef struct {
XSysMon_Config Config; /< XSysMon_Config of current device */
u32 IsReady; /< Device is initialized and ready */
u32 Mask; /< Store the previously written value
in CONVST register */
} XSysMon;
函数说明:XSysMon_SelfTest
函数原型
int XSysMon_SelfTest(XSysMon *InstancePtr)
函数名
XSysMon_SelfTest
XADC自检函数
参数1
XSysMon *InstancePtr
指向XADC实例的指针
返回值
int
XST_SUCCESS/XST_FAILURE
函数说明:XSysMon_GetAdcData
函数原型
u16 XSysMon_GetAdcData(XSysMon *InstancePtr, u8 Channel)
函数名
XSysMon_GetAdcData
获取状态寄存器数据
参数1
XSysMon *InstancePtr
指向XADC实例的指针
参数2
u8 Channel
获取数据的通道号
返回值
u16
读取的数据
宏定义:XSysMon_RawToTemperature(AdcData)
说明:将状态寄存器读取的值进行公式转换成摄氏度。
#define XSysMon_RawToTemperature(AdcData)
((((float)(AdcData)/65536.0f)/0.00f ) - 273.15f)
宏定义:XSysMon_RawToVoltage(AdcData)
说明:将状态寄存器读取的值进行公式转换成电压,单位V
#define XSysMon_RawToVoltage(AdcData)
((((float)(AdcData))* (3.0f))/65536.0f)
本例程测试读取芯片温度,以及内核和辅助电压,每隔一段时间将读取的值通过串口打印出来。测试结果如下:
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/bcyy/64313.html