[技术问答]

MS51用Bandgap_Voltage推VDD差距好大,根本不能用。

[复制链接]
1895|12
手机看帖
扫描二维码
随时随地手机跟帖
Q80351951|  楼主 | 2019-10-14 09:58 | 显示全部楼层 |阅读模式
本帖最后由 Q80351951 于 2019-10-14 10:10 编辑

        double  vdd_Voltage,Bandgap_Voltage;   
double READ_BANDGAP(void)
{
        UINT8 BandgapHigh, BandgapLow, BandgapMark;
        double Bandgap_Value;
        Enable_ADC_BandGap;
        set_CHPCON_IAPEN;
        IAPCN = READ_UID;
        IAPAL = 0x0d;
        IAPAH = 0x00;
        set_IAPTRG_IAPGO;
        BandgapLow = IAPFD;
        BandgapMark = BandgapLow & 0xF0;
        BandgapLow = BandgapLow & 0x0F;
        IAPAL = 0x0C;
        IAPAH = 0x00;
        set_IAPTRG_IAPGO;
        BandgapHigh = IAPFD;
        clr_CHPCON_IAPEN;
        
        Bandgap_Value = ((double)((BandgapHigh << 4) + BandgapLow));
        return (Bandgap_Value * 3072 / 4096);
}
        Bandgap_Voltage=READ_BANDGAP();
        vdd_Voltage=(((double)0x1000) / (double)ad.bandgap)*Bandgap_Voltage;

串口发出数据为  
ad.bandgap = 00725 |         Bandgap_Voltage = 01199mv |         vdd_Voltage = 06775mv |
ad.bandgap = 00726 |         Bandgap_Voltage = 01199mv |         vdd_Voltage = 06766mv |
ad.bandgap = 00727 |         Bandgap_Voltage = 01199mv |         vdd_Voltage = 06756mv |
ad.bandgap = 00727 |         Bandgap_Voltage = 01199mv |         vdd_Voltage = 06756mv |
ad.bandgap = 00728 |         Bandgap_Voltage = 01199mv |         vdd_Voltage = 06747mv |

结果实际万用表测得电压4.94V, 整个不能用,问题在哪里?






使用特权

评论回复
小明的同学| | 2019-10-14 10:23 | 显示全部楼层
        VDD_Voltage = ((float)READ_BANDGAP()/(float)ADC_BG_Result)*3.072;

使用特权

评论回复
小明的同学| | 2019-10-14 10:24 | 显示全部楼层
没有用过MS51,但是我觉得楼主的代码有问题,因为我用的ML51的是这么给测试的。

使用特权

评论回复
小明的同学| | 2019-10-14 10:26 | 显示全部楼层
/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2019 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/

//***********************************************************************************************************
//  Website: http://www.nuvoton.com
//  E-Mail : MicroC-8bit@nuvoton.com
//***********************************************************************************************************

//***********************************************************************************************************
//  File Function: ML51 series use bandgap result to calculate VDD demo code
//***********************************************************************************************************

#include "ML51.h"


double  VDD_Voltage,Bandgap_Voltage;             /*please always use "double" mode for this */
unsigned char xdata ADCdataH[5], ADCdataL[5];
unsigned int ADCsumH=0, ADCsumL=0;
   
/******************************************************************************
The main C function.  Program execution starts
here after stack initialization.
******************************************************************************/
void main (void)
{

    unsigned int  ADC_BG_Result;
  
    MFP_P31_UART0_TXD;                                /* UART0 define @P0.5 & P0.6 multi function setting */
    P31_QUASI_MODE;
    UART_Open(24000000,UART0_Timer3,115200);            /* set UART0 output, baudrate 115200 generate by timer1 */
    ENABLE_UART0_PRINTF;;
  
/* ADC bandgap initial
  * include adc.c in Library for initial setting
*/
    ADC_Open(ADC_SINGLE,VBG);  
/* For the best result wait 10us delay for each sampling, ADCDIV=3, ADCAQT=7 is better */
    ADC_ConvertTime(3,7);                             
//    ADC_Calibration();

    while (1)
    {
        clr_ADCCON0_ADCF;
        set_ADCCON0_ADCS;
        while(!(ADCCON0&SET_BIT7));
        ADC_BG_Result = (ADCRH<<4) + ADCRL;
        printf ("\n ADC_BG_Result = 0x%02X",ADC_BG_Result);
        
/***************************************************************************************/
/*                  VDD  Now                         READ_BANDGAP() VALUE
/*    ------------------------------------- = ----------------------------------
/*    3072mV(Storage value test condition)      NOW ADC Bandgap convert reuslt
/***************************************************************************************/
        VDD_Voltage = ((float)READ_BANDGAP()/(float)ADC_BG_Result)*3.072;
        printf ("\n VDD_Voltage = %e",VDD_Voltage);

                        /***************************************************************************************/
/*            Bandgap real voltage                    READ_BANDGAP() VALUE
/*    ------------------------------------- = ----------------------------------
/*    3072mV(Storage value test condition)              4096(12bit ADC)
/***************************************************************************************/
        Bandgap_Voltage = ((float)READ_BANDGAP()*3/4/1000);
        printf ("\n Bandgap_Voltage = %e", Bandgap_Voltage);

        ADCsumH = 0;
        ADCsumL = 0;
        printf ("\n " );
        printf ("\n " );
    }

}


