0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用N76E003微控制器ADC读取模拟电压

科技观察员 来源:circuitdigest 作者:Sourav Gupta 2022-08-10 16:01 次阅读

模数转换器ADC) 是微控制器上最常用的硬件功能。它接收模拟电压并将其转换为数字值。由于微控制器是数字设备并且使用二进制数字 1 和 0,它不能直接处理模拟数据。因此,ADC 用于接收模拟电压并将其转换为微控制器可以理解的等效数字值。

在本教程中,我们将使用N76E003 微控制器单元的内置 ADC 外设,因此让我们评估此应用需要什么样的硬件设置。

所需组件和硬件设置

要在 N76E003 上使用 ADC,我们将使用使用电位计的分压器并读取 0V-5.0V 范围内的电压。电压将显示在 16x2 字符 LCD 中,如果您是 LCD 和 N76E003 的新手,您可以查看如何将 LCD 与 Nuvoton N76E003 连接。因此,该项目所需的主要组件是 16x2 字符 LCD。对于这个项目,我们将使用以下组件 -

字符 LCD 16x2

1k电阻

50k 电位器或微调电位器

几根伯格电线

几根连接线

面包板

更不用说,除了上述组件,我们还需要基于N76E003 微控制器的开发板以及Nu-Link 编程器。还需要一个额外的 5V 电源单元,因为 LCD 会消耗编程器无法提供的足够电流

Nuvoton N76E003 读取模拟电压的威廉希尔官方网站 图

pYYBAGLzZXiAAuWQAABaHedm9go585.png

正如我们在示意图中看到的,端口 P0 用于与 LCD 相关的连接。在最左侧,显示了编程接口连接。电位器用作分压器,由模拟输入 0 (AN0) 检测

pYYBAGLzZXSAd0fmAAbIYcZwHgA235.png

N76E003 中有关 GPIO 和模拟引脚的信息

下图说明了 N76E003AT20 微控制器单元上可用的 GPIO 引脚。但是,在 20 个引脚中,对于 LCD 相关连接,使用端口 P0(P0.0、P0.1、P0.2、P0.4、P0.5、P0.6 和 P0.7)。模拟引脚以红色突出显示。

poYBAGLzZW6Aayx3AAGdqhFBJ1w040.png

正如我们所看到的,端口 P0 具有最大的模拟引脚,但这些引脚用于 LCD 相关的通信。因此,P3.0 和 P1.7 可用作模拟输入引脚 AIN1 和 AIN0。由于这个项目只需要一个模拟引脚,P1.7 是模拟输入通道 0,用于这个项目。

N76E003 中有关 ADC 外设的信息

N76E003 提供12 位 SAR ADC。N76E003的一个非常好的特点是它具有非常好的ADC分辨率。ADC在单端模式下具有8 通道输入。连接 ADC 非常简单明了。

第一步是选择ADC通道输入。N76E003 微控制器提供 8 通道输入。选择 ADC 输入或 I/O 引脚后,需要将所有引脚设置为代码中的方向。用于模拟输入的所有引脚都是微控制器的输入引脚,因此所有引脚都需要设置为仅输入(高阻抗)模式。这些可以使用PxM1 和 PxM2 寄存器进行设置。这两个寄存器设置 I/O 模式,其中 x 代表端口号(例如,端口 P1.0 寄存器将是 P1M1 和 P1M2,对于 P3.0 它将是 P3M1 和 P3M2 等)配置可以如下图所示 -

poYBAGLzZWuAIoXKAACfy4XCiaw172.png

ADC 的配置由两个寄存器ADCCON0和ADCCON1完成。ADCCON0 寄存器描述如下所示。

pYYBAGLzZWeAXYhAAAJXHCQSHLQ134.png

寄存器的前 4 位从位 0 到位 3 用于设置 ADC 通道选择。由于我们使用的是通道 AIN0,因此这四个位的选择将为 0000。

