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

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

3天内不再提示

如何在ARM7-LPC2148中使用ADC

科技观察员 来源:circuitdigest 作者:Pramoth Thangavel 2022-09-23 17:02 次阅读

电子世界中,市场上有多种模拟传感器用于测量温度、速度、位移、压力等。模拟传感器用于产生随时间不断变化的输出。这些来自模拟传感器的信号的值往往很小,从几微伏 (uV) 到几毫伏 (mV),因此需要某种形式的放大。为了在微控制器中使用这些模拟信号,我们需要将模拟信号转换为数字信号,因为微控制器只理解和处理数字信号。因此,大多数微控制器都有一个内置的重要功能,称为ADC模数转换器)。我们的微控制器ARM7-LPC2148还具有 ADC 功能。

在本教程中,我们将了解如何在 ARM7-LPC2148 中使用 ADC,方法是向模拟引脚提供不同的电压,并在模数转换后将其显示在16x2 LCD 屏幕上。

什么是ADC?

如前所述,ADC 代表模数转换,它用于将模拟值从现实世界转换为数字值,如 1 和 0。那么这些模拟值是什么?这些是我们在日常生活中看到的,例如温度、速度、亮度等。这些参数由各自的传感器作为模拟电压测量,然后这些模拟值被转换为微控制器的数字值。

让我们假设我们的 ADC 范围是从 0V 到 3.3V,并且我们有一个 10 位 ADC,这意味着我们的输入电压 0-3.3 伏将被分成 1024 个离散模拟值级别(2 10 = 1024)。含义 1024 是 10 位 ADC 的分辨率,类似地,8 位 ADC 的分辨率为 512 (28),16 位 ADC 的分辨率为 65,536 (216)。LPC2148 具有 10 位分辨率 ADC。

这样,如果实际输入电压为 0V,那么 MCU 的 ADC 会将其读取为 0,如果为 3.3V,则 MCU 将读取 1024,如果介于 1.65v 之间,则 MCU 将读取 512。我们可以使用下面的根据 ADC 的分辨率和工作电压计算 MCU 将读取的数字值的公式。

(ADC 分辨率 / 工作电压) = (ADC 数字值 / 实际电压值)

例如,如果参考电压为 3v:

pYYBAGMtdjGABlq3AAAT0D4NqgI682.png

我们在上一篇文章中详细解释了 ADC。

ARM7-LPC2148 中的 ADC

LPC2148 包含两个模数转换器。

这些转换器是单个 10 位逐次逼近模数转换器。

ADC0 有六个通道,ADC1 有八个通道。

因此, LPC2148 的可用 ADC 输入总数为 14 。

它仅转换(0 至 3.3V)范围内的输入电压。它不能超过 3.3V 的参考电压。因为它会损坏 IC 并提供不确定的值。

LPC2148中ADC的一些重要特性

每个转换器每秒能够执行超过 400000 个 10 位样本。

每个模拟输入都有一个专用的结果寄存器来减少中断开销。

单个或多个输入的突发转换模式。

输入引脚或定时器匹配信号转换时的可选转换。

两个转换器的全局启动命令。

ARM7-LPC2148 中的 ADC 引脚

如前所述,在 ARM7-LPC2148 中有两个通道 ADC0 带有 6 个模拟输入引脚和 ADC1 带有 8 个模拟输入引脚。所以总共有14个模拟输入引脚。下图显示了可用于模拟输入的引脚。

pYYBAGMtdjaAQlh-AADIPErUgzY027.jpg

由于 ADC 输入引脚与其他 GPIO 引脚复用。我们需要通过配置PINSEL 寄存器来启用它们以选择 ADC 功能。

下表显示了 LPC2148 中 ADC 的引脚和相应的 ADC 通道号。AD0 为通道 0,AD1 为通道 1

pYYBAGMtdfuAE-t1AAAdUtLzp9E000.png

ARM7-LPC2148 中的 ADC 寄存器

寄存器用于编程以使用 LPC2148 中的 A/D 转换功能。

以下是 LPC2148 中用于 A/D 转换的寄存器列表

1. ADCR:模数控制寄存器

用途:该寄存器用于配置LPC2148中的A/D转换器

