Zedboard学习(六):XADC读取数据

zynq 的内嵌了 XADC,可以用来采集电压;

Temp:芯片温度
VCCINT: 内部PL核心电压
VCCAUX: 辅助PL电压
VCCBram: PL BRAM电压
VCCPInt: PS内部核心电压
VCCPAux: PS辅助电压
VCCDDR: DDR RAM的工作电压
VREFP: XADC正参考电压
VREFN: XADC负参考电压

1、新建工程,添加block design。添加zynq7 processor和xadc模块。
这里写图片描述

2、Run Block Automation后会自动配置zynq7处理器;Run Connection Automation 会自动将模块进行连接,将xadc模块挂载在axi总线下,这样xadc的相关寄存器会映射到处理器的内存(DDR)上。自动添加的两个模块,一个用于管理全局复位,一个用于同步axi总线。
这里写图片描述

点击这里写图片描述 自动重新对整个block design布局。

3、保存并生成顶层头文件。
这里写图片描述

4、生成比特流文件,等会儿就生成好了。

5、导出比特流,打开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 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;

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

    //设置采样模式
    XAdcPs_SetSequencerMode(&Adc_Struct, XADCPS_SEQ_MODE_SINGCHAN);

    //设置报警使能,直接关闭掉
    XAdcPs_SetAlarmEnables(&Adc_Struct, 0x0);

    //设置使能采样通道
    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"//定义了相关的硬件设备的参数,如设备ID、基地址等
#include "xadcps.h"//定义了与操作xadc相关的库函数和结构体

结构体:
XAdcPs_Config结构体:存放与XADC/ADC有关的初始化信息。

typedef struct {
    u16  DeviceId;      /**< Unique ID of device */
    u32  BaseAddress;   /**< Device base address */
} XAdcPs_Config;

XAdcPs结构体:库函数在对ADC操作时所使用的结构体。

typedef struct {
    XAdcPs_Config Config;   /**< XAdcPs_Config of current device */
    u32  IsReady;       /**< Device is initialized and ready  */

} XAdcPs;

库函数:
a、通过设备ID号,返回定义有相关信息的XAdcPs_Config结构体;

XAdcPs_Config *XAdcPs_LookupConfig(u16 DeviceId)

b、初始化ADC;

int XAdcPs_CfgInitialize(XAdcPs *InstancePtr, XAdcPs_Config *ConfigPtr,u32 EffectiveAddr)

c、自测,就是字面意思;

int XAdcPs_SelfTest(XAdcPs *InstancePtr)

d、设置采样模式;

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、设置报警模式,关掉就行了;

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程序。
运行结果:
这里写图片描述

  • 0
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值