第 6 位和第 7 位是重要的位。ADCS需要设置为 1 以启动 ADC 转换,ADCF将提供有关 ADC 转换成功的信息。它需要由固件设置为 0 以启动 ADC 转换。下一个寄存器是 ADCCON1-

poYBAGLzZWOASlzOAAbIdXxYeHI272.png

ADCCON1 寄存器主要用于外部触发的 ADC 转换。但是,对于正常的轮询相关操作,需要将第一位ADCEN设置为 1 以打开 ADC 威廉希尔官方网站 。

接下来,需要在AINDIDS寄存器中控制 ADC 通道的输入,在该寄存器中可以断开数字输入。

pYYBAGLzZWCAaQTQAAELNdkQwBA377.png

n 代表通道位(例如,AIN0 通道需要使用AINDIDS寄存器的第一位P17DIDS进行控制)。数字输入需要使能,否则读为0。这些都是ADC的基本设置。现在,清除 ADCF 并设置 ADCS,即可开始 ADC 转换。转换后的值将在以下寄存器中可用 -

poYBAGLzZVqAEwHeAACzeoqmAjY817.png

pYYBAGLzZVeAMCyTAAFtjlk8cAs867.png

两个寄存器都是 8 位的。由于 ADC 提供 12 位数据,所以 ADCRH 用作全量(8 位)而 ADCRL 用作半量(4 位)。

为 ADC 编程 N76E003

每次为特定模块编码是一项繁重的工作,因此提供了一个简单但功能强大的 LCD 库,对于与 N76E003 连接的 16x2 字符 LCD 接口非常有用。

请拥有该库(通过克隆或下载)并在您的Keil N76E003 项目中包含lcd.c和LCD.h文件,以便将 16x2 LCD 轻松集成到所需的应用程序或项目中。该库将提供以下有用的显示相关功能-

初始化液晶显示器。

向 LCD 发送命令。

写入液晶显示器。

在 LCD 中输入一个字符串(16 个字符)。

通过发送十六进制值打印字符。

滚动超过 16 个字符的长消息。

将整数直接打印到 LCD 中。

ADC 的编码很简单。在设置函数Enable_ADC_AIN0中;用于将ADC设置为AIN0输入。这是在文件中定义的。

#define Enable_ADC_AIN0 ADCCON0&=0xF0;P17_Input_Mode;AINDIDS=0x00;AINDIDS|=SET_BIT0;ADCCON1|=SET_BIT0 //P17

因此,上述行将引脚设置为输入并配置ADCCON0、ADCCON1寄存器以及AINDIDS寄存器。以下函数将从ADCRH和ADCRL寄存器读取 ADC,但分辨率为 12 位。

unsigned int ADC_read(void){

register unsigned int adc_value = 0x0000;

clr_ADCF;

设置_ADCS;

而(ADCF == 0);

adc_value = ADCRH;

adc_value 《《= 4;

adc_value |= ADCRL;

返回 adc_value;

}

该位左移 4 次,然后添加到数据变量中。在主要功能中,ADC 正在读取数据并直接打印在显示器上。然而,电压也使用比率或电压除以位值之间的关系进行转换。

一个 12 位 ADC 将在 5.0V 输入上提供 4095 位。因此除以 5.0V/4095 = 0.0012210012210012V

因此,1 位的位变化将等于 0.001V 的变化(大约)。这是在下面显示的主函数中完成的。

void main(void){

int adc_data;

设置();

lcd_com (0x01);

while(1){

lcd_com (0x01);

lcd_com (0x80);

lcd_puts(“ADC数据:”);

adc_data = ADC_read();

lcd_print_number(adc_data);

电压 = adc_data * bit_to_voltage_ratio;

sprintf(str_voltage,“电压:%0.2fV”,电压);

lcd_com(0xC0);

lcd_puts(str_voltage);

Timer0_Delay1ms(500);

}

}

数据从位值转换为电压,并使用sprintf函数将输出转换为字符串并发送到 LCD。

闪烁代码和输出

