1、ADC1 and ADC2 are 10-bit successive approximation Anolog to Digital Converters.

  所谓successive approximation,是逐次逼近的意思;

  逐次逼近型ADC解释详见——博客http://blog.sina.com.cn/s/blog_a438e5290102wakc.html

2、ADC分为ADC1和ADC2,ADC1的功能相比起ADC2更为强大,我们使用的是ADC1;

3、ADC有多种模式:(1)Single mode(2)Continuous mode(3)Buffered continuous mode(4)Single scan mode(5)Continuous scan mode

我们选用Continuous mode来实现,主要实现步骤:

(1)模式选择:set CONT bit in the ADC_CR1 register (bit1),表示选择Continuous型;

       clear DBUF bit in the ADC_CR3 register (bit7),表示no-buffering型的Continuous。

(2)转换配置:set EOCIE bit in the ADC_CSR register (bit 5),表示EOC中断使能;

    在转换完成之后,硬件会自动将EOC(End of Conversion)flag置1,表示一次转换完成,进入下一次转换时需要在代码中将其清0;

    而EOCIE位是EOC 中断的使能位,当EOCIE为1时,允许EOC中断。

(3)开始转换:set ADON bit in the ADC_CR1 register (bit0)。

(4)转换完后的数据存放在ADC_DR register中,只需读取寄存器中的内容即可获得答案。

(5)停止转换:reset ADON bit,更直接的是将ADC_CR1 register赋值为0x00。

说明:

(*)DBUF=1(Buffered continuous mode)时,转换后的数据存放在ADC_DBxR(x=or 0...7 or 0...9)中;

  而DBUF=0时,转换后的数据存放在ADC_DR中;

(*)由于ADC1和ADC2都是10-bit,一个8bit的寄存器装不下,所以在数据存放寄存器ADC_DR中,分为ADC_DRH和ADC_DRL;

  我们采用右对齐的方式(ADC1_ALIGN_RIGHT)存储转换后的数据;所以10bit中的低8bit(D7...D0)存放在ADC_DRL中;剩下的2bit(D9、D8)存放在ADC_DRH的低位中,ADC_DRH的其余位全置0。同样的ADC1_ALIGN_LEFT为左对齐方式。

  说了这么多废话,其实只需要我们选择ADC1_ALIGN_RIGHT即可,其他操作都已经内部封装好了。

4、(软件部分)根据以上步骤开始编程:

(1)首先申请一个PIN脚给ADC,我们申请E6脚(第24脚)

  GPIO_Init(GPIOE, GPIO_PIN_6, GPIO_MODE_IN_FL_NO_IT);;

(2)初始化ADC的各类寄存器,清零;

(3)配置ADC1:

//1.Continuous conversion mode
//2.specifies 9 channels to convert
//3.Prescaler selection fADC1 = fcpu/2
//4.Conversion from Internal TIM1 TRGO event
//5.ADC1_ExtTrigger DISABLE
//6.Data alignment right
//7.Schmitt trigger disable on AIN9
//8.ADC1_SchmittTriggerState DISABLE

  ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_CHANNEL_9, ADC1_PRESSEL_FCPU_D2, \
    ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL9,\
    DISABLE);

(4)允许EOC中断,即将EOCIE置1,即ADC_CSR赋值为(uint8_t)0x20或(uint16_t)0x020;

(5)打开通用中断:enableInterrupts();

(6)开始转换:将ADON置1,即ADC_CR1赋值为(uint8_t)0x01;

 void main(void)
{
/* Init GPIO for ADC1 */
GPIO_Init(GPIOE, GPIO_PIN_6, GPIO_MODE_IN_FL_NO_IT); //pin E6 ,24 /* De-Init ADC peripheral*/
ADC1_DeInit(); //reset registers /* Init ADC1 peripheral */
ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_CHANNEL_9, ADC1_PRESSEL_FCPU_D2, \
ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL9,\
DISABLE); /* Enable EOC interrupt */
ADC1_ITConfig(ADC1_IT_EOCIE, ENABLE); /* Enable general interrupts */
enableInterrupts(); /*Start Conversion */
ADC1_StartConversion();
}

主函数

(7)中断处理,当EOC被硬件置1并产生中断,触发INTERRUPT_HANDLER(ADC1_IRQHandler, 22)

  中断便是传输结束,所以这时我们应该读取数据并且重置EOC准备下一次转换;

  读取数据:ADC1_GetConversionValue(void),内部函数,根据设置的左(右)对齐方式,返回一个16位的转换后的数据;

  清除EOC:将EOC重新写0;

(8)到这里已经完成了所有的操作,由于我们选用的是Continuous mode,所以只要我们没有将ADON写回0,转换就不会停,一轮接一轮的循环下去;

  但为了便于我们观察,可以在每一轮之后将ADON写0(在中断中写),这样在主函数里设置一个断点,并查看16位的返回值就可以观察到结果。

 INTERRUPT_HANDLER(ADC1_IRQHandler, )
{
/* Get converted value */
Conversion_Value = ADC1_GetConversionValue(); /* Clear EOC */
ADC1_ClearITPendingBit(ADC1_IT_EOC); /* Stop Continuous Conversion */
ADC1->CR1 = 0x00;
}

中断函数

5、硬件部分:

(1)将STM8S105单片机的第24脚外接一个10K的电阻,再由电阻另一端接一根导线;由接地端再接出一根导线,将两条导线分别接入稳压电源器的正负极;

