[DemoCode下载] CM1003单片机的ADC带隙电压测量

[复制链接]
953|2
 楼主| 734774645 发表于 2025-5-24 20:10 | 显示全部楼层 |阅读模式
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /*                                                                                                         */
  3. /* SPDX-License-Identifier: Apache-2.0                                                                     */
  4. /* Copyright(c) 2024 Nuvoton Technology Corp. All rights reserved.                                         */
  5. /*                                                                                                         */
  6. /*---------------------------------------------------------------------------------------------------------*/
  7. #include "numicro_8051.h"

  8. #if defined __C51__
  9. double Bandgap_Voltage,VDD_Voltage;
  10. #elif defined __ICC8051__
  11. double Bandgap_Voltage,VDD_Voltage;
  12. #elif defined __SDCC__
  13. float  Bandgap_Voltage,VDD_Voltage;
  14. #endif

  15. /******************************************************************************
  16. The main C function.  Program execution starts
  17. here after stack initialization.
  18. ******************************************************************************/
  19. void main (void)
  20. {
  21.     uint16_t ADC_BG_Result;

  22.     MODIFY_HIRC(HIRC_24);
  23.     Enable_UART0_VCOM_printf_24M_115200();
  24.     printf ("\n\r Test start ...");

  25. /* ADC sampling timing setting for Bandgap*/  
  26.     ENABLE_ADC_BANDGAP;
  27.     ADCCON1|=0x30;            /* clock divider */
  28.     ADCCON2|=0x0E;            /* AQT time */
  29. /*start bandgap ADC */
  30.     clr_ADCCON0_ADCF;
  31.     set_ADCCON0_ADCS;
  32.     while(ADCF == 0);
  33. /* ADC convert current Bandgap value */
  34.     ADC_BG_Result = ADCRH<<4 ;
  35.     ADC_BG_Result = ADC_BG_Result|(ADCRL&0x0F);
  36.     DISABLE_ADC;              /*Disable ADCEN each time after ADC trig */

  37. /*                  VDD  Now                         READ_BANDGAP() VALUE              */
  38. /*    ------------------------------------- = ----------------------------------       */
  39. /*    3072mV(Storage value test condition)      NOW ADC Bandgap convert reuslt         */
  40.       VDD_Voltage = ((float)READ_BANDGAP())/((float)ADC_BG_Result)*3072;

  41. /*            Bandgap real voltage                    READ_BANDGAP() VALUE             */
  42. /*    ------------------------------------- = ----------------------------------       */
  43. /*    3072mV(Storage value test condition)              4096(12bit ADC)                */
  44.       Bandgap_Voltage = ((float)READ_BANDGAP())*3/4;

  45. /*printf result value */

  46. #if defined __SDCC__
  47.     printf_fast_f ("\n\r BG Voltage = %f", Bandgap_Voltage);
  48.     printf_tiny (" mV \r");
  49.     printf_fast_f ("\n\r VDD voltage = %f", VDD_Voltage);
  50.     printf_tiny (" mV \r");
  51. #else
  52.     printf ("\n\r BG Voltage = %f", Bandgap_Voltage);
  53.     printf (" mV \r");
  54.     printf ("\n\r VDD voltage = %f", VDD_Voltage);
  55.     printf (" mV \r");
  56. #endif
  57.     while(1);

  58. }





蚊子的噩梦 发表于 2025-5-25 13:20 | 显示全部楼层
这个代码看起来是用来测量单片机的带隙电压和供电电压的。使用了ADC模块来采样带隙电压,并通过已知的参考值来计算实际电压。
旧年胶片 发表于 2025-8-28 12:35 | 显示全部楼层
CM1003 单片机 ADC 带隙电压测量,先配置 ADC 模块:选带隙电压为输入通道,设定 ADC 工作时钟、采样时间及转换模式。使能带隙电压源,启动 ADC 转换。转换结束后,读取 ADC 数据寄存器值,结合 ADC 参考电压与分辨率,通过公式(带隙电压 = ADC 值 × 参考电压 / 满量程值)计算出实际带隙电压,可用于校准或电源监测。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

211

主题

3588

帖子

15

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