STM8的ADC的五种工作模式

2020-02-12来源: elecfans关键字:STM8  ADC  工作模式

STM8的ADC的五种工作模式


STM8的ADC是10位的逐次比较型模拟数字转换器,多达16个多功能的输入通道。拥有5种转换模式,转换结束可产生中断。


STM8 ADC的初始化顺序如下:


1、AD输入通道对应的IO设置为上拉输入;


2、配置AD参数,如:预分频系数、是否使用外部触发转换、是否使用施密特触发器、是否使用缓存以及是否使用扫描模式等;


3、开启ADC;


4、开启转换;


注意!开启ADC和开启转换实际上都是置位ADON。


然后就可以通过ADC_DR寄存器读取转换后的值。



l 单次模式:


在单次转换模式中,ADC仅在由ADC_CSR寄存器的CH[3:0]选定的通道上完成一次转换。该模式是在当CONT位为0时通过置位ADC_CR1寄存器的ADON位来启动的。


一旦转换完成,转换后的数据存储在ADC_DR寄存器中,EOC(转换结束)标志被置EOCIE 被置位将产生一个中断。


注意!初始化的时候只能选择一个通道。转换多个通道只能通过反复重新初始化或扫描模式!


示例程序:


void  adc_init(void)


{  


GPIO_Init(GPIOD,GPIO_PIN_3,GPIO_MODE_IN_PU_NO_IT);//AIN4 IO设置为上拉输入


  ADC1_PrescalerConfig(ADC1_PRESSEL_FCPU_D2);//预分频2


  ADC1_ExternalTriggerConfig(ADC1_EXTTRIG_TIM,DISABLE);//不使用外部触发


  ADC1_SchmittTriggerConfig(ADC1_SCHMITTTRIG_CHANNEL4,DISABLE);


  //禁止AIN2 AIN4的施密特触发器,降低IO静态功耗


  //PD5,PD6上的通道如果施密特方式禁用会导致串口无法收发数据!


  


ADC1_ConversionConfig(ADC1_CONVERSIONMODE_SINGLE,//单次转换


                        ADC1_CHANNEL_4,//只能选择一个通道!


                        ADC1_ALIGN_RIGHT);//右对齐


 ADC1_Cmd(ENABLE);//开启ADC


}


void main( void )



u16value=0;


  adc_init();


  while(1)


  {


ADC1_StartConversion();//开启一次转换一次


while(!ADC1_GetFlagStatus(ADC1_FLAG_EOC));//等待转换完成


    ADC1_ClearFlag(ADC1_FLAG_EOC);//软件清除


    value=(u16)ADC1_GetConversionValue();//从ADC_DR中读取ADC值


}


}


l 连续模式与带缓存的连续模式:


在连换模式中,ADC在完成一次转换后就立刻开始下一次的转换。当CONT位被置位时即将ADC设为连续模式,该模式是通过置位 ADC_CR1寄存器的 ADON 位来启动的。


如果缓冲功能没有被使能(ADC_CR3寄存器的DBUF位=0),那么转换结果数据保存在ADC_DR寄存器中同时 EOC 标志被置位。如果EOCIE 位已被置位时将产生一次中断。然后开始下一次转换。


如果缓存功能被使能(DBUF=1),那么某个选定通道上的8个或者10个连续的转换结果会填满数据缓存(此时填满的是同一个通道的数据!!扫描模式时才是不同通道的数据!),当缓存被填满时,EOC(转换结束)标志被置位,如果EOCIE位已被置位,则会产生一个中断,然后一个新的转换自动开始。如果某个数据缓存寄存器在被读走之前被覆盖,OVR标志将置1。


如果要停止连续转换,可以复位清零CONT位来停止转换或者复位清零ADON位来关闭ADC的电源。


示例程序(不带缓存):


void  adc_init(void)


{  


GPIO_Init(GPIOD,GPIO_PIN_3,GPIO_MODE_IN_PU_NO_IT);//AIN4 IO设置为上拉输入


  ADC1_PrescalerConfig(ADC1_PRESSEL_FCPU_D2);//预分频2


  ADC1_ExternalTriggerConfig(ADC1_EXTTRIG_TIM,DISABLE);//不使用外部触发


  ADC1_SchmittTriggerConfig(ADC1_SCHMITTTRIG_CHANNEL4,DISABLE);


  //禁止AIN2 AIN4的施密特触发器,降低IO静态功耗


  //PD5,PD6上的通道如果施密特方式禁用会导致串口无法收发数据!


 


 ADC1_ConversionConfig(ADC1_CONVERSIONMODE_CONTINUOUS, //连续转换


                        ADC1_CHANNEL_4,//只能选择一个通道!


                        ADC1_ALIGN_RIGHT);//右对齐


 ADC1_Cmd(ENABLE);//开启ADC


 ADC1_StartConversion();//开启连续转换


}


void main( void )



u16value=0;


  adc_init();


  while(1)


  {


while(!ADC1_GetFlagStatus(ADC1_FLAG_EOC));//等待转换完成


    ADC1_ClearFlag(ADC1_FLAG_EOC);//软件清除


    value=(u16)ADC1_GetConversionValue();//从ADC_DR中读取ADC值


}


}


