- 所需的组件和硬件设置
- Nuvoton N76E003读取模拟电压的电路图
- N76E003中有关GPIO和模拟引脚的信息
- N76E003中有关ADC外围设备的信息
- 为ADC编程N76E003
- 刷新代码和输出
模数转换器(ADC)是微控制器上最常用的硬件功能。它吸收模拟电压并将其转换为数字值。由于微控制器是数字设备,并且使用二进制数字1和0,因此它无法直接处理模拟数据。因此,ADC用于获取模拟电压并将其转换为微控制器可以理解的等效数字值。如果您想进一步了解模数转换器(ADC),可以查看链接的文章。
电子设备中提供模拟输出的传感器有很多,例如MQ气体传感器,ADXL335加速度传感器等。因此,使用模数转换器,这些传感器可以与微控制器单元连接。您还可以查看下面列出的其他教程,以了解如何将ADC与其他微控制器一起使用。
- 如何在Arduino Uno中使用ADC?
- ADC0808与8051单片机的接口
- 使用PIC单片机的ADC模块
- Raspberry Pi ADC教程
- 如何在MSP430G2中使用ADC-测量模拟电压
- 如何在STM32F103C8中使用ADC
在本教程中,我们将使用N76E003微控制器单元的内置ADC外设,因此让我们评估一下此应用程序需要哪种硬件设置。
所需的组件和硬件设置
要在N76E003上使用ADC,我们将使用带电位计的分压器并读取0V-5.0V范围内的电压。电压将显示在16x2字符LCD中,如果您是LCD和N76E003的新用户,则可以检查如何将LCD与Nuvoton N76E003连接。因此,此项目所需的主要组件是16x2字符LCD。对于此项目,我们将使用以下组件-
- 字符LCD 16x2
- 1K电阻
- 50k电位器或微调电位器
- 很少伯格线
- 少量连接线
- 面包板
更不用说,除了上述组件之外,我们还需要基于N76E003微控制器的开发板以及Nu-Link编程器。由于LCD汲取了编程器无法提供的足够电流,因此还需要一个额外的5V电源单元。
Nuvoton N76E003读取模拟电压的电路图
从示意图中可以看出,端口P0用于与LCD相关的连接。最左侧显示了编程接口连接。电位计用作分压器,由模拟输入0(AN0)感测。
N76E003中有关GPIO和模拟引脚的信息
下图说明了N76E003AT20微控制器单元上可用的GPIO引脚。但是,在20个引脚中,对于与LCD相关的连接,使用端口P0(P0.0,P0.1,P0.2,P0.4,P0.5,P0.6和P0.7)。模拟引脚以红色突出显示。
如我们所见,端口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,等等。)在下图中可以看到-
ADC的配置由两个寄存器ADCCON0和ADCCON1完成。ADCCON0寄存器说明如下所示。
寄存器的前4位(从位0到位3)用于设置ADC通道选择。由于我们使用的是通道AIN0,因此这四个位的选择将为0000。
第六和第七位是重要的位。ADCS需要设置为1才能启动ADC转换,ADCF将提供有关成功ADC转换的信息。固件需要将其设置为0以启动ADC转换。下一个寄存器是ADCCON1-
ADCCON1寄存器主要用于由外部源触发的ADC转换。但是,对于与正常轮询相关的操作,要求第一位ADCEN设置为1才能打开ADC电路。
接下来,需要在AINDIDS寄存器中控制ADC通道的输入,在该寄存器中可以断开数字输入。
所述n表示信道位(例如,AIN0信道将需要使用的第一个位被控制P17DIDS的AINDIDS寄存器)。需要使能数字输入,否则它将读为0。这些都是ADC的基本设置。现在,清除ADCF并设置ADCS,即可开始ADC转换。转换后的值将在以下寄存器中提供:
和
两个寄存器均为8位。由于ADC提供12位数据,因此ADCRH被用作完整(8位),而ADCRL被用作一半(4位)。
为ADC编程N76E003
每次为特定模块进行编码都是一项繁琐的工作,因此提供了一个简单而功能强大的LCD库,对于与N76E003接口的16x2字符LCD而言将非常有用。我们的Github存储库中提供16x2 LCD库,可以从下面的链接下载该库。
下载适用于Nuvoton N76E003的16x2 LCD库
请拥有该库(通过克隆或下载),并仅在Keil N76E003项目中包含 lcd.c 和 LCD.h 文件,以便轻松将16x2 LCD集成到所需的应用程序或项目中。该库将提供以下有用的与显示相关的功能:
- 初始化液晶显示屏。
- 向LCD发送命令。
- 写入液晶显示屏。
- 在液晶显示屏上放置一个字符串(16个字符)。
- 通过发送十六进制值来打印字符。
- 滚动超过16个字符的长消息。
- 将整数直接打印到LCD中。
ADC的编码很简单。在设置函数 Enable_ADC_AIN0中; 用于建立 ADC 为 AIN0 输入。这在文件中定义。
#定义Enable_ADC_AIN0 ADCCON0&= 0xF0; P17_Input_Mode; AINDIDS = 0x00; AINDIDS- = SET_BIT0; ADCCON1- = SET_BIT0 // P17
因此,上述行将引脚设置为输入,并配置 ADCCON0,ADCCON1 寄存器以及 AINDIDS 寄存器。以下函数将从12位分辨率的 ADCRH 和 ADCRL 寄存器读取ADC 。
无符号整数ADC_read(void){ 寄存器无符号整数adc_value = 0x0000; clr_ADCF; set_ADCS; while(ADCF == 0); adc_value = ADCRH; adc_value << = 4; adc_value-= ADCRL; 返回adc_value; }
该位左移四次,然后添加到数据变量中。在主要功能中,ADC读取数据并直接在显示器上打印。然而,还使用电压除以位值的比率或关系来转换电压。
一个12位ADC将在5.0V输入上提供4095位。因此除以5.0V / 4095 = 0.0012210012210012V
因此,一位变化的位数等于0.001V(大约)的变化。这在下面显示的主要功能中完成。
void main(void){ int adc_data; 设定(); lcd_com(0x01); while(1){ lcd_com(0x01); lcd_com(0x80); lcd_puts(“ ADC Data:”); adc_data = ADC_read(); lcd_print_number(adc_data); 电压= adc_data * bit_to_voltage_ratio; sprintf(str_voltage,“ Volt:%0.2fV”,电压); lcd_com(0xC0); lcd_puts(str_voltage); Timer0_Delay1ms(500); } }
数据从位值转换为电压,并使用 sprintf 函数,输出转换为字符串并发送至LCD。
刷新代码和输出
该代码返回了0警告和0错误,并且已由Keil使用默认的闪烁方法进行了闪烁,您可以在下面看到闪烁的消息。如果您不熟悉Keil或Nuvoton,请查看Nuvoton微控制器入门,以了解基础知识以及如何上载代码。
重建开始:项目:计时器 重建目标'Target 1', 组装STARTUP.A51… 编译main.c… 编译lcd.c… 编译Delay.c… 链接… 程序大小:data = 101.3 xdata = 0代码= 4162 从“。\ Objects \ timer”… “。\ Objects \ timer” 创建十六进制文件 -0错误,0警告。 建立时间已过:00:00:02 加载“ G:\\ n76E003 \\ Display \\ Objects \\ timer” Flash Erase完成。 闪存写完成:已编程4162字节。 已完成Flash验证:已验证4162字节。 Flash加载于11:56:04完成
下图显示了使用DC适配器连接到电源中的硬件,显示屏显示了右侧电位计设置的电压输出。
如果转动电位计,提供给ADC引脚的电压也将发生变化,我们可以注意到LCD上显示的ADC值和模拟电压。您可以查看下面的视频,以获取本教程的完整工作演示。
希望您喜欢这篇文章并学到了一些有用的东西,如果您有任何疑问,请将其留在下面的评论部分,或者可以使用我们的论坛来发布其他技术问题。