代码返回 0 warning 和 0 Errors 并且被 Keil 使用默认的刷机方式刷机,你可以看到下面的刷机信息。如果您是 Keil 或 Nuvoton 的新手,请查看Nuvoton 微控制器入门以了解基础知识以及如何上传代码。

重建开始:项目:计时器

重建目标‘目标1’

组装STARTUP.A51.。.

编译main.c.。.

编译lcd.c.。.

编译Delay.c.。.

链接。..

程序大小:数据= 101.3 xdata=0 代码=4162

从“。\Objects\timer”。..“。\Objects\timer”创建十六进制文件

- 0 个错误,0 个警告。

构建时间已用:00:00:02

加载“G:\\n76E003\\Display\\Objects\\timer”

Flash 擦除完成。

Flash 写入完成:已编程 4162 字节。

Flash 验证完成:已验证 4162 字节。

闪存加载于 11:56:04 完成

下图显示了使用直流适配器连接到电源中的硬件,显示屏显示右侧电位器设置的电压输出。

poYBAGLzZUqAGEUQAAcQBPM9nY8282.png

如果我们转动电位器,给 ADC 引脚的电压也会发生变化,我们可以注意到 LCD 上显示的 ADC 值和模拟电压。

#include "N76E003.h"
#include "SFR_Macro.h"
#include "函数定义.h"
#include "Common.h"
#include "延迟.h"
#包括“lcd.h”
#define bit_to_voltage_ratio 0.001220703125 // 5.0V 除以 4096 对于 12 位 ADC
无效设置(无效);
无符号整数 ADC_read(void);
浮动电压;
字符str_电压[20];
无效的主要(无效){
int adc_data;
设置();
lcd_com (0x01);
而(1){
lcd_com (0x01);
lcd_com (0x80);
lcd_puts("ADC数据:");
adc_data = ADC_read();
lcd_print_number(adc_data);
电压 = adc_data * bit_to_voltage_ratio;
sprintf(str_voltage,“电压:%0.2fV”,电压);
lcd_com(0xC0);
lcd_puts(str_voltage);
Timer0_Delay1ms(500);
}
}
无效设置(无效){
Set_All_GPIO_Quasi_Mode;
液晶初始化();
启用_ADC_AIN0;
lcd_com (0x80);
LCD_ScrollMessage("欢迎来到 CircuitDigest.com");
lcd_com (0x80);
lcd_puts("ADC 接口");
lcd_com (0xC0);
lcd_puts("使用 N76E003 单片机");
Timer3_Delay100ms(5);
}
无符号整数 ADC_read(void){
注册无符号整数 adc_value = 0x0000;
clr_ADCF;
设置_ADCS;
而(ADCF == 0);
adc_value = ADCRH;
adc_value <<= 4;
adc_value |= ADCRL;
返回 adc_value;
}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 微控制器
    +关注

    关注

    48

    文章

    7551

    浏览量

    151391
  • 模数转换器
    +关注

    关注

    26

    文章

    3204

    浏览量

    126829
  • 模拟电压
    +关注

    关注

    6

    文章

    64

    浏览量

    18299
  • N76E003
    +关注

    关注

    0

    文章

    27

    浏览量

    5532
