cortex m0 lpc1114 adc start位控制转换

发布者:科技驿站最新更新时间:2016-12-09 来源: eefocus关键字:cortex  lpc1114  adc  start位  控制转换 手机看文章 扫描二维码
随时随地手机看文章

“START位”位于AD模块控制寄存器bit24~bit26。

符号描述复位值
7:0SEL
选择哪个引脚用作采集和转换,当bit0=1,用AD0;当bit1=1,…,当bit7=1,用AD7在软件控制模式,当(BURST=0),只允许选择一个引脚,也就是说,这7位当中,只允许有1个位是1


在硬件扫描模式,当(BURST=1),可以允许1个,也可以允许多个甚至允许8个引脚都开启。如果所有位都是0,将自动使得SEL=0X01,即选择AD0

0x00
15:8CLKDIV
APB时钟(PCLK)除以(CLKDIV+1)就是AD模块的时钟,这个值必须≤4.5MHz。0
16BURST
触发模式位(注意:当BURST=1的时候,AD0INTEN寄存器中的ADGINTEN位必须为0)0
0软件控制模式:需要11个时钟转换
1硬件扫描模式:AD转换将会按照CLKS位设置的速度重复转换,扫描所有SEL设置成1的位。首先扫描SEL中最小的设置成1的位,然后扫描再大一些的设置成1的位。在转换过程中,把此位写0,可以停止转换。(注意:如果BRUST=1,START位必须为000,否则将不会开启转换。)
19:17CLKS
时钟精度选择位,精度越高,转换时间越长000
0x011 clocks / 10 bits
0x110 clocks / 9 bits
0x29 clocks / 8 bits
0x38 clocks / 7 bits
0x47 clocks / 6 bits
0x56 clocks / 5 bits
0x65 clocks / 4 bits
0x74 clocks / 3 bits
23:20
保留位,禁止给这些位写1Na
26:24START
当BURST=0,这些位控制软件控制转换方式0
0x0没有开始
0x1开始转换
0x2当PIO0_2/SSEL/CT16B0_CAP0引脚上产生bit27位设置的边沿信号,开始转换
0x3当PIO1_5/DIR/CT32B0_CAP0引脚上产生bit27位设置的边沿信号,开始转换


0x4当CT32B0_MAT0产生bit27位设置的边沿信号,开始转换
0x5当CT32B0_MAT1产生bit27位设置的边沿信号,开始转换
0x6当CT16B0_MAT0产生bit27位设置的边沿信号,开始转换
0x7当CT16B0_MAT1产生bit27位设置的边沿信号,开始转换
27EDGE
只有在START位为010~111时,这个位有效0
0在CAP/MAT引脚上产生上升沿触发转换
1在CAP/MAT引脚上产生下降沿触发转换
31:28
保留位,不允许写1到这些位Na

在CR寄存器中,由SEL位选择输入通道,由CLKDIV决定AD时钟,由BURST位控制转换触发模式,CLKS位决定转换精度,START位和EDGE位决定了软件触发模式下的转换模式。

新建一个工程,结构如下图所示:

lpc1114adc

在adc.h中,加入以下代码:

  1. #ifndef __NXP_ADC_H

  2. #define __NXP_ADC_H

  3. #define  Vref   3300

  1. extern void ADC_Init(uint8_t Channel);

  2. extern uint32_t ADC_Read(uint8_t Channel);

  1. #endif