示例程序(带缓存):


void  adc_init(void)


{  


GPIO_Init(GPIOD,GPIO_PIN_3,GPIO_MODE_IN_PU_NO_IT);//AIN4 IO设置为上拉输入


  


ADC1_PrescalerConfig(ADC1_PRESSEL_FCPU_D2);//预分频2


  ADC1_ExternalTriggerConfig(ADC1_EXTTRIG_TIM,DISABLE);//不使用外部触发


  ADC1_SchmittTriggerConfig(ADC1_SCHMITTTRIG_CHANNEL4,DISABLE);


  //禁止AIN2 AIN4的施密特触发器,降低IO静态功耗


  //PD5,PD6上的通道如果施密特方式禁用会导致串口无法收发数据!


 


 ADC1_ConversionConfig(ADC1_CONVERSIONMODE_CONTINUOUS, //连续转换


                        ADC1_CHANNEL_4,//只能选择一个通道!


                        ADC1_ALIGN_RIGHT);//右对齐


 ADC1_Cmd(ENABLE);//开启ADC


 ADC1_StartConversion();//开启连续转换


ADC1_DataBufferCmd(ENABLE);//开启缓存


}


void main( void )



u16value=0;


  adc_init();


  while(1)


  {


while(!ADC1_GetFlagStatus(ADC1_FLAG_EOC));//等待转换完成


    ADC1_ClearFlag(ADC1_FLAG_EOC);//软件清除


    value=0;


for(u8 i=0;i<10;i++)//


    {


      value+=ADC1_GetBufferValue(i);//将10个缓存中的值求和


    }


    value=value/10;//求出ADC的平均值


}


}


注意,只有在连续转换模式下ADC_DB寄存器才能称之为缓存,此时存储的是同一个通道多次转换的值。在单次扫描和连续扫描模式下该寄存器被用来存放不同通道的转换值。


 


l 单次扫描模式:


该模式是用来转换从AIN0到AINn之间的一连串模拟通道,‘n’是在 ADC_CSR寄存器的CH[3:0]位中指定的通道编号(即CH[3:0]里配置第n个通道,就从通道0顺序递增逐个通道进行转换,直到第n个通道结束。例如,CH[3:0]里配置为AIN4,则对AIN0、AIN1、AIN2、AIN3、AIN4进行转换,其他通道不转换)。在扫描转换的过程中,序号 CH[3:0]位的值是被硬件自动更新的,它总保存当前正在被转换的通道编号。


单次转换模式可以在在SCAN 位被置位且CONT 位以被清零时通过置位 ADON 位来启动。


注意:当使用扫描模式时,不可以将AIN0到AINn之间通道对应的I/O口设为输出状态,因为ADC的多路选择器已经将这些I/O口的输出模块禁用了。


对于单次扫描模式,转换是从AIN0通道开始的,而且结果数据被存储在数据缓冲寄存器ADC_DBxR 中(例如,CH[3:0]里配置为AIN4,则ADC_DB0R存放AIN0的转换结果,ADC_DB1R存放AIN1的转换结果,以此类推。 ),当最后一个通道(通道‘n’)被转换完成后,EOC(转换结束)标志被置位,当EOCIE 位已被置位时将产生一个中断。


可以从缓冲寄存器中读取各个通道的转换结果值。如果某个数据缓存寄存器在被读走之前被覆盖,OVR标志将置1。


在转换序列正在进行过程中不要清零SCAN位;单次扫描模式可通过清零ADON位来立即停止。为了开启一次新SCAN扫描转换,可以通过对ADC_CR1寄存器的EOC位清零和ADON位置位来实现。


示例程序:


void  adc_init(void)


{  


GPIO_Init(GPIOC,GPIO_PIN_4,GPIO_MODE_IN_PU_NO_IT);//AIN2 IO设置为上拉输入


  GPIO_Init(GPIOD,GPIO_PIN_3,GPIO_MODE_IN_PU_NO_IT);//AIN4 IO设置为上拉输入


 


ADC1_PrescalerConfig(ADC1_PRESSEL_FCPU_D2);//预分频2


  ADC1_ExternalTriggerConfig(ADC1_EXTTRIG_TIM,DISABLE);//不使用外部触发


  ADC1_SchmittTriggerConfig(ADC1_SCHMITTTRIG_CHANNEL4,DISABLE);


  //禁止AIN2 AIN4的施密特触发器,降低IO静态功耗


  //PD5,PD6上的通道如果施密特方式禁用会导致串口无法收发数据!


  


ADC1_ConversionConfig(ADC1_CONVERSIONMODE_SINGLE,//单次转换


                        ADC1_CHANNEL_4,//配置通道号最大的那个


                        ADC1_ALIGN_RIGHT);//右对齐


  ADC1_Cmd(ENABLE);//开启ADC


ADC1_ScanModeCmd(ENABLE);//开启扫描模式


}


void main( void )



u16value1=0;


