[DemoCode下载] CM1003的ADC使用

[复制链接]
 楼主| xinpian101 发表于 2025-6-23 17:59 | 显示全部楼层 |阅读模式
  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. uint16_t  ADCdataAIN;

  9. void main (void)
  10. {
  11.     P12_PUSHPULL_MODE;
  12. /* Initial UART0 for printf */
  13.     MODIFY_HIRC(HIRC_24);
  14.     Enable_UART0_VCOM_printf_24M_115200();
  15.     printf ("\n Test start ...");
  16.   
  17.     ENABLE_ADC_AIN4;
  18.   /* ADC Sampling time setting*/
  19.     ADC_ConvertTime(ADC_ADCDIV2,ADC_ADCAQT5);

  20.     while(1)
  21.     {
  22.       Timer0_Delay(24000000,500,1000);
  23.       ENABLE_ADC;
  24.       clr_ADCCON0_ADCF;
  25.       set_ADCCON0_ADCS;                  // ADC start trig signal
  26.       while(!(ADCCON0&SET_BIT7));        // Wait ADC flag
  27.       ADCdataAIN = ADCRH<<4;
  28.       ADCdataAIN |= ADCRL&0x0F;
  29.       DISABLE_ADC;
  30.       printf ("\n ADC result = 0x%x", ADCdataAIN);
  31.       GPIO_LED ^= 1;
  32.     }
  33. }


此程序实现周期性地采集ADC通道AIN4(P1.4引脚)的模拟信号,将12位转换结果通过串口打印输出,并控制LED状态翻转(闪烁指示)。
  1. #include "numicro_8051.h"  // 新唐8051库头文件
  2. uint16_t ADCdataAIN;        // 存储ADC转换结果(12位)
硬件初始化

  1. P12_PUSHPULL_MODE;          // 设置P1.2为推挽输出模式(通常用于驱动LED)
  2. MODIFY_HIRC(HIRC_24);       // 配置内部高速时钟为24MHz
  3. Enable_UART0_VCOM_printf_24M_115200(); // 初始化UART0:波特率115200
  4. printf("\n Test start..."); // 串口打印启动信息
ADC配置

  1. ENABLE_ADC_AIN4;                   // 使能ADC的AIN4通道(对应P1.4引脚)
  2. ADC_ConvertTime(ADC_ADCDIV2, ADC_ADCAQT5); // 设置ADC时钟分频=2(12MHz),采样时间=5个ADC周期
ADC启动与数据采集

  1. ENABLE_ADC;                     // 开启ADC模块电源
  2. clr_ADCCON0_ADCF;               // 清除ADC完成标志位
  3. set_ADCCON0_ADCS;               // 启动ADC转换
  4. while(!(ADCCON0 & SET_BIT7));   // 等待转换完成(检测ADCF标志)
读取12位ADC结果

  1. ADCdataAIN = ADCRH << 4;        // 读取高8位寄存器,左移4位(高4位为有效数据)
  2. ADCdataAIN |= ADCRL & 0x0F;     // 读取低4位寄存器,与高8位合并成12位数据
  3. DISABLE_ADC;                    // 关闭ADC电源(降低功耗)
输出与LED指示

  1. printf("\n ADC result = 0x%x", ADCdataAIN); // 串口打印16进制结果
  2. GPIO_LED ^= 1;                  // 翻转LED状态(闪烁指示运行)


 楼主| xinpian101 发表于 2025-6-23 17:59 | 显示全部楼层
关键硬件操作说明
ADC相关寄存器:

ADCCON0:控制寄存器(启动转换、清除标志)

ADCRH:ADC结果高8位

ADCRL:ADC结果低4位(实际使用低4位)

12位结果合并公式:结果 = (ADCRH << 4) | (ADCRL & 0x0F)

LED控制:

GPIO_LED 需在头文件中定义为LED引脚(如P1.2),每次采集后翻转状态。

低功耗设计:

每次采集后关闭ADC(DISABLE_ADC),减少待机功耗。
 楼主| xinpian101 发表于 2025-6-23 17:59 | 显示全部楼层
工作流程
初始化时钟、串口、ADC和GPIO。

进入主循环:

延时500ms → 开启ADC → 启动转换 → 等待完成 → 读取结果 → 关闭ADC。

串口打印结果,LED状态翻转。

重复步骤2。
 楼主| xinpian101 发表于 2025-6-23 17:59 | 显示全部楼层
技术细节
ADC时钟:24MHz主时钟 ÷ 2(分频) = 12MHz ADC时钟。

采样时间:5个ADC时钟周期(约0.42μs)。

总转换时间:1(启动)+ 5(采样)+ 12(转换)= 18周期 ≈ 1.5μs。

打印格式:结果以16进制输出(范围 0x000-0xFFF)。
 楼主| xinpian101 发表于 2025-6-23 17:59 | 显示全部楼层
应用场景
用于读取传感器模拟信号(如温度、光照)。

LED闪烁指示系统运行状态。

串口输出便于调试和数据监控。

此程序是新唐MCU的典型ADC应用,展示了外设控制、定时操作和串口通信的基本方
您需要登录后才可以回帖 登录 | 注册

本版积分规则

125

主题

1624

帖子

1

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