2.ADGDR:模数全局数据寄存器

用途:该寄存器有 A/D 转换器的 DONE 位,转换的结果存储在这里。

3. ADINTERN:模数中断使能寄存器

用途:这是一个中断允许寄存器。

4. ADDR0 – ADDR7:模数通道数据寄存器

用途:该寄存器包含各个通道的 A/D 值。

5. ADSTAT:模数状态寄存器。

用途:该寄存器包含各个 ADC 通道的 DONE 标志以及各个 ADC 通道的 OVERRUN 标志。

在本教程中,我们将仅使用 ADCR 和 ADGDR 寄存器。让我们详细了解它们

LPC2148 中的 ADxCR 寄存器

AD0CR & AD1CR 分别用于通道 0 和通道 1。它是一个 32 位寄存器。下表显示了 ADCR 寄存器的位域。

poYBAGMtdfaAC0evAAANP9auuEs155.png

让我们看看如何配置单个寄存器

1. SEL:(0 到 7)位用于选择 ADC 转换的通道。为每个通道分配一位。例如,设置 Bit-0 将使 ADC 对 AD0.1 进行采样以进行转换。设置位-1将使AD0.1;同样设置第 7 位将为 AD0.7 进行转换。重要的一步是我们根据我们使用的端口有 PINSEL,例如 PLC2148 中 PORT0 的 PINSEL0。

2. CLCKDIV:(8 到 15)位用于时钟除数。这里将 APB 时钟(ARM 外设总线时钟)除以该值加 1 以产生 A/D 转换器所需的时钟,由于我们在 LPC2148 中使用逐次逼近法,该时钟应小于或等于 4.5 MHz。

3. BURST:第 16 位用于 BURST 转换模式。

设置 1:ADC 将对在 SEL 位中选择的所有通道进行转换。

设置 0:将禁用 BURST 转换模式。

4. CLCKS:(17 到 19)三个位用于选择突发模式下 A/D 转换的分辨率和时钟数,因为它是连续 A/D 转换模式。

poYBAGMtdfGAemp_AAASYla1-yQ418.png

5. PDN:第 21 位用于选择LPC2148 中 ADC 的掉电模式。

A/D 处于 PDN 模式。

A/D 处于操作模式

6. START:(24 到 26)位用于 START。当 BURST 转换模式通过设置 0 关闭时,这些 START 位对于何时开始 A/D 转换很有用。START 也用于边沿控制转换。即当 LPC2148 的 CAP 或 MAT 引脚有输入时,A/D 开始转换。让我们检查下表

pYYBAGMtdeSATLTLAAAh1un_pHg507.png

7. EDGE:第 27位用于 EDGE,仅当 START 位包含 010-111 时使用。它在有 CAP 或 MAT 输入时开始转换,您可以在上表中看到。

设置:0 -在下降沿

1 - 在上升沿

ADxGDR:ADC 全局数据寄存器

AD0GDR 和 AD1GDR 分别用于 ADC 通道 0 和 ADC 通道 1。

它是一个 32 位的寄存器,包含 A/D 转换的 RESULT 以及指示 A/D 转换完成的 DONE 位。下表显示了 ADGDR 寄存器的位域。

pYYBAGMtddiAc3MWAAAJPrDpoQ4424.png

1. RESULT:这些位(6 到 15)包含 ADCR SEL 寄存器中所选通道的 A/D 转换结果。该值仅在 A/D 转换完成后才被读取,这由DONE位指示。

示例:对于 10 位 ADC 结果,存储的值从(0 到 1023)变化。

2. CHANNEL:这些位 24 到 26 包含完成 A/D 转换的通道号。转换后的数字值出现在 RESULT 位中。

示例:000 用于 ADC 通道 0,001 用于 ADC 通道 1,依此类推

3. OVERRUN:OVERRUN的第 30位用于 BURST 模式。当设置为 1 时,先前转换的 ADC 值被新转换的 ADC 值覆盖。当寄存器被读取时,它会清除 OVERRUN 位。

4. DONE:第 31 位为 DONE 位。

设置 1:当 A/D 转换完成时。

设置 0:读取寄存器并写入 ADCR 时。