收藏 人收藏

    评论

    相关推荐

    请问如何读取实际N76E003带隙电压

    如何读取实际N76E003带隙电压
    发表于 12-22 06:30

    N76E003 PWM分辨率是多少?

    有没有相关的方法,N76E003 ADC采集的电压转换为PWM,还有N76E003 PWM分辨率是多少。转换的精度怎么样,有没能大神了解过。
    发表于 06-19 06:15

    用于实施受控制的近环BLDC发动机的N76E003示例代码

    应用:这一基于N76E003的示例代码,用于实施受控制的近环BLDC发动机 BSP 版本: N76E003_BSP_Keil_C51_V1.0.6 硬件: NuTiny-N76E003
    发表于 08-23 07:30

    用于实施开放环BLDC发动机控制N76E003示例代码

    应用:这一基于N76E003的示例代码,用于实施开放环BLDC发动机控制 BSP 版本: N76E003_BSP_Keil_C51_V1.0.6 硬件: NuTiny-N76E003
    发表于 08-23 06:11

    请问如何阅读实际N76E003带隙电压?

    N76E003 ADC 可以选择内部带宽电压作为输入针, 用于获取 ADC 参考电压, 以取得更准确的
    发表于 08-28 06:33

    N76E003 8位8051内核微控制器的英文和中文数据手册免费下载

    本文档的主要内容详细介绍的是N76E003 8位8051内核微控制器的英文和中文数据手册免费下载。
    发表于 11-09 08:00 44次下载
    <b class='flag-5'>N76E003</b> 8位8051内核<b class='flag-5'>微控制器</b>的英文和中文数据手册免费下载

    N76E003 8位8051内核微控制器的中文数据手册免费下载

    N76E003为带有flash的增强型8位8051内核微控制器(1T工作模式),指令集与标准的80C51完全兼容并具备更高效能。
    发表于 11-09 08:00 80次下载
    <b class='flag-5'>N76E003</b> 8位8051内核<b class='flag-5'>微控制器</b>的中文数据手册免费下载

    N76E003增强型8位8051内核微控制器的数据手册免费下载

    N76E003为带有flash的增强型8位8051内核微控制器(1T工作模式),指令集与标准的80C51完全兼容并具备更高效能。N76E003内嵌18K的Flash存储区,通常称作APROM,用于
    发表于 12-11 08:00 12次下载
    <b class='flag-5'>N76E003</b>增强型8位8051内核<b class='flag-5'>微控制器</b>的数据手册免费下载

    N76E003 8051内核微控制器的数据手册免费下载

    N76E003为带有flash的增强型8位8051内核微控制器(1T工作模式),指令集与标准的80C51完全兼容并具备更高效能。
    发表于 03-04 08:00 37次下载
    <b class='flag-5'>N76E003</b> 8051内核<b class='flag-5'>微控制器</b>的数据手册免费下载

    N76E003的EEPROM问题解决方案:使用Data Flash模拟EEPROM

    N76E003的EEPROM问题解决方案:使用Data Flash模拟EEPROM(嵌入式开发与应用专业开学要买电脑吗)-N76E003的EEPROM问题解决方案,官方文档,找了很久才找到。这份文件
    发表于 07-30 09:28 29次下载
    <b class='flag-5'>N76E003</b>的EEPROM问题解决方案:使用Data Flash<b class='flag-5'>模拟</b>EEPROM

    基于Nuvoton 1T 8051的微控制器N76E003数据表

    基于Nuvoton 1T 8051的微控制器N76E003数据表
    发表于 11-03 09:43 5次下载

    N76E003ADC 多通道采样

    首先让我们来看看N76E003单片机的ADC工作方式,从下图中可以看到ADCHS寄存决定当前使用哪一个通道的寄存。接下来我们再来看看具体的寄存
    发表于 12-04 11:51 30次下载
    <b class='flag-5'>N76E003</b>之<b class='flag-5'>ADC</b> 多通道采样

    如何使用N76E003微控制器执行串行通信

    在本文中,我们将学习如何使用 N76E003 微控制器执行串行通信。
    发表于 08-09 17:34 3562次阅读
    如何使用<b class='flag-5'>N76E003</b><b class='flag-5'>微控制器</b>执行串行通信

    N76E003微控制器中文手册

    N76E003为带有flash的增强型8位8051内核微控制器(1T工作模式),指令集与标准的80C51完全兼容并具备 更高效能。 N76E003内嵌18K的Flash存储区,通常称作APROM
    发表于 03-03 10:15 8次下载

    N76E003例程介绍

    电子发烧友网站提供《N76E003例程介绍.zip》资料免费下载
    发表于 12-21 09:45 1次下载