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;

 1 void main(void)
 2 {
 3   /*  Init GPIO for ADC1 */
 4   GPIO_Init(GPIOE, GPIO_PIN_6, GPIO_MODE_IN_FL_NO_IT); //pin E6 ,24
 5
 6   /* De-Init ADC peripheral*/
 7   ADC1_DeInit(); //reset registers
 8
 9   /* Init ADC1 peripheral */
10   ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_CHANNEL_9, ADC1_PRESSEL_FCPU_D2, \
11             ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL9,\
12             DISABLE);
13
14   /* Enable EOC interrupt */
15   ADC1_ITConfig(ADC1_IT_EOCIE, ENABLE);
16
17   /* Enable general interrupts */
18   enableInterrupts();
19
20   /*Start Conversion */
21   ADC1_StartConversion();
22 }

主函数

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

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

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

  清除EOC:将EOC重新写0;

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

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

 1 INTERRUPT_HANDLER(ADC1_IRQHandler, 22)
 2  {
 3    /* Get converted value */
 4    Conversion_Value = ADC1_GetConversionValue();
 5
 6    /* Clear EOC */
 7    ADC1_ClearITPendingBit(ADC1_IT_EOC);
 8
 9    /* Stop Continuous Conversion */
10    ADC1->CR1 = 0x00;
11  }

中断函数

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

转载于:https://www.cnblogs.com/Christal-R/p/7018035.html

STM8S——Analog/digital converter (ADC)相关推荐

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

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

  2. 【mcuclub】模数转换ADC0832

    一.实物图 二.原理图 编号 名称 功能 1 CS 片选使能,低电平芯片使能. 2 CH0 模拟输入通道0,或作为IN+/-使用. 3 CH1 模拟输入通道1,或作为IN+/-使用. 4 GND 电源 ...

  3. 计算机仪器分析报告,仪器分析(大连理工大学) 1.2 计算机与仪器分析.ppt

    <仪器分析(大连理工大学) 1.2 计算机与仪器分析.ppt>由会员分享,可在线阅读,更多相关<仪器分析(大连理工大学) 1.2 计算机与仪器分析.ppt(33页珍藏版)>请在 ...

  4. 电子电路 专业术语表 英汉对照

    电压源 voltage source 电流源 current source 理想电压源 ideal voltage source 理 想电流源 ideal current source 伏安特性 vo ...

  5. adc参考电压是直流交流_无位置传感器无刷直流电机换相误差校正的新方法

    针对无位置传感器无刷直流电机运行时存在换相误差的问题,哈尔滨工程大学自动化学院的研究人员姚绪梁.林浩.鲁光旭.王景芳.赵继成,在2019年第22期<电工技术学报>上撰文,提出一种基于线电压 ...

  6. 用matlab的ADC和DAC过程,谈谈我理解的ADC和DAC

    0 序言 在讲模数转换(Analog Digital Converter,ADC)和数模转换(Digital Analog Convert,DAC)之前先说一下什么是模拟信号和数字信号. 模拟信号可以 ...

  7. 手机镜头,噪声建模,ISP,ISO与analog gain

    最近在做夜景去噪声的low level工作,相关工作可以说是非常的难以及boring.因为这种low level你必须往上层,往底层走,甚至说需要了解ISP相关的知识:因此这段时间对于相关知识进行了大 ...

  8. 微雪树莓派PICO笔记——4. ADC(模拟数字转换器)

    文章目录 什么是ADC RP2040 ADC技术参数 ADC大致框架图 [MicroPython]machine.ADC类函数详解 代码实现 如果我们需要使用PWM精准的控制LED的亮度,就需要反馈 ...

  9. matlab建模sar adc,SAR ADC的系统级建模与仿真

    徐韦佳,田俊杰,施琴 (中国人民解放军理工大学 理学院,江苏 南京 211101) 摘要:为了实现逐次逼近型模数转换器(Successive Approximation AnalogtoDigit ...

  10. 嵌入式知识-ARM裸机-学习笔记(12):ADC模数转换器

    嵌入式知识-ARM裸机-学习笔记(12):ADC模数转换器 一.ADC 1. 什么是ADC ADC(analog digital converter):模数转换(也就是模拟量转换为数字量).由于CPU ...

最新文章

  1. 亚马逊千人评分4.6分,用小说的方式解锁开发难题!
  2. 嵌入式linux内核编译感想,嵌入式Linux内核的交叉编译编译-基于2.6.26
  3. Redis工具类的封装
  4. 2021 icme_重磅 | 2021年U.S. News 全美院校排名发布,疫情之下,排名大洗牌?!
  5. [上架] iOS 上架更新版本号建议
  6. 韩国有多大?相当于中国哪里?
  7. 如何降低 Python 的内存消耗量?
  8. OSChina 周日乱弹 ——不穿泳衣,我都不好意思上厕所
  9. 集成电路的设计 —— 半导体
  10. java 中的匿名内部类
  11. 加载对话框Android,Android实现加载对话框
  12. matlab风应力工具包,MSATSI:结合可靠经典方法的新简化用户处理及可视化工具的应力反演MATLAB软件包.pdf...
  13. 微信小程序登陆踩坑记录
  14. 《涛声依旧》填词改编《测试依旧》
  15. 依赖计算机英语作文,过度依赖电脑的危害的英文作文
  16. 2020面试题合集之吊打面试官系列(一),Android中为什么需要Handler
  17. 如何批量将 jpeg、png、gif、bmp、webp 转换为 svg 格式
  18. 使用oracle.jdbc.OracleDriver
  19. 海思技术交流论坛/知扬开源技术论坛
  20. Ubuntu调用USB摄像头

热门文章

  1. JavaScript专题之跟着 underscore 学节流
  2. React-Native入门指南——第七篇动手写组件
  3. N个数全排列的非递归算法
  4. 活着只是你幸运--512汶川大地震募捐倡议
  5. Cesium 计算一个点正北方向x米的另一个点的坐标
  6. 华为oj c语言 dna序列,(华为OJ)C 语言—计算字符串的距离(动态规划算法)
  7. 【git体验】git基础-3目录之间关系
  8. Luogu2602[ZJOI2010] 数字计数
  9. HDU1847 Good Luck in CET-4 Everybody!
  10. Windows查看计算机服务监听的端口号