使用特权

评论回复
小明的同学| | 2019-10-14 10:26 | 显示全部楼层
另外给你找了MS51官方的例子,你可以试试看
/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2019 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/

/***********************************************************************************************************/
/*  Website: http://www.nuvoton.com                                                                        */
/*  E-Mail : MicroC-8bit@nuvoton.com                                                                       */
/*  Date   : June/21/2019                                                                                   */
/***********************************************************************************************************/

//**********************************************************************************************************/
//  File Function: MS51 ADC read bandgap to VDD demo code                                                  */
//**********************************************************************************************************/

#include "MS51_8K.h"

//*****************  The Following is in define in Fucntion_define.h  ***************************
//****** Always include Function_define.h call the define you want, detail see main(void) *******
//***********************************************************************************************
double  Bandgap_Voltage,VDD_Voltage,Bandgap_Value;      //please always use "double" mode for this
unsigned  char xdata ADCdataH[5], ADCdataL[5];
int ADCsumH=0, ADCsumL=0;
unsigned char ADCavgH,ADCavgL;

void READ_BANDGAP()
{
    UINT8 BandgapHigh,BandgapLow,BandgapMark;
  
    set_CHPCON_IAPEN;
    IAPCN = READ_UID;
    IAPAL = 0x0d;
    IAPAH = 0x00;
    set_IAPTRG_IAPGO;
    BandgapLow = IAPFD;
    BandgapMark = BandgapLow&0xF0;
    BandgapLow = BandgapLow&0x0F;
    IAPAL = 0x0C;
    IAPAH = 0x00;
    set_IAPTRG_IAPGO;
    BandgapHigh = IAPFD;
    Bandgap_Value = (BandgapHigh<<4)+BandgapLow;
    Bandgap_Voltage= Bandgap_Value*3/4;
    clr_CHPCON_IAPEN;
}

/******************************************************************************
The main C function.  Program execution starts
here after stack initialization.
******************************************************************************/
void main (void)
{
    double bgvalue;
    unsigned int i;

/*Read bandgap value */
    READ_BANDGAP();
/* ADC Low speed initial*/  
    ENABLE_ADC_BANDGAP;
    ADCCON1|=0x30;            /* clock divider */
    ADCCON2|=0x0E;            /* AQT time */
    AUXR1|=SET_BIT4;          /* ADC clock low speed */
/*start bandgap ADC */
    clr_ADCCON0_ADCF;
    set_ADCCON0_ADCS;                                
    while(ADCF == 0);
    ADCdataH[i] = ADCRH;
    ADCdataL[i] = ADCRL;
/* to convert VDD value */
    bgvalue = (ADCRH<<4) + ADCRL;
    VDD_Voltage = (0x1000/bgvalue)*Bandgap_Voltage;

/* UART0 settting for printf function */
    MODIFY_HIRC_24();
    UART_Open(24000000,UART0_Timer3,115200);
    ENABLE_UART0_PRINTF;
/*printf result value */
    printf ("\n BG Voltage = %e", Bandgap_Voltage);
    printf ("\n VDD voltage = %e", VDD_Voltage);
    while(1);

}


使用特权

评论回复
小明的同学| | 2019-10-14 10:27 | 显示全部楼层
/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2019 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/

/***********************************************************************************************************/
/*  Website: http://www.nuvoton.com                                                                        */
/*  E-Mail : MicroC-8bit@nuvoton.com                                                                       */
/*  Date   : Jan/21/2019                                                                                   */
/***********************************************************************************************************/

