STM8S——Analog/digital converter (ADC)

发布者:HeavenlyWhisper最新更新时间:2019-11-18 来源: eefocus关键字:STM8S  Analog  digital  converter  ADC 手机看文章 扫描二维码
随时随地手机看文章

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


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


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


关键字:STM8S  Analog  digital  converter  ADC 引用地址:STM8S——Analog/digital converter (ADC)

上一篇:STM8单片机复位源判断
下一篇:STM8S——Universal asynchronous receiver transmitter (UART)

推荐阅读最新更新时间:2024-11-11 06:40

DC-DC转换器与ADC电源接口
在前面的文章中,我们讨论了关于ADC电源输入的各种话题;现在,让我们顺着这个方向,略为扩充一下我们的话题。 目前为止,我们讨论了各种不同类型的ADC电源输入,以及驱动它们的一些方法。 我们主要偏重于使用LDO,但也看出来,这并不总是最好的方法。 取决于系统的限制因素和性能规格,采用其它拓扑可能会更好。 因此之故,让我们看看使用DC-DC转换器(有时也称为开关调节器)以及LDO来驱动ADC电源输入的情况(见图1)。 图1. 至ADC电源输入 采用DC-DC转换器和LDO驱动ADC电源输入 使用DC-DC转换器时,重要的是需确保输出LC滤波器经适当设计,满足设计的电流要求以及DC-DC转换器的开关频率要求。 此外同样重要的是
[电源管理]
DC-DC转换器与<font color='red'>ADC</font>电源接口
51单片机MPX4115压力传感器+ADC0832仿真课设程序
单片机源程序如下: #include math.h #include absacc.h #include intrins.h #include reg51.h #define uchar unsigned char #define uint unsigned int #define ulong unsigned long #define BUSY 0x80 //常量定义 #define DATAPORT P0 sbit Alarm_led_red =P1^6; //超过压力表量程最大值红灯报警 sbit Alarm_led_green=P1^7; //低于压力表量程最小
[单片机]
adc12单通道多次转换例程(msp430f5529)
#include msp430f5529.h #define NUM_OF_RESULT 8; volatile unsigned int results ; //开辟8个16位内存空间 void main(void) { WDTCL = WDTPW + WDTHOLD; P6SEL |=BIT0; ADC12CTL0 = ADC12ON + ADC12SHT0_8 + ADC12MSC; //打开adc12,设置采样间隔,设置多次采样转换 ADC12CTL1 = ADC12SHP + ADC12CONSEQ_2; //设置采样定时器作为采样触发信号,采样模式为单通道多次转化 ADC12IE
[单片机]
技术文章—交织型采样ADC基本原理解析
简介 在当今的许多细分市场, 交织型模数转换器(ADC)在许多应用中都具有多项优势。在通信基础设施中,存在着一种推动因素,使ADC的采样速率不断提高,以便支持多频段、多载波无线电,除此之外满足DPD(数字预失真)等线性化技术中更宽的带宽要求。在军事和航空航天领域,采样速率更高的ADC可让多功能系统用于通信、电子监控和雷达等多种应用中——此处仅举数例。工业仪器仪表应用中始终需要采样速率更高的ADC,以便充分精确地测量速度更高的信号。 首先,一定要准确地了解交织型ADC是什么。要了解交织,最好了解一下实际发生的情况以及它是如何实现的。有了基本的了解后,再讨论交织的好处。当然,我们都知道,天下没有免费的午餐,因此需要充分评估和
[模拟电子]
技术文章—交织型采样<font color='red'>ADC</font>基本原理解析
TI发布兼具专业性能与便携式集成化的音频ADC系列产品
2015年3月9日,北京讯--- 近日,德州仪器推出了6款高性能音频模数转换器 (ADC) 系列产品。该系列产品以高达110dB的动态范围为特色,PCM1865系列产品中的这些器件集成了那些常见于便携式音频编解码器的特性,而同时也为设计人员提供了之前只见于单一功能、专业音频ADC中的性能等级。要获得与全新音频ADC相关的更多信息,敬请访问:www.ti.com/PCM1865-pr-cn。 PCM1865音频ADC由单个3.3V电源供电,免除了对于专用模拟5V电源轨的传统需求,从而使得这些产品尽可能的小巧又高效。全新系列中的每个款产品均可解决很多系统级的设计难题,其中包括低频和接地噪声、输入信号电平灵敏度,以及衰
[模拟电子]
TI发布兼具专业性能与便携式集成化的音频<font color='red'>ADC</font>系列产品
STM8S MAX7219点阵模块驱动芯片程序
以下为.h文件: #ifndef __MAX7219_H #define __MAX7219_H #include stm8s_gpio.h #include stm8s.h #include iostm8s103f3.h #include intrinsics.h #include tim1.h #define uchar unsigned char #define uint unsigned int #define count 8 void Init_MAX7219(void); void MAX7219_Init(void); void Write_Max7219_byte(uchar Data);
[单片机]
<font color='red'>STM8S</font> MAX7219点阵模块驱动芯片程序
stm8s 时钟库函数选择内部RC初始化
//本文选择16M内部RC震荡,分频为1 即系统时钟为16M void CLK_HSICmd(FunctionalState NewState) { /* Check the parameters */ assert_param(IS_FUNCTIONALSTATE_OK(NewState)); if (NewState != DISABLE) { /* Set HSIEN bit */ CLK- ICKR |= CLK_ICKR_HSIEN; } else { /* Reset HSIEN bit */
[单片机]
可调高效多通道高性能分集接收机
引言   利用分集接收机构建通信系统会导致较高的器件数目、功耗、板级空间占用以及信号布线。为了降低 RF 组件数量,我们可以使用正交解调器的直接转换架构。I/Q 的不匹配会使得构建高性能接收器较为困难。这种架构要求在 RF 输入和占用大量板级空间的基带数字输出之间安装一些组件。超外差接收机只需要一个模数转换器 (ADC),而正交解调器则需要一个双通道 ADC 来处理现实及镜像模拟。对于单载波系统而言,这种情况或许是可以接受的,但是分集和直接转换接收机可以有效地用于多通道系统吗?这种解决方案能够有效地适应一个以上或两个通道吗?凭借 RF 和 ADC 组件全新的集成度,可以创建一个高效、高性能的多通道直接转换分集接收机。
[电源管理]
可调高效多通道高性能分集接收机
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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