[DemoCode下载] MG51 采取多通道ADC

[复制链接]
 楼主| 稳稳の幸福 发表于 2025-5-25 20:50 | 显示全部楼层 |阅读模式
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /*                                                                                                         */
  3. /* SPDX-License-Identifier: Apache-2.0                                                                     */
  4. /* Copyright(c) 2023 Nuvoton Technology Corp. All rights reserved.                                         */
  5. /*                                                                                                         */
  6. /*---------------------------------------------------------------------------------------------------------*/

  7. #include "MG51_SDCC.H"

  8. /**********************************************************************************************************/
  9. /*  File Function: MS51 ADC multi channel input demo code                                                 */
  10. /**********************************************************************************************************/

  11. UINT16 ADCdataAIN5=0, ADCdataVBG=0;

  12. /*****************************************************************************/
  13. /*The main C function.  Program execution starts                             */
  14. /*here after stack initialization.                                           */
  15. /*****************************************************************************/
  16. void main (void)
  17. {
  18.           /* UART0 settting for printf function */
  19.             MODIFY_HIRC(HIRC_24);
  20.             Enable_UART0_VCOM_printf_24M_115200();
  21.             printf ("\n Test start ...");

  22.         /*Enable Bandgap */
  23.             ENABLE_ADC_BANDGAP;
  24.             ADCCON1|=0X30;            /* clock divider */
  25.             ADCCON2|=0X0E;            /* AQT time */
  26.             clr_ADCCON0_ADCF;
  27.             set_ADCCON0_ADCS;
  28.             while(!(ADCCON0&SET_BIT7));;
  29.             ADCdataVBG = ADCRH<<4;
  30.             ADCdataVBG |= ADCRL&0x0F;
  31.             DISABLE_ADC;
  32.             printf("\n ADC channel bandgap =0x%x", ADCdataVBG);
  33.             Timer0_Delay(24000000,200,1000);

  34.         /*Enable channel 5 */
  35.             ENABLE_ADC_AIN5;
  36.             ADCCON1|=0X30;            /* clock divider */
  37.             ADCCON2|=0X0E;            /* AQT time */
  38.             clr_ADCCON0_ADCF;
  39.             set_ADCCON0_ADCS;
  40.             while(!(ADCCON0&SET_BIT7)); /* wait ADCF */
  41.             ADCdataAIN5 = ADCRH<<4;
  42.             ADCdataAIN5 |= ADCRL&0x0F;
  43.             DISABLE_ADC;
  44.             printf("\n ADC channel 5 =0x%x", ADCdataAIN5);
  45.             Timer0_Delay(24000000,200,1000);

  46.             while(1);
  47. }


 楼主| 稳稳の幸福 发表于 2025-5-25 20:51 | 显示全部楼层
这段代码演示了如何在 MS51单片机(MG51系列) 上使用 ADC(模数转换器) 读取两个不同的模拟输入信号:

内部基准电压(Bandgap)

外部模拟输入通道 AIN5

最终通过 串口(UART) 打印测量结果,方便调试和观察。
 楼主| 稳稳の幸福 发表于 2025-5-25 20:51 | 显示全部楼层
ADCdataAIN5 和 ADCdataVBG:分别存储 AIN5 通道 和 Bandgap 基准电压 的 ADC 转换结果(12 位数据)。
 楼主| 稳稳の幸福 发表于 2025-5-25 20:52 | 显示全部楼层
ADCdataAIN5 和 ADCdataVBG:分别存储 AIN5 通道 和 Bandgap 基准电压 的 ADC 转换结果(12 位数据)。
  1. ENABLE_ADC_BANDGAP;       // 使能 ADC 的 Bandgap 输入
  2. ADCCON1 |= 0X30;         // 设置 ADC 时钟分频(控制转换速度)
  3. ADCCON2 |= 0X0E;         // 设置 ADC 采样时间(AQT 时间)
  4. clr_ADCCON0_ADCF;        // 清除 ADC 转换完成标志
  5. set_ADCCON0_ADCS;        // 启动 ADC 转换
  6. while(!(ADCCON0 & SET_BIT7)); // 等待 ADC 转换完成(ADCF=1)
  7. ADCdataVBG = ADCRH << 4; // 读取 ADC 高 8 位
  8. ADCdataVBG |= ADCRL & 0x0F; // 读取 ADC 低 4 位,组合成 12 位数据
  9. DISABLE_ADC;             // 关闭 ADC
  10. printf("\n ADC channel bandgap =0x%x", ADCdataVBG); // 打印 Bandgap 测量值
  11. Timer0_Delay(24000000, 200, 1000); // 延时 200ms


ENABLE_ADC_BANDGAP:选择 Bandgap 电压(~1.2V) 作为 ADC 输入。

ADCCON1 |= 0X30:设置 ADC 时钟分频(影响转换速度)。

ADCCON2 |= 0X0E:设置采样时间(确保稳定采样)。

set_ADCCON0_ADCS:启动 ADC 转换。

while(!(ADCCON0 & SET_BIT7)):等待转换完成(ADCF 置 1)。

ADCdataVBG = ADCRH << 4 | ADCRL & 0x0F:组合 高 8 位 + 低 4 位,得到 12 位 ADC 值。

DISABLE_ADC:关闭 ADC 以省电。

printf:打印 Bandgap 电压的 ADC 值(16 进制)。

Timer0_Delay:延时 200ms,避免频繁采样。
 楼主| 稳稳の幸福 发表于 2025-5-25 20:52 | 显示全部楼层
测量 AIN5 外部模拟输入
  1. ENABLE_ADC_AIN5;         // 使能 ADC 的 AIN5 通道
  2. ADCCON1 |= 0X30;         // 设置 ADC 时钟分频
  3. ADCCON2 |= 0X0E;         // 设置 ADC 采样时间
  4. clr_ADCCON0_ADCF;        // 清除 ADC 转换完成标志
  5. set_ADCCON0_ADCS;        // 启动 ADC 转换
  6. while(!(ADCCON0 & SET_BIT7)); // 等待 ADC 转换完成
  7. ADCdataAIN5 = ADCRH << 4; // 读取 ADC 高 8 位
  8. ADCdataAIN5 |= ADCRL & 0x0F; // 读取 ADC 低 4 位,组合成 12 位数据
  9. DISABLE_ADC;             // 关闭 ADC
  10. printf("\n ADC channel 5 =0x%x", ADCdataAIN5); // 打印 AIN5 测量值
  11. Timer0_Delay(24000000, 200, 1000); // 延时 200ms


和 Bandgap 测量类似,但选择的是 AIN5 引脚 作为输入(如电位器、传感器等)。

最终结果存储在 ADCdataAIN5,并通过串口打印。
瞌睡虫本虫 发表于 2025-5-26 09:19 | 显示全部楼层
这个代码展示了如何在MG51上使用ADC模块来读取多个通道的模拟信号。代码中首先初始化了UART0用于打印调试信息,然后配置了ADC模块来读取bandgap电压和AIN5通道的电压值。
作业粉碎机 发表于 2025-5-26 15:50 | 显示全部楼层
看起来这段代码是用于MG51微控制器的ADC多通道输入演示。代码中包含了UART设置、ADC配置和读取ADC值的步骤。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

203

主题

3409

帖子

8

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

203

主题

3409

帖子

8

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