//**********************************************************************************************************/
//  File Function: MS51 ADC read bandgap to VDD demo code                                                  */
//**********************************************************************************************************/

#include "MS51_16K.H"

//*****************  The Following is in define in Fucntion_define.h  ***************************
//****** Always include Function_define.h call the define you want, detail see main(void) *******
//***********************************************************************************************
double  Bandgap_Voltage,VDD_Voltage,Bandgap_Value;      //please always use "double" mode for this
unsigned  char xdata ADCdataH[5], ADCdataL[5];
int ADCsumH=0, ADCsumL=0;
unsigned char ADCavgH,ADCavgL;

void READ_BANDGAP()
{
    UINT8 BandgapHigh,BandgapLow,BandgapMark;
  
    set_CHPCON_IAPEN;
    IAPCN = READ_UID;
    IAPAL = 0x0d;
    IAPAH = 0x00;
    set_IAPTRG_IAPGO;
    BandgapLow = IAPFD;
    BandgapMark = BandgapLow&0xF0;
    BandgapLow = BandgapLow&0x0F;
    IAPAL = 0x0C;
    IAPAH = 0x00;
    set_IAPTRG_IAPGO;
    BandgapHigh = IAPFD;
    Bandgap_Value = (BandgapHigh<<4)+BandgapLow;
    Bandgap_Voltage= Bandgap_Value*3/4;
    clr_CHPCON_IAPEN;
}

/******************************************************************************
The main C function.  Program execution starts
here after stack initialization.
******************************************************************************/
void main (void)
{
    double bgvalue;
    unsigned int i;

/*Read bandgap value */
    READ_BANDGAP();
/* ADC Low speed initial*/  
    ENABLE_ADC_BANDGAP;
    ADCCON1|=0x30;            /* clock divider */
    ADCCON2|=0x0E;            /* AQT time */
    AUXR1|=SET_BIT4;          /* ADC clock low speed */
/*start bandgap ADC */
    clr_ADCCON0_ADCF;
    set_ADCCON0_ADCS;                                
    while(ADCF == 0);
    ADCdataH[i] = ADCRH;
    ADCdataL[i] = ADCRL;
/* to convert VDD value */
    bgvalue = (ADCRH<<4) + ADCRL;
    VDD_Voltage = (0x1000/bgvalue)*Bandgap_Voltage;

/* UART0 settting for printf function */
    MODIFY_HIRC_24();
    UART_Open(24000000,UART0_Timer3,115200);
    ENABLE_UART0_PRINTF;
/*printf result value */
    printf ("\n BG Voltage = %e", Bandgap_Voltage);
    printf ("\n VDD voltage = %e", VDD_Voltage);
    while(1);

}


使用特权

评论回复
小明的同学| | 2019-10-14 10:27 | 显示全部楼层
不知道楼主试过这个官方的BSP提供的例子没。

使用特权

评论回复
Q80351951|  楼主 | 2019-10-14 17:16 | 显示全部楼层
小明的同学 发表于 2019-10-14 10:27
不知道楼主试过这个官方的BSP提供的例子没。

我这个和官方的一样呀,就是官方改来的。

使用特权

评论回复
antusheng| | 2019-10-14 20:48 | 显示全部楼层
你先别乱改,直接跑官方的例子,看看print的结果是什么。

使用特权

评论回复
connorzhang| | 2021-1-21 17:11 | 显示全部楼层
本帖最后由 connorzhang 于 2021-1-21 17:34 编辑

我用ML51_BSP_Keil_C51_V1.00\SampleCode\StdDriver\ADC_Bandgap_VDD 这个例子打印出来一直是这个,不知道是哪里的问题,我的vdd 上接的3.3v,芯片用的 ML51FB9AE:
ADC_BG_Result = 0xFFF
VDD_Voltage = 8.184499e-01
Bandgap_Voltage = 8.182500e-01


ADC_BG_Result = 0xFFF
VDD_Voltage = 8.184499e-01
Bandgap_Voltage = 8.182500e-01

使用特权

评论回复
coshi| | 2021-2-6 10:10 | 显示全部楼层
楼主的这个题目我就没看明白

使用特权

评论回复
zljiu| | 2021-2-6 10:11 | 显示全部楼层
楼主说的有点矛盾 一会儿说是跟官方一样的 一会儿说是根据官方改了的

使用特权

评论回复
wiba| | 2021-2-6 10:17 | 显示全部楼层
可以用工具对比一下你的程序和官方程序哪里不一样

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

43

主题

253

帖子

5

粉丝