u16value2=0;


  adc_init();


  while(1)


  {


ADC1_StartConversion();//开启一次转换


while(!ADC1_GetFlagStatus(ADC1_FLAG_EOC));//等待转换完成


    ADC1_ClearFlag(ADC1_FLAG_EOC);//软件清除


    value1=(u16)ADC1_GetBufferValue(ADC1_SCHMITTTRIG_CHANNEL2)//读取AIN2的值


value2=(u16)ADC1_GetBufferValue(ADC1_SCHMITTTRIG_CHANNEL4)//读取AIN4的值


}


}


 


l 连续扫描模式:


该模式和单次扫描模式相近,只是每一次在最后通道转换完成时,一次新的从通道0到通道n扫


描转换会自动开始。如果某个数据缓存寄存器在被读走之前被覆盖,OVR标志将置1。连续扫描模式是在当SCAN位和CONT位已被置时,通过置位ADON位来启动的。在转换序列正在进行过程中不要清零SCAN位。


连续扫描模式可以通过清零ADON位来立即停止。另外一种选择就是当转换过程中清除CONT位那么转换会在下一次的最后一个通道转换完成时停止。


注意:在扫描模式(连续扫描模式)中,不要使用位操作指令(BRES)去清除EOC标志位,这是因为该指令是对整个ADC_CSR寄存器的一个读-修改-写操作。从CH[3:0]寄存器中读取当前的通道编号和写回该寄存器,将

[1] [2]
关键字:STM8  ADC  工作模式 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic487933.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:电路设计_STM8S003F3P6 AWU&ADC使用小结
下一篇:STM8S103之ADC

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM8S库文件判断指定IO输入引脚电平GPIO_ReadInputPin有问题
/**  * @brief  Reads the specified GPIO input data pin.  * @param  GPIOx : Select the GPIO peripheral number (x = A to I).  * @param  GPIO_Pin : Specifies the pin number.  * @retval BitStatus : GPIO input pin status.  */BitStatus GPIO_ReadInputPin(GPIO_TypeDef* GPIOx, GPIO_Pin_Ty
发表于 2020-02-08
STM8 GPIO输入输出模式
悬浮输入悬浮输入,也叫浮空输入,顾名思义,即引脚悬空。这种方式的输入阻抗很高。当悬浮输入的引脚上加上信号时,单片机所得到的信号并不确定是高电平或是低电平,是一个不确定的信号。悬浮输入的典型应用就是模数转换,外部的任何一个小信号都要经过A/D采样转换为数字信号。上拉输入上拉就是把电位拉高,比如拉到Vcc。上拉就是将不确定的信号通过一个电阻嵌位在高电平!电阻同时起限流作用!强弱只是上拉电阻的阻值不同。上拉输入最典型的应用就是外部按键,当按键未按下时,我们要保证它是高电平,当按键按下时才被拉低。推挽输出推挽输出(Push-pull output),也称为互补输出,推拉式输出。推挽输出模式导通损耗小,效率高。在此模式下,N-MOS、P-MO
发表于 2020-02-08
STM8 GPIO输入输出模式
STM8L的USART1串口通信详解 含例程
。/****************************************************************************************开发环境:IAR for stm8 v1.40.1*硬件平台:STM8L-DISCOVERY*功能说明:每隔500ms通过PC3引脚向上位机发送一组数据。串口配置为:波特为9600,8个数据位,1个停止位,无奇偶校验。*作    者:茗风****************************************************************************************/#include"
发表于 2020-02-08
使用STM8S105K4T6C 模数转换器的12通道
分享今天遇到的一个stm8s模数转换的小问题~~~这款单片机一共提供了7个模数转换通道,他们分别是AIN0-AIN5和AIN12。stm8s105k4t6c的管脚图其中AIN0-AIN5的配置和使用方法如下,配置为连续转换、扫描模式(代码写的不好,大神请见谅~):[mw_shl_code=c,true]/*---------------------------------包含头文件---------------------------------*/#include "adc.h" #define        ADC     
发表于 2020-02-08
stm8——LED流水灯实现
最近接触并学习了一款STM8系列的芯片。以前学习了的ARM9+Linux后,再来学习单片机就感到上手很快了。 芯片基本信息:Type:STM8L151G68-bit ultralow power MCU, up to 32 KB Flash, 1 KB Data EEPROM RTC, LCD, timers, USART, I2C, SPI, ADC, DAC, comparators具体可以查看datasheet:http://pdf-file.ic37.com/pdf4/STMICROELECTRONICS
发表于 2020-02-08
MCU程序设计之STM8S的optionbytes
今天使用STM8S在程序中修改optionbyte遇到问题一直读取为0,不能进入设置流程,之前的程序今天重新修改东西,使用新的片子,原来程序如下:  AFR_TEMP = (uint16_t)((uint16_t)0x01 << 8);  AFR_TEMP = AFR_TEMP | (uint16_t)0xFE;  AFR_TEMP = (AFR_TEMP >> 8);之所以直接赋值而不调用函数,是因为程序代码空间有限,使用函数调用方法修改没有问题,如下:  AFR_TEMP = FLASH_ReadOptionByte(0X4803);  AFR_TEMP
发表于 2020-02-08
小广播
何立民专栏 单片机及嵌入式宝典

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

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