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等,由于我们的实验没有用到,就先不做说明。

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

  1. 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. Java通过Shell执行Sqoop命令没日志的问题

    修改执行部分的代码,改成用InputStream.read(byte[])的方法从流中读取数据 package com.example.demo.utils; import java.io.*; pu ...

  2. (z转)基于CPU的Bank BRDF经验模型,实现各向异性光照效果!

    摘抄“GPU Programming And Cg Language Primer 1rd Edition” 中文 名“GPU编程与CG语言之阳春白雪下里巴人” BRDF 光照模型 10.2.1 什么 ...

  3. SpringBoot部署流程

    一.  项目介绍 a)     本项目为SpringBoot项目 b)     使用内置Tomcat容器 一.  操作步骤 a)     配置pom.xml文件,确定打包方式 b)     更改项目返 ...

  4. 逆向分析-IDA动态调试WanaCrypt0r的wcry.exe程序

    0x00 前言 2017年5月12日全球爆发大规模蠕虫勒索软件WanaCrypt0r感染事件,各大厂商对该软件做了深入分析,但针对初学者的分析教程还比较少,复现过程需要解决的问题有很多,而且没有文章具 ...

  5. 推荐一个好用的以多tab标签方式打开windows CMD的工具

    最近我在做基于nodejs的微服务开发,需要在windows命令行里启动很多微服务.我的windows 10任务栏是这样子的: 我想找一款能像下图Chrome标签页这样打开windows 10 CMD ...

  6. 字典树(前缀树)-Java实现

    字典树 字典树是一种树形结构,优点是利用字符串的公共前缀来节约存储空间.在这提供一个自己写的Java实现,非常简洁. 根节点没有字符路径.除根节点外,每一个节点都被一个字符路径找到. 从根节点到某一节 ...

  7. CF585D Lizard Era: Beginning

    嘟嘟嘟 题面我是不会咕的(没有真香):有\(n(n \leqslant 25)\)个任务和三个人,每次任务给出每个人能得到的值,每次任务选两个人,使\(n\)个任务结束后三个人得到的值是一样的,且尽量 ...

  8. jenkins权限设置

  9. package结构

    1.package结构 一个package下常见的文件. 路径有:├── CMakeLists.txt #package的编译规则(必须)├── package.xml #package的描述信息(必 ...

  10. winform程序打包成exe文件

    拿到一个实现功能的winform小程序,如何利用NSIS工具制作安装包? 1.NSIS工具下载地址 点我下载 2.启动NSIS工具,如图点击 3.选择"使用脚本向导创建新的脚本文件" ...