我们已经了解了 LPC2148 中 ADC 中使用的重要寄存器。现在让我们开始在 ARM7 中使用 ADC。

所需组件

硬件

ARM7-LPC2148 微控制器

3.3V稳压IC

5V稳压IC

10K 电位器 – 2 个

LED(任何颜色)

液晶显示(16X2)

9V电池

面包板

连接电线

软件

凯尔uVision5

魔法闪光工具

电路原理

poYBAGMtddGARgi3AAGt3iw6a6o317.pngpYYBAGMtdjqAXys8AADsEhqHxsI646.jpg

下表显示了LCD 和 ARM7-LPC2148 之间的电路连接。

ARM7-LPC2148液晶显示器 (16x2)

P0.4RS(寄存器选择)

P0.6E(启用)

P0.12D4(数据引脚 4)

P0.13D5(数据引脚 5)

P0.14D6(数据引脚 6)

P0.15D7(数据引脚 7)

pYYBAGMtdcyATFeFAAAZKpvS0r8808.png

重要提示:这里我们使用了两个稳压器 IC,一个用于 5V LCD 显示屏,另一个用于模拟输入,可以通过电位器改变 3.3V。

5V 稳压器与 LCD 和 ARM7 Stick之间的连接

5V稳压IC引脚功能LCD & ARM-7 LPC2148

1.左销+ Ve 来自电池 9V 输入数控

2.中心销- 来自电池的 VeLCD的VSS,R/W,K

ARM7的GND

3.右销稳压 +5V 输出LCD的VDD,A

+5V ARM7

带液晶显示器的电位器

电位器用于改变 LCD 显示屏的对比度。一个电位器有三个引脚,左引脚 (1) 连接到 +5V,中间引脚 (2) 连接到 LCD 模块的 VEE 或 V0,右引脚 (3) 连接到 GND。我们可以通过转动旋钮来调整对比度。

LPC2148 & 电位器与 3.3V 稳压器之间的连接

3.3V稳压IC引脚功能 ARM-7 LPC2148

1.左销- 来自电池的 Ve接地脚

2.中心销稳压 +3.3V 输出至电位器输入,电位器输出至P0.28

3.右销+ Ve 来自电池 9V 输入数控

为 ADC 编程 ARM7-LPC2148

要对 ARM7-LPC2148 进行编程,我们需要 keil uVision 和 Flash Magic 工具。我们正在使用 USB 电缆通过微型 USB 端口对 ARM7 Stick 进行编程。我们使用 Keil 编写代码并创建一个 hex 文件,然后使用 Flash Magic 将 HEX 文件闪存到 ARM7 棒。要了解有关安装 keil uVision 和 Flash Magic 以及如何使用它们的更多信息,请点击链接 Getting Started With ARM7 LPC2148 Microcontroller and Program it using Keil uVision。

在本教程中,我们使用 LPC2148 中的 ADC 将模拟输入电压(0 至 3.3V)转换为数字值,并在LCD 显示器(16x2)上显示模拟电压。电位器将用于改变输入模拟电压。

在本教程的末尾给出了在ARM 7 中使用 ADC的完整代码,这里我们将解释它的几个部分。

LPC2148-ADC编程涉及的步骤

1. PINSEL 寄存器用于选择 LPC2148 的端口引脚和 ADC 功能作为模拟输入。

PINSEL1 = 0x01000000;// 选择 P0.28 为 AD0.1
2.通过将值写入 ADxCR(ADC 控制寄存器)来选择转换的时钟和位精度。

AD0CR = 0x00200402; //将 ADC 操作设置为 10 位/11 CLK 用于转换 (000)
3.通过将值写入 ADxCR 中的 START 位开始转换。

在这里,我已写入 AD0CR 寄存器的第 24位。

AD0CR = AD0CR | (1<<24);
4.现在我们要检查相应的 ADxDRy(ADC 数据寄存器)的 DONE 位(第 31 位),因为它从 0 变为 1。所以我们使用while循环不断检查数据寄存器的第 31 位是否完成转换。

而(!(AD0DR1&0x80000000));
5.完成位设置为 1 后,转换成功,接下来我们从同一个 ADC 数据寄存器 AD0DR1 中读取结果并将值存储在一个变量中。

