XADC内嵌在PS端的使用

xadc内嵌在ps端,允许cpu或其他主机连接xadc,而不用使用pl端。xadc最大采样率为1msps,精度为12bits,内置电压和温度传感器,可监测芯片的电压及温度信息。如图所示电压传感器可监测芯片的vccint,vccaux,vccbram等,vp_0和vn_0为一对专用的adc模拟输入口。vauxp[*]和vauxn[*]也是adc输入口,但是不用作adc输入口时,可用作普通io使用。
int xadcpolledprintfexample(u16 xadcdeviceid)
{
    int status;
    xadcps_config *configptr;
    u32 temprawdata;
    u32 vccpintrawdata;
    u32 vccpauxrawdata;
    u32 vccpdrorawdata;
    float tempdata;
    float vccpintdata;
    float vccpauxdata;
    float maxdata;
    float mindata;
    xadcps *xadcinstptr = &xadcinst;
printf( entering the xadc polledexample. );
/*
     * initialize the xadc driver.
     */
    configptr= xadcps_lookupconfig(xadcdeviceid);
    if (configptr == null) {
        return xst_failure;
    }
    xadcps_cfginitialize(xadcinstptr,configptr,
                configptr->baseaddress);
/*
     * self test the xadc/adc device
     */
    status= xadcps_selftest(xadcinstptr);
    if (status != xst_success) {
        return xst_failure;
    }
/*
     * disable the channel sequencer beforeconfiguring the sequence
     * registers.
     */
    xadcps_setsequencermode(xadcinstptr,xadcps_seq_mode_safe);
    /*
     * read the on-chip temperature data(current/maximum/minimum)
     * from the adc data registers.
     */
    temprawdata= xadcps_getadcdata(xadcinstptr, xadcps_ch_temp);
    tempdata= xadcps_rawtotemperature(temprawdata);
    printf( the current temperature is%0d.%03d centigrades. ,
                (int)(tempdata), xadcfractiontoint(tempdata));
temprawdata= xadcps_getminmaxmeasurement(xadcinstptr, xadcps_max_temp);
    maxdata= xadcps_rawtotemperature(temprawdata);
    printf(the maximum temperature is%0d.%03d centigrades. ,
                (int)(maxdata), xadcfractiontoint(maxdata));
temprawdata= xadcps_getminmaxmeasurement(xadcinstptr, xadcps_min_temp);
    mindata= xadcps_rawtotemperature(temprawdata & 0xfff0);
    printf(the minimum temperature is%0d.%03d centigrades. ,
                (int)(mindata), xadcfractiontoint(mindata));
/*
     * read the vccpint votage data(current/maximum/minimum) from the
     * adc data registers.
     */
    vccpintrawdata= xadcps_getadcdata(xadcinstptr, xadcps_ch_vccpint);
    vccpintdata= xadcps_rawtovoltage(vccpintrawdata);
    printf( the current vccpint is%0d.%03d volts. ,
            (int)(vccpintdata),xadcfractiontoint(vccpintdata));
vccpintrawdata= xadcps_getminmaxmeasurement(xadcinstptr,
                            xadcps_max_vccpint);
    maxdata= xadcps_rawtovoltage(vccpintrawdata);
    printf(the maximum vccpint is %0d.%03dvolts. ,
            (int)(maxdata), xadcfractiontoint(maxdata));
vccpintrawdata= xadcps_getminmaxmeasurement(xadcinstptr,
                            xadcps_min_vccpint);
    mindata= xadcps_rawtovoltage(vccpintrawdata);
    printf(the minimum vccpint is %0d.%03dvolts. ,
            (int)(mindata), xadcfractiontoint(mindata));
/*
     * read the vccpaux votage data(current/maximum/minimum) from the
     * adc data registers.
     */
    vccpauxrawdata= xadcps_getadcdata(xadcinstptr, xadcps_ch_vccpaux);
    vccpauxdata= xadcps_rawtovoltage(vccpauxrawdata);
    printf( the current vccpaux is%0d.%03d volts. ,
            (int)(vccpauxdata),xadcfractiontoint(vccpauxdata));
vccpauxrawdata= xadcps_getminmaxmeasurement(xadcinstptr,
                                xadcps_max_vccpaux);
    maxdata= xadcps_rawtovoltage(vccpauxrawdata);
    printf(the maximum vccpaux is %0d.%03dvolts. ,
                (int)(maxdata), xadcfractiontoint(maxdata));
vccpauxrawdata= xadcps_getminmaxmeasurement(xadcinstptr,
                                xadcps_min_vccpaux);
    mindata= xadcps_rawtovoltage(vccpauxrawdata);
    printf(the minimum vccpaux is %0d.%03dvolts. ,
                (int)(mindata), xadcfractiontoint(mindata));
/*
     * read the vccpdro votage data(current/maximum/minimum) from the
     * adc data registers.
     */
    vccpdrorawdata= xadcps_getadcdata(xadcinstptr, xadcps_ch_vccpdro);
    vccpintdata= xadcps_rawtovoltage(vccpdrorawdata);
    printf( the current vccpddro is%0d.%03d volts. ,
            (int)(vccpintdata), xadcfractiontoint(vccpintdata));
vccpdrorawdata= xadcps_getminmaxmeasurement(xadcinstptr,
                            xadcps_max_vccpdro);
    maxdata= xadcps_rawtovoltage(vccpdrorawdata);
    printf(the maximum vccpddro is %0d.%03dvolts. ,
            (int)(maxdata), xadcfractiontoint(maxdata));
vccpdrorawdata= xadcps_getminmaxmeasurement(xadcinstptr,
                            xadcps_min_vccpdro);
    mindata= xadcps_rawtovoltage(vccpdrorawdata);
    printf(the minimum vccpddro is %0d.%03dvolts. ,
            (int)(mindata), xadcfractiontoint(mindata));
printf(exiting the xadc polled example. );
return xst_success;
}
/****************************************************************************/
/**
*
* this function converts the fractionpart of the given floating point number
* (after the decimal point)to aninteger.
*
* @param    floatnum is the floating point number.
*
* @return   integer number to a precision of 3 digits.
*
* @note
* this function is used in the printingof floating point data to a stdio device
* using the xil_printf function. thexil_printf is a very small foot-print
* printf function and does notsupport the printing of floating point numbers.
*
*****************************************************************************/
int xadcfractiontoint(float floatnum)
{
    float temp;
temp= floatnum;
    if (floatnum < 0) {
        temp= -(floatnum);
    }
return( ((int)((temp -(float)((int)temp)) * (1000.0f))));
}
原文标题:zynq中ps端xadc
文章出处:【微信公众号:fpga之家】欢迎添加关注!文章转载请注明出处。

混合动力系统代表动力总成系统电气化的第一步
MAX2165单回路AGC控制方案,适用于中国地面电视标准GB20600
一文知晓晶振电路工作原理
AR技术还原贞子爬出电视
什么是饱和变压器?饱和变压器的特点和应用场景有哪些?
XADC内嵌在PS端的使用
百度飞桨登顶图神经网络权威榜单3项榜首,重磅推出UniMP
云计算的3种服务形式
分享一个开源的QT的串口示波器
如何使用基于ESP8266的NodeMCU原型板和电机控制板来控制两种类型的电机
贸泽电子开售适合无线物联网应用的 STMicroelectronics STEVAL-MKBOXPRO套件
新iPhone疑似曝光 后置摄像头将和华为Mate20浴霸样式相似
如何有效使用RISC-V的跟踪技术
什么是超声波聚能器?
压电技术在TDLAS气体检测中的应用
用Python实现十大经典排序算法(附动图)
关于块写周期时序图的应用
TMS320F2812在无极变速器中的原理应用及流程图
超级电容器的原理是什么,简单分析一下
机载光学全谱段遥感林火监测