[技术问答] MS51用Bandgap_Voltage推VDD差距好大,根本不能用。

[复制链接]
550|8
 楼主 | 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 | 显示全部楼层
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /*                                                                                                         */
  3. /* Copyright(c) 2019 Nuvoton Technology Corp. All rights reserved.                                         */
  4. /*                                                                                                         */
  5. /*---------------------------------------------------------------------------------------------------------*/

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

  10. //***********************************************************************************************************
  11. //  File Function: ML51 series use bandgap result to calculate VDD demo code
  12. //***********************************************************************************************************

  13. #include "ML51.h"


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

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

  38.     while (1)
  39.     {
  40.         clr_ADCCON0_ADCF;
  41.         set_ADCCON0_ADCS;
  42.         while(!(ADCCON0&SET_BIT7));
  43.         ADC_BG_Result = (ADCRH<<4) + ADCRL;
  44.         printf ("\n ADC_BG_Result = 0x%02X",ADC_BG_Result);
  45.         
  46. /***************************************************************************************/
  47. /*                  VDD  Now                         READ_BANDGAP() VALUE
  48. /*    ------------------------------------- = ----------------------------------
  49. /*    3072mV(Storage value test condition)      NOW ADC Bandgap convert reuslt
  50. /***************************************************************************************/
  51.         VDD_Voltage = ((float)READ_BANDGAP()/(float)ADC_BG_Result)*3.072;
  52.         printf ("\n VDD_Voltage = %e",VDD_Voltage);

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

  60.         ADCsumH = 0;
  61.         ADCsumL = 0;
  62.         printf ("\n " );
  63.         printf ("\n " );
  64.     }

  65. }


复制代码

使用特权

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

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

  11. //**********************************************************************************************************/
  12. //  File Function: MS51 ADC read bandgap to VDD demo code                                                  */
  13. //**********************************************************************************************************/

  14. #include "MS51_8K.h"

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

  22. void READ_BANDGAP()
  23. {
  24.     UINT8 BandgapHigh,BandgapLow,BandgapMark;
  25.   
  26.     set_CHPCON_IAPEN;
  27.     IAPCN = READ_UID;
  28.     IAPAL = 0x0d;
  29.     IAPAH = 0x00;
  30.     set_IAPTRG_IAPGO;
  31.     BandgapLow = IAPFD;
  32.     BandgapMark = BandgapLow&0xF0;
  33.     BandgapLow = BandgapLow&0x0F;
  34.     IAPAL = 0x0C;
  35.     IAPAH = 0x00;
  36.     set_IAPTRG_IAPGO;
  37.     BandgapHigh = IAPFD;
  38.     Bandgap_Value = (BandgapHigh<<4)+BandgapLow;
  39.     Bandgap_Voltage= Bandgap_Value*3/4;
  40.     clr_CHPCON_IAPEN;
  41. }

  42. /******************************************************************************
  43. The main C function.  Program execution starts
  44. here after stack initialization.
  45. ******************************************************************************/
  46. void main (void)
  47. {
  48.     double bgvalue;
  49.     unsigned int i;

  50. /*Read bandgap value */
  51.     READ_BANDGAP();
  52. /* ADC Low speed initial*/  
  53.     ENABLE_ADC_BANDGAP;
  54.     ADCCON1|=0x30;            /* clock divider */
  55.     ADCCON2|=0x0E;            /* AQT time */
  56.     AUXR1|=SET_BIT4;          /* ADC clock low speed */
  57. /*start bandgap ADC */
  58.     clr_ADCCON0_ADCF;
  59.     set_ADCCON0_ADCS;                                
  60.     while(ADCF == 0);
  61.     ADCdataH[i] = ADCRH;
  62.     ADCdataL[i] = ADCRL;
  63. /* to convert VDD value */
  64.     bgvalue = (ADCRH<<4) + ADCRL;
  65.     VDD_Voltage = (0x1000/bgvalue)*Bandgap_Voltage;

  66. /* UART0 settting for printf function */
  67.     MODIFY_HIRC_24();
  68.     UART_Open(24000000,UART0_Timer3,115200);
  69.     ENABLE_UART0_PRINTF;
  70. /*printf result value */
  71.     printf ("\n BG Voltage = %e", Bandgap_Voltage);
  72.     printf ("\n VDD voltage = %e", VDD_Voltage);
  73.     while(1);

  74. }


复制代码

使用特权

评论回复
| 2019-10-14 10:27 | 显示全部楼层
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /*                                                                                                         */
  3. /* Copyright(c) 2019 Nuvoton Technology Corp. All rights reserved.                                         */
  4. /*                                                                                                         */
  5. /*---------------------------------------------------------------------------------------------------------*/

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

  11. //**********************************************************************************************************/
  12. //  File Function: MS51 ADC read bandgap to VDD demo code                                                  */
  13. //**********************************************************************************************************/

  14. #include "MS51_16K.H"

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

  22. void READ_BANDGAP()
  23. {
  24.     UINT8 BandgapHigh,BandgapLow,BandgapMark;
  25.   
  26.     set_CHPCON_IAPEN;
  27.     IAPCN = READ_UID;
  28.     IAPAL = 0x0d;
  29.     IAPAH = 0x00;
  30.     set_IAPTRG_IAPGO;
  31.     BandgapLow = IAPFD;
  32.     BandgapMark = BandgapLow&0xF0;
  33.     BandgapLow = BandgapLow&0x0F;
  34.     IAPAL = 0x0C;
  35.     IAPAH = 0x00;
  36.     set_IAPTRG_IAPGO;
  37.     BandgapHigh = IAPFD;
  38.     Bandgap_Value = (BandgapHigh<<4)+BandgapLow;
  39.     Bandgap_Voltage= Bandgap_Value*3/4;
  40.     clr_CHPCON_IAPEN;
  41. }

  42. /******************************************************************************
  43. The main C function.  Program execution starts
  44. here after stack initialization.
  45. ******************************************************************************/
  46. void main (void)
  47. {
  48.     double bgvalue;
  49.     unsigned int i;

  50. /*Read bandgap value */
  51.     READ_BANDGAP();
  52. /* ADC Low speed initial*/  
  53.     ENABLE_ADC_BANDGAP;
  54.     ADCCON1|=0x30;            /* clock divider */
  55.     ADCCON2|=0x0E;            /* AQT time */
  56.     AUXR1|=SET_BIT4;          /* ADC clock low speed */
  57. /*start bandgap ADC */
  58.     clr_ADCCON0_ADCF;
  59.     set_ADCCON0_ADCS;                                
  60.     while(ADCF == 0);
  61.     ADCdataH[i] = ADCRH;
  62.     ADCdataL[i] = ADCRL;
  63. /* to convert VDD value */
  64.     bgvalue = (ADCRH<<4) + ADCRL;
  65.     VDD_Voltage = (0x1000/bgvalue)*Bandgap_Voltage;

  66. /* UART0 settting for printf function */
  67.     MODIFY_HIRC_24();
  68.     UART_Open(24000000,UART0_Timer3,115200);
  69.     ENABLE_UART0_PRINTF;
  70. /*printf result value */
  71.     printf ("\n BG Voltage = %e", Bandgap_Voltage);
  72.     printf ("\n VDD voltage = %e", VDD_Voltage);
  73.     while(1);

  74. }


复制代码

使用特权

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

使用特权

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

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

使用特权

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

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表