adc 值 = AD0DR1;
接下来我们使用一个公式将数字值转换为电压并存储在一个名为电压的变量中。

电压 = ( (adcvalue/1023.0) * 3.3 );
5.以下行用于显示模数转换后的数字值(0 到 1023)。

adc = adc 值;
sprintf(displayadc, "adcvalue=%f", adc);
LCD_DISPLAY(displayadc); //显示ADC值(0到1023)
6.以下行用于显示模数转换后和第 5 步后的输入模拟电压(0 至 3.3V)。

LCD_SEND(0xC0);
sprintf(伏特值,“电压=%.2f V”,电压);
LCD_DISPLAY(伏特值);//显示(输入模拟电压)
7.现在我们要在 LCD 显示屏上显示输入电压和数字值。在此之前,我们必须初始化 LCD 显示屏并使用适当的命令将消息发送到显示屏。

下面的代码用于初始化 LCD

void LCD_INITILIZE(void) //准备 LCD 的函数
{
IO0DIR = 0x0000FFF0; //设置引脚P0.12,P0.13,P0.14,P0.15,P0.4,P0.6为OUTPUT
delay_ms(20);
LCD_SEND(0x02); // 以 4 位操作模式初始化 lcd
LCD_SEND(0x28); // 2 行 (16X2)
LCD_SEND(0x0C); // 光标关闭时显示
LCD_SEND(0x06); // 自动递增光标
LCD_SEND(0x01); // 显示清除
LCD_SEND(0x80); // 第一行第一个位置
}
下面的代码用于在 LCD 上显示值

void LCD_DISPLAY (char* msg) //函数将发送的字符一一打印
​​​
{
uint8_t i=0;
while(msg[i]!=0)
{
IO0PIN = ( (IO0PIN & 0xFFFF00FF) | ((msg[i] & 0xF0)<<8) ); //发送高半字节
IO0SET = 0x00000050; //RS HIGH & ENABLE HIGH 打印数据
IO0CLR = 0x00000020; //RW LOW 写模式
delay_ms(2);
IO0CLR = 0x00000040;// EN = 0,RS 和 RW 不变(即 RS = 1,RW = 0)
delay_ms(5);
IO0PIN = ( (IO0PIN & 0xFFFF00FF) | ((msg[i] & 0x0F)<<12) ); //发送低半字节
IO0SET = 0x00000050; //RS & EN HIGH
IO0CLR = 0x00000020;
延迟毫秒(2);
IO0CLR = 0x00000040;
延迟毫秒(5);
我++;
}
}
以下函数用于创建延迟