(2)设置断点并运行程序,调节稳压电源器的电压(0-5V),可以发现不同的电压值会对应一个不同的16bit数;

(3)平均每增加0.05V,示数会增加一个10。

注意:24脚外一定要接一个电阻保护电路,否者在打开稳压电源器的瞬间,可能因为瞬间电流过大而击穿单片机。

我是照着一个ADC2的例子修改实现本次实验的,ADC2有的函数ADC1都有,而写ADC1实现得更多,所以在将ADC2改成ADC1时,存在着很多陷阱(函数参数、中断类型等);

但是真正弄明白我们需要拿ADC1实现什么, 又需要对ADC1做什么操作后,这些陷阱还是可以慢慢爬出来的;

ADC1能实现的东西还有很多,比如Buffered continuous mode、analog watchd等,由于我们的实验没有用到,就先不做说明。

Analog/digital converter (ADC)的更多相关文章

  1. STM8S——Analog/digital converter (ADC)

    1.ADC1 and ADC2 are 10-bit successive approximation Anolog to Digital Converters. 所谓successive appro ...

  2. Fully Digital Implemented Delta-Sigma Analog to Digital Converter

    http://www.design-reuse.com/articles/14886/fully-digital-implemented-delta-sigma-analog-to-digital-c ...

  3. Voltage Translation for Analog to Digital Interface ADC

    Voltage Translation for Analog to Digital Interface 孕龙逻辑分析仪 ZeroPlus Logic Analyzer How to modify an ...

  4. BOOST Converter Analog/Digital Adjusted Output Voltage TPS61045 MAX1932

    DIGITALLY ADJUSTABLE BOOST CONVERTER The TPS61045 is a high frequency boost converter with digitally ...

  5. k64 datasheet学习笔记35---Analog-to-Digital Converter (ADC)

    0.前言 本文主要介绍K64的ADC部分的特性,内部架构,信号描述及操作接口等 1.简介 1.1.ADC模块特性 线性逐次逼近算法,达16bit分辨率 达到4对差分和24个单端模拟量输入 输出模式 差 ...

  6. quick start guide for XMEGA ADC

    This is the quick start guide for the Analog to Digital Converter (ADC), with step-by-step instructi ...

  7. ADC分类及参数

    ADC分类 直接转换模拟数字转换器(Direct-conversion ADC),或称Flash模拟数字转换器(Flash ADC) 循续渐近式模拟数字转换器(Successive approxima ...

  8. adc转换原理

    模数转换器即A/D转换器,或简称ADC,通常是指一个将模拟信号转变为数字信号的电子元件.通常的模数转换器是将一个输入电压信号转换为一个输出的数字信号.由于数字信号本身不具有实际意义,仅仅表示一个相对大 ...

  9. ADC Power Supplies

    http://www.planetanalog.com/author.asp?section_id=3041&doc_id=563055 Jonathan Harris, Product Ap ...

随机推荐

  1. JS模式--通用对象池的实现

    var objectPoolFactory = function (createObjFn) { var objectPool = []; return { create: function () { ...

  2. EXT 可选择图片列表的表单控件实现

    先看一下表单效果: 点击图标,显示图标列表: 实现代码: var appform = new Ext.form.FormPanel({ id: 'appform', cardStep:0, url:A ...

  3. macOS 下配置 MAMP 开发环境(Mac + Apache + Mysql + PHP)

    macOS 中已经内置了 PHP.Python.Ruby.Perl 等常用的脚本语言,以及 Apache HTTP 服务器,所以使用起来非常方便.本文以最新的 macOS Sierra 10.12 配 ...

  4. 基于jqUI的日期选择(‘yy-mm-dd’)

    今天看某公司的网页,其中有个筛选条件是选择一个时间区间,从而选择出符合条件的项.什么也不说了,先看图左边的输入框,点击具体的日期,这里我选择的是2017-3-9,然后右边的输入框就只能选择这个日期以后 ...

  5. codeforces 803C Maximal GCD(GCD数学)

    Maximal GCD 题目链接:http://codeforces.com/contest/803/problem/C 题目大意: 给你n,k(1<=n,k<=1e10). 要你输出k个 ...

  6. C++学习 cout的格式化输出

    cout的格式化输出 1.常用: ①double 输出到小数点后n位:(保留精度 n位) #include <iostream> #include <iomanip> usin ...

  7. hdu3746 kmp求循环节

    CC always becomes very depressed at the end of this month, he has checked his credit card yesterday, ...

  8. redis 编译安装(生产环境推荐)

    一.安装redis 1.下载redis包 wget http://download.redis.io/releases/redis-3.2.1.tar.gz 2.解压redis包到/opt下 tar ...

  9. 小米红米1 android 4.4.4上操作数据库异常问题

    产生的问题: 小米红米1 android 4.4.4上,按HOME键,应用进入后台,再启动,应用进程直接挂掉 解决的方法: 这个是操作数据库,数据库关闭之后导致的异常,解决的方法: //4.0以上的版 ...

  10. JWebFileTrans(JDownload): 一款可以从网络上下载文件的小程序(三),多线程断点下载

    一 前言 本篇博客是<JWebFileTrans(JDownload):一款可以从网络上下载文件的小程序>系列博客的第三篇,本篇博客的内容主要是在前两篇的基础上增加多线程的功能.简言之,本 ...