打印
[DemoCode下载]

MG51 采取多通道ADC

[复制链接]
167|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
稳稳の幸福|  楼主 | 2025-5-25 20:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* SPDX-License-Identifier: Apache-2.0                                                                     */
/* Copyright(c) 2023 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/

#include "MG51_SDCC.H"

/**********************************************************************************************************/
/*  File Function: MS51 ADC multi channel input demo code                                                 */
/**********************************************************************************************************/

UINT16 ADCdataAIN5=0, ADCdataVBG=0;

/*****************************************************************************/
/*The main C function.  Program execution starts                             */
/*here after stack initialization.                                           */
/*****************************************************************************/
void main (void)
{
          /* UART0 settting for printf function */
            MODIFY_HIRC(HIRC_24);
            Enable_UART0_VCOM_printf_24M_115200();
            printf ("\n Test start ...");

        /*Enable Bandgap */
            ENABLE_ADC_BANDGAP;
            ADCCON1|=0X30;            /* clock divider */
            ADCCON2|=0X0E;            /* AQT time */
            clr_ADCCON0_ADCF;
            set_ADCCON0_ADCS;
            while(!(ADCCON0&SET_BIT7));;
            ADCdataVBG = ADCRH<<4;
            ADCdataVBG |= ADCRL&0x0F;
            DISABLE_ADC;
            printf("\n ADC channel bandgap =0x%x", ADCdataVBG);
            Timer0_Delay(24000000,200,1000);

        /*Enable channel 5 */
            ENABLE_ADC_AIN5;
            ADCCON1|=0X30;            /* clock divider */
            ADCCON2|=0X0E;            /* AQT time */
            clr_ADCCON0_ADCF;
            set_ADCCON0_ADCS;
            while(!(ADCCON0&SET_BIT7)); /* wait ADCF */
            ADCdataAIN5 = ADCRH<<4;
            ADCdataAIN5 |= ADCRL&0x0F;
            DISABLE_ADC;
            printf("\n ADC channel 5 =0x%x", ADCdataAIN5);
            Timer0_Delay(24000000,200,1000);

            while(1);
}


使用特权

评论回复
沙发
稳稳の幸福|  楼主 | 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 位数据)。
ENABLE_ADC_BANDGAP;       // 使能 ADC 的 Bandgap 输入
ADCCON1 |= 0X30;         // 设置 ADC 时钟分频(控制转换速度)
ADCCON2 |= 0X0E;         // 设置 ADC 采样时间(AQT 时间)
clr_ADCCON0_ADCF;        // 清除 ADC 转换完成标志
set_ADCCON0_ADCS;        // 启动 ADC 转换
while(!(ADCCON0 & SET_BIT7)); // 等待 ADC 转换完成(ADCF=1)
ADCdataVBG = ADCRH << 4; // 读取 ADC 高 8 位
ADCdataVBG |= ADCRL & 0x0F; // 读取 ADC 低 4 位,组合成 12 位数据
DISABLE_ADC;             // 关闭 ADC
printf("\n ADC channel bandgap =0x%x", ADCdataVBG); // 打印 Bandgap 测量值
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,避免频繁采样。

使用特权

评论回复
5
稳稳の幸福|  楼主 | 2025-5-25 20:52 | 只看该作者
测量 AIN5 外部模拟输入
ENABLE_ADC_AIN5;         // 使能 ADC 的 AIN5 通道
ADCCON1 |= 0X30;         // 设置 ADC 时钟分频
ADCCON2 |= 0X0E;         // 设置 ADC 采样时间
clr_ADCCON0_ADCF;        // 清除 ADC 转换完成标志
set_ADCCON0_ADCS;        // 启动 ADC 转换
while(!(ADCCON0 & SET_BIT7)); // 等待 ADC 转换完成
ADCdataAIN5 = ADCRH << 4; // 读取 ADC 高 8 位
ADCdataAIN5 |= ADCRL & 0x0F; // 读取 ADC 低 4 位,组合成 12 位数据
DISABLE_ADC;             // 关闭 ADC
printf("\n ADC channel 5 =0x%x", ADCdataAIN5); // 打印 AIN5 测量值
Timer0_Delay(24000000, 200, 1000); // 延时 200ms


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

最终结果存储在 ADCdataAIN5,并通过串口打印。

使用特权

评论回复
6
瞌睡虫本虫| | 2025-5-26 09:19 | 只看该作者
这个代码展示了如何在MG51上使用ADC模块来读取多个通道的模拟信号。代码中首先初始化了UART0用于打印调试信息,然后配置了ADC模块来读取bandgap电压和AIN5通道的电压值。

使用特权

评论回复
7
作业粉碎机| | 2025-5-26 15:50 | 只看该作者
看起来这段代码是用于MG51微控制器的ADC多通道输入演示。代码中包含了UART设置、ADC配置和读取ADC值的步骤。

使用特权

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

本版积分规则

195

主题

3384

帖子

8

粉丝