void delay_ms(uint16_t j) // 以毫秒为单位的延迟函数
{
uint16_t x,i;
for(i=0;i {
for(x=0; x<6000; x++); // Forloop 在 Cclk = 60MHz 时产生 1 毫秒的延迟
}
}

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

    关注

    95

    文章

    5648

    浏览量

    539439
  • ARM7
    +关注

    关注

    3

    文章

    208

    浏览量

    50081
  • LPC2148
    +关注

    关注

    0

    文章

    25

    浏览量

    14850
收藏 人收藏

    评论

    相关推荐

    使用ESP8266和LPC2148远程控制设备的方式

    在本教程中,我们将ESP8266 Wi-Fi 模块与 ARM7-LPC2148 微控制器连接,并创建一个网络服务器来控制连接到 LPC2148 的 LED。工作流程将如下所示:
    的头像 发表于 09-20 16:21 2894次阅读
    使用ESP8266和<b class='flag-5'>LPC2148</b>远程控制设备的方式

    使用ARM7-LPC2148控制伺服电机的教程

    在本教程中,我们将使用 ARM7-LPC2148 控制伺服电机。伺服电机比步进电机具有低功耗的优势。当到达所需位置时,伺服电机停止其功耗,但步进电机继续消耗功率以将轴锁定在所需位置。伺服电机主要用于 机器人项目 ,因为它们的准确性和易于操作性。
    发表于 09-22 16:40 1112次阅读
    使用<b class='flag-5'>ARM7-LPC2148</b>控制伺服电机的教程

    ARM7-LPC2148连接7段显示器的教程

    今天在本教程中,我们将用ARM7-LPC2148连接7段显示器。在详细介绍之前,我们将了解如何控制7段模块以显示任意数量的字符。
    的头像 发表于 10-28 15:34 2175次阅读
    用<b class='flag-5'>ARM7-LPC2148</b>连接7段显示器的教程

    将16x2 LCD与ARM7-LPC2148连接并显示文字

    在本教程中,我们将了解如何将 16x2 LCD 与 ARM7-LPC2148 微控制器连接,并显示简单的欢迎消息。如果您是 ARM7 的新手,请从 ARM7 LPC2148 的基础知识
    的头像 发表于 10-28 17:12 1499次阅读
    将16x2 LCD与<b class='flag-5'>ARM7-LPC2148</b>连接并显示文字

    【PDF】ICDEV的lpc2148资料

    本帖最后由 eehome 于 2013-1-5 10:09 编辑 【PDF】ICDEV的lpc2148资料
    发表于 03-11 09:35

    ARM7-LPC2148开发板

    `Super ARM7-LPC2148开发套件SuperARM2148开发套件,集学习、实验、二次开发于一体,非常适合初学者快速入门。该套件标配基于ARM7TDMI-S内核的LPC2148
    发表于 04-18 17:21

    基于nRF905和LPC2148 ARM开发板的无线数据收发

    基于nRF905和LPC2148 ARM开发板的无线数据收发 如何改为基于nRF905和de2—115开发板的无线数据收发
    发表于 12-07 00:16

    arm7 —— lpc2148 GPIO之花样流水灯

    力天电子的lpc2148开发板,一共有四个流水灯。它们与SN74HC595D相连,然后接到2148处理器上。先点亮两边的两个(16,19),然后再点亮中间的两个(17,18),熄灭的时候先熄灭两边的,再熄灭中间的。程序如下图所示:#include #defineSCLK0
    发表于 03-24 14:08

    基于LPC2148和MCP2510的高速USB-CAN卡

    本文介绍了基于LPC2148和MCP2510的USB-CAN接口卡。LPC2148是基于ARM7TDMI-S核的微控制器,处理器速度高,内置USB2.0全速控制器和SPI接口。MCP2510是独立的CAN控制器, 支持V2.0A
    发表于 02-25 11:47 35次下载

    基于LPC2148的电机测速系统

      步进电机的调速和测速系统一般都采用ARM作为控制器,外加分立的数字逻辑电路和模拟电路构成。该系统以LPC2148作为控制核心,合理选择电动机的频率控制和闭环反馈控制,
    发表于 12-13 09:56 1232次阅读
    基于<b class='flag-5'>LPC2148</b>的电机测速系统

    LPC2148驱动例程

    LPC2148开发板所有设备驱动例程 有需要的下来看看
    发表于 12-30 15:58 6次下载

    LPC2148原理图

    LPC2148数据手册,有需要的下来看看
    发表于 02-22 16:55 20次下载

    使用ARM7 LPC2148微控制器构建一个简单的机械臂

    在本教程中,让我们使用 ARM7-LPC2148 微控制器构建一个简单的机械臂,通过手动控制几个电位器来拾取和放置物体。
    发表于 08-24 16:08 927次阅读
    使用<b class='flag-5'>ARM</b>7 <b class='flag-5'>LPC2148</b>微控制器构建一个简单的机械臂

    如何使用ARM7-LPC2148微控制器中的PWM控制LED的亮度

    在本教程中,我们将使用 ARM7-LPC2148 微控制器中的 PWM 控制 LED 的亮度。
    的头像 发表于 09-23 15:14 2755次阅读
    如何使用<b class='flag-5'>ARM7-LPC2148</b>微控制器中的PWM控制LED的亮度

    将步进电机与ARM7-LPC2148连接起来的方法

    在本教程中,我们将了解如何将步进电机与 ARM7-LPC2148 连接以及如何控制它的速度。
    的头像 发表于 09-23 16:50 1346次阅读
    将步进电机与<b class='flag-5'>ARM7-LPC2148</b>连接起来的方法