在adc.c文件中,加入以下代码:

  1. #include “lpc11xx.h”

  2. #include “adc.h”

  3. void ADC_Init(uint8_t Channel)

  4. {

  5.    if(Channel>7) return;

  6.    LPC_SYSCON->PDRUNCFG &= ~(0x1<<4);        // ADC模块上电

  7.    LPC_SYSCON->SYSAHBCLKCTRL |= (1<<13);     // 使能ADC时钟

  8.    LPC_SYSCON->SYSAHBCLKCTRL |= (1<<16);     // 使能IOCON时钟

  9.    switch(Channel)

  10.    {

  11.       case 0: // 通道0配置 set channel 0

  12.       LPC_IOCON->R_PIO0_11 &= ~0x07;              //

  13.       LPC_IOCON->R_PIO0_11 |= 0x02;      // 把P0.11引脚设置为AD0功能

  14.       LPC_IOCON->R_PIO0_11 &= ~(3<<3) ;  // 去掉上拉和下拉电阻

  15.       LPC_IOCON->R_PIO0_11 &= ~(1<<7) ;   // 模拟输入模式

  16.       break;

  17.       case 1:  // 通道1配置 set channel 1

  18.       LPC_IOCON->R_PIO1_0 &= ~0x07;              //

  19.       LPC_IOCON->R_PIO1_0 |= 0x02;               // 把P1.0引脚设置为AD1功能

  20.       LPC_IOCON->R_PIO1_0 &= ~(3<<3) ;           // 去掉上拉和下拉电阻

  21.       LPC_IOCON->R_PIO1_0 &= ~(1<<7) ;           // 模拟输入模式

  22.       break;

  23.       case 2:  // 通道2配置 set channel 2

  24.       LPC_IOCON->R_PIO1_1 &= ~0x07;              //

  25.       LPC_IOCON->R_PIO1_1 |= 0x02;               // 把P1.1引脚设置为AD2功能

  26.       LPC_IOCON->R_PIO1_1 &= ~(3<<3) ;           // 去掉上拉和下拉电阻

  27.       LPC_IOCON->R_PIO1_1 &= ~(1<<7) ;           // 模拟输入模式

  28.       break;

  29.       case 3:  // 通道3配置 set channel 3

  30.       LPC_IOCON->R_PIO1_2 &= ~0x07;              //

  31.       LPC_IOCON->R_PIO1_2 |= 0x02;               // 把P1.2引脚设置为AD3功能

  32.       LPC_IOCON->R_PIO1_2 &= ~(3<<3) ;           // 去掉上拉和下拉电阻

  33.       LPC_IOCON->R_PIO1_2 &= ~(1<<7) ;           // 模拟输入模式

  34.       break;

  35.       case 4:  // 通道4配置 set channel 4

  36.       LPC_IOCON->SWDIO_PIO1_3 &= ~0x07;              //

  37.       LPC_IOCON->SWDIO_PIO1_3 |= 0x02;    // 把P1.3引脚设置为AD4功能

  38.       LPC_IOCON->SWDIO_PIO1_3 &= ~(3<<3) ;           // 去掉上拉和下拉电阻

  39.       LPC_IOCON->SWDIO_PIO1_3 &= ~(1<<7) ;           // 模拟输入模式

  40.       break;

  41.       case 5:  // 通道5配置 set channel 5

  42.       LPC_IOCON->PIO1_4 &= ~0x07;              //

  43.       LPC_IOCON->PIO1_4 |= 0x01;               // 把P1.4引脚设置为AD5功能

  44.       LPC_IOCON->PIO1_4 &= ~(3<<3) ;           // 去掉上拉和下拉电阻

  45.       LPC_IOCON->PIO1_4 &= ~(1<<7) ;           // 模拟输入模式

  46.       break;

  47.       case 6:  // 通道6配置 set channel 6

  48.       LPC_IOCON->PIO1_10 &= ~0x07;              //

  49.       LPC_IOCON->PIO1_10 |= 0x01;               // 把P1.10引脚设置为AD6功能

  50.       LPC_IOCON->PIO1_10 &= ~(3<<3) ;           // 去掉上拉和下拉电阻

  51.       LPC_IOCON->PIO1_10 &= ~(1<<7) ;           // 模拟输入模式

  52.       break;

  53.       case 7:  // 通道7配置 set channel 7

  54.       LPC_IOCON->PIO1_11 &= ~0x07;              //

  55.       LPC_IOCON->PIO1_11 |= 0x01;               // 把P1.11引脚设置为AD7功能

  56.       LPC_IOCON->PIO1_11 &= ~(3<<3) ;           // 去掉上拉和下拉电阻

  57.       LPC_IOCON->PIO1_11 &= ~(1<<7) ;           // 模拟输入模式

  58.       break;

  59.       default:break;

  60.    }

  61.    LPC_SYSCON->SYSAHBCLKCTRL &= ~(1<<16);    // 关闭IOCON时钟

  62.    LPC_ADC->CR = (1<

  63. (24<<8);   /* bit15:bit8  把采样时钟频率设置为2MHz 50/(24+1)*/

  64. }

  65. uint32_t ADC_Read(uint8_t Channel)

  66. {

  67.    uint32_t adc_value=0;

  68.    LPC_ADC->CR |= (1<<24); // 启动转换

  69.    while((LPC_ADC->DR[Channel]&0x80000000)==0);

  70.    adc_value = (LPC_ADC->DR[Channel]>>6)&0x3FF;

  71.    adc_value = (adc_value*Vref)/1024; // 转换为真正的电压值

  72.    return adc_value;        // 返回结果

  73. }

此文件中,定义了两个函数,一个是ADC初始化函数ADC_Init(),一个是ADC读值函数ADC_Read()。

第3~63行,ADC初始化函数,入口参数是通道号。

第5行,如果入口参数大于7,入口参数错误,退出函数。

第6行,给PDRUNCFG寄存器bit4写1,给ADC模块上电。

第7行,给SYSAHBCLKCTRL寄存器bit13写1,开启ADC模块时钟。

第8行,给SYSAHBCLKCTRL寄存器bit16写1,开启IOCON模块时钟,因为接下来,我们要配置单片机的引脚了。

第9~60行的配置,请看IOCON模块中相关引脚的寄存器,根据引脚寄存器的定义进行配置。

第61行,关闭IOCON时钟,因为引脚配置完毕,用不着这个模块了,关闭时钟节省功耗。

第62行,配置CR寄存器,选择通道,配置时钟。

第64~72行,ADC读值函数。

第66行,定义一个存放ADC值的变量。

第67行,启动转换。

第68行,观察数据寄存器转换完成标志位,等待转换完成。

第69行,获取ADC值。ADC值位于DR寄存器bit6~bit15位。读出来DR寄存器的值右移6位,即LPC_ADC->DR[channel]>>6;再把移位后的数的bit0~bit9取出,即把bit10以上的数都写成0,即把数“与”0x1111111111,

0与任何数都为0,1与任何数都为任何数,所以结果不会改变bit0~bit9的值,bit10以上的位都为0,即(LPC_ADC->DR[channel]>>6&0x3FF)。很多童鞋看到这条语句很复杂,无形中给自己的大脑设立了第一个门槛,然后分析了半天,没有头绪。当我给他们解释一番之后,才发现,只要看了DR寄存器的定义,和C语言中“右移”运行于“与”的运行即可解决。所以Ration再次强调,高手并不是掌握了特有的技术,而是掌握了扎实的基础。

第70行,把ADC值转换成电压值。因为ADC值是10位精度,210=1024,也就是说,ADC值由0~1023来表示0~VDD的电压值。利用等比公式

x/adc_value=Vref/1024    x表示真实电压值

由上面等比公式得出:x=adc_value*Vref/1024

DR寄存器:(DR[0]~DR[7])

符号描述复位值
5:0
保留位0
15:6V_VREF
当DONE位为1时,这些位表示ADC引脚上的测出的ADC值不定
29:16
保留位0
30OVERRUN
当转换完成的值没有被读出,而又一次转换完成,此位置1,读取DR寄存器值后,此位清00
31DONE
转换完成标志位,转换完成置1,读取DR寄存器后,此位清00

 

在main.c文件中,输入以下代码:

  1. #include “lpc11xx.h”

  2. #include “uart.h”

  3. #include “adc.h”

  4. void delay(void)

  5. {

  6. uint16_t i,j;

  7. for(j=0;j<5000;j++)

  8. for(i=0;i<500;i++);

  9. }

  10. int main()

  11. {

  12. uint16_t adc_value;

  13. UART_init(9600);

  14. ADC_Init(7);

  15. while(1)

  16. {

  17. delay();

  18. adc_value = ADC_Read(7);

  19. UART_send_byte(adc_value)>>8);

  20. UART_send_byte(adc_value);

  21. }

  22. }

打开串口调试助手,选好串口号,波特率调成9600,选择十六进制接收,即可以看到在AD7(P1.11)通道上测到的电压值。注意:输入到AD7(P1.11)引脚上的电压值不能超过VDD,否则将烧毁内部ADC模块,甚者烧毁整个芯片。

因为Vref=3300mV,所以发送到电脑的电压值单位也是mV,先发送高8位数据,后发送低8位数据。


关键字:cortex  lpc1114  adc  start位  控制转换 引用地址:cortex m0 lpc1114 adc start位控制转换

上一篇:lpc1114 cap引脚触发adc转换
下一篇:cortex m0 lpc1114 adc介绍资料详解

推荐阅读最新更新时间:2024-03-16 15:24

MSP430学习笔记(4)ADC12
几个术语: a)分辨率(LSB):表示输出数字量变化一个相邻数码所需要输入模拟电压的变化量,它定义为转换器的满刻度电压与2的n次幂,其中n为ADC的位数。 b)量化误差:由于有限数字对模拟值进行离散取值(量化)而引起的误差。因此,量化误差理论上为一个单位分辨率。即正负12LSB。 c)转换精度:反应实际的ADC模块在量化上与理想的ADC模块进行模数转换的差值。 d)转换时间:指ADC完成一次模/数转换所需要的时间。 2.结构: 3.参考电压发生器: a)指需要的基准信号,通常为电压基准。MSP430 ADC12内置参考电源,有6种可编程选择。 b)模拟多路器:当多个模拟信号进行采样并进行
[单片机]
MSP430学习笔记(4)<font color='red'>ADC</font>12
Xilinx多种应用指南
特别白皮书 – WP392:赛灵思灵活混合信号解决方案   http://www.xilinx.com/cn/support/documentation/white_papers/wp392_Agile_Mixed_Signal.pdf      业界领先的 28nm 7 系列高级 FPGA 已经通过前几代 FPGA 系列产品极大扩展了集成模拟子系统的功能。赛灵思 7 系列中的模拟子系统称为 XADC,其包含两个独立的 1 MSPS、12 位模数转换器 (ADC) 以及一个 17 通道模拟多路复用器前端。通过把 XADC 与 FPGA 逻辑紧密集成在一起,赛灵思推出了业界最灵活的模拟子系统。这种模拟与可编程逻辑的创新组合被称为灵
[嵌入式]
解读SAR ADC驱动运算放大器选择
运算放大器输出级极限   运算放大器的轨至轨运行是指其输入级或输出级,或者是指其输入级和输出级。作为驱动 SAR ADC 输入端的一个缓冲器,我们更关注的是运算放大器轨至轨的输出能力。一般说来,该输出能力表明了输出级能够接近电源轨的程度。该参数可在大多数低频或 DC 输出信号产品说明书中找到,因此更好地了解输出摆幅能力,将有助于在既定条件下驱动 ADC 输入端时,确定最佳工作点。   为了确定输出级极限,应事先开展如下测量工作:对于电源电压为 5V 的轨至轨运算放大器来说,输入信号的偏移为 2.5V 或为电源电压的一半。该运算放大器应事先在电压跟随器(或增益为 +1)配置中予以设置。峰至峰输入 AC 信号振幅从0 提高到了 5V,
[模拟电子]
解读SAR <font color='red'>ADC</font>驱动运算放大器选择
基于ARM Cortex-M3的MODBUS协议实现及其应用
摘要 针对变频器通信应用,介绍了MODBUS协议的特点及其组成;设计了RS485电路接口;并以ARMCortex-M3微控制器为核心,设计了MODBUS协议的实现方案。针对变频器F2000-G开发了嵌入式系统.实现变频调速功能,应用于无损检测试验仪。 关键词 MODBUS;RS485;ARM Cortex-M3;变频调速;嵌入式系统 漏磁探伤作为非接触式的无损探伤技术,其具有检测速度快、灵敏度高、无需耦合剂、易于实现自动化等特点,是钢轨探伤技术的重点研究方向。为解决漏磁探伤研究中的实验仿真问题,研制了基于嵌入式系统的无损探伤试验仪,通过实现MODBUS协议与变频器通信,以此驱动交流电机与机械试验装置,完成运动控制并进行无损探
[工业控制]
基于ARM <font color='red'>Cortex</font>-M3的MODBUS协议实现及其应用
ADC输入阻抗信号链设计总结
了解转换器阻抗是信号链设计的一个重要内容。总之,若非真正需要,为什么要浪费大笔资金去购买昂贵的测试设备,或者费力去测量阻抗?不如使用数据手册提供的RC并联组合阻抗并稍加简单计算,这种获取转换器阻抗曲线的方法更快捷、更轻松。   还应注意,工艺电阻容差可高达±20%。即使费尽辛苦去测量任何器件的输入或输出阻抗,也只能获取一个数据点(当然,除非测量多个批次的许多器件随温度和电源电压变化的情况)。请使用数据手册中的仿真R||C值,它提供了关于特征阻抗与频率关系的足够信息,由此可以设计出正常工作的信号链。
[模拟电子]
avr单片机mega32之ADC程序
查手册,写程序,有问题再讨论 ***************************************************************** //CPU:mega32 //编译器:iar #include ioavr.h #include adc.h int main(void) { int m; adc_init(); m = adc_get(0); m=m; while(1); } void adc_init(void) { ADMUX = 1 REFS0 | 0 ADLAR ;//参考电源:AVcc 右对齐 ADCSRA = 1 ADEN | 7;//adc使能 1
[单片机]
ATmega16读取RTC和ADC显示在LCD1602,同时串口输出
介绍mikroPascal for AVR 写的ATmega16读取RTC和ADC显示在LCD1602,同时串口输出,并写入EEPROM的程序。附带仿真文件。mikro编译器分为c,basic,pascal三种,除了语法有所区别外,使用和功能基本一样。有8051,AVR,PIC,ARM等版本,界面和语法都一样。学会一种芯片花很少时间就可以转到另一种芯片。自带常用库,帮助文件中例子很多,基本不需要其他文档就可以开始学习了。 仿真原理图如下 单片机源程序如下: program RTC_Read; var seconds, minutes, hours, day, month, year : byte; // Global
[单片机]
ATmega16读取RTC和<font color='red'>ADC</font>显示在LCD1602,同时串口输出
MSP430F42X系列单片机16ADC通用程序库
这个msp430单片机的16位ADC库文件的调用方法可先下载完整代码然后找到(例4.1.6)这一节,里面有调用方法 ADC16.c文件: /* MSP430F42X系列单片机16位ADC通用程序库 说明:该驱动程序库包含了常用的16位ADC操作与控制功能函数,如选择通道、设置信号放大倍数、设置数据格式、基准源输出开关等,以及常用采样函数,包括单通道采样、平均采样、多通道同时采样等。可以作为各种程序的底层驱动使用。 要使用该库函数,需要将本文件(ADC16.c)添加进工程,并在需要调用ADC函数的文件开头处包含 ADC16.h */ // MSP430FE425 // +------
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved