使用STM8S003K3 ADC简介以及初始化

2020-02-07来源: eefocus关键字:STM8S003K3  ADC  初始化

简介

最近用stm8s003k3开发项目,用到了ADC模块,记录一下笔记也分享一下心得

软件环境:STVD+COSMIC

硬件环境:STM8S003K3 TSSOP20封装

模块:ADC


1.ADC功能以及框图

在这里插入图片描述

由STM8S参考手册可以得到几个信息:

1、有ADC1和ADC2两个(实际上得看封装,我这款只有ADC1)

2、有多达16个输入通道(看封装,我这款只有2~6输入)

3、有好几个扩展功能

具体的功能如下所示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

*由框图可以看出ADC1和ADC2差别还是有一点的,一些多引脚的芯片中ADC2的带模拟参考正负极,在模拟放大中,可通过减小参考电压来提供更大的分辨率。由于没有用到所以不考虑

*转换结束时可产生中断

*f MASTER 可以被分频2 到18

*ADC 输入电压范围:VSSA ≤ VIN ≤ VDDA

*可以选择ADC 专用外部中断(ADC_ETR)或者定时器触发信号(TRGO)来作为

外部触发信号

在这里插入图片描述

2.功能描述

2.1Enable/Disable ADC

在这里插入图片描述

2.2转换模式

ADC有五种转换模式:单次模式、连续模式、带缓存的连续模式、单词扫描模式、连续扫描模式,可以将以上模式分类便于理解


2.2.1ADC单通道:

A、要求:进行一次ADC转换,配置为单次模式使能,扫描模式关闭,这样ADC的这个通道转换一次后,就停止转换了。

B、要求:进行连续ADC转换,配置为连续模式使能,扫描模式关闭,这样ADC的这个通道转换一次后,接着进行下一次转换,不断连续。


2.2.2ADC多通道:

C、要求:进行一轮ADC转换:配置为单次模式使能,扫描模式使能,这样ADC的多个通道,按照配置的顺序依次转换一次后,就停止了。

D、要求:进行连续的ADC转换:配置为连续模式使能,扫描模式使能,这样ADC的多个通道,按照配置的顺序转换一次后,接着进行下一次转换,不断连续。


2.2.3结论:

扫描模式只在多通道的条件下有效,来使得各个通道按照配置循环依次转换,而单次模式无论在单通道还是多通道下只对这些或者这个通道进行一次转换


2.3对齐方式

通多ADC_CR2的ALIGN位控制对齐方式

在这里插入图片描述

2.4施密特触发器

施密特触发器是用于输入信号整形的,ADC应该不用施密特触发,才可以保持输入模拟信号的连续性 ,备注不用的ADC输入口如果禁止了施密特触发,比如UART的RX,在ADC初始化时禁止了施密特触发,该脚又复用为UART-RX,此时RX信号根本进不到UART接收模块中,将不能产生UART接收中断,后来当它打开施密特触发器后,URAT-RX接收也就正常了。


3.ADC初始化代码实现

static Adc_Config_t      Adc_Config;


void Adc_Init(const  Adc_Config_t * config)

{

memcpy(&Adc_Config, config, sizeof(Adc_Config));

/* 清空对齐标志位 */

    ADC_CR2 &= (uint8_t)(~0x08);

    /* ----------------------------------对齐方式 ----------------------------------*/

    ADC_CR2 |= (uint8_t)Adc_Config.Align;

     /* ---------------------------------转换方式 ----------------------------------*/

    if (Adc_Config.Mode == 0x01)

    {

        /* 设置连续*/

        ADC_CR1 |= 0x02;

    }

    else 

    {

        /*设置单次转换模式 */

        ADC_CR1 &= (uint8_t)(~0x02);

    }

    /* 清空ADC通道 */

    ADC_CSR &= (uint8_t)(~ADC_CSR_CH);

    /* 设置ADC的通道 */

    ADC_CSR |= (uint8_t)(Adc_Config.Channel);

    /* ------------------------------------ADC的分频------------------------------- */

    /*清空寄存器 */

    ADC_CR1 &= (uint8_t)(~0x70); 

    /*配置寄存器 */

    ADC_CR1 |= (uint8_t)(Adc_Config.Prescaler);


    /* ------------------------------------ADC的分触发方式------------------------------- */

    /* 清空寄存器*/

    ADC_CR2 &= (uint8_t)(~0x30);

    /* 选择触发方式或关闭 */

    ADC_CR2 |= (uint8_t)(Adc_Config.ExtTrig);


    /* ----------------------------------配置要关闭的施密特触发器--------------------------------- */

    ADC_TDRL |= (uint8_t)((uint8_t)0x01 << (uint8_t)Adc_Config.SchmittTrigg);


    /* 使能ADC */

    ADC_CR1 |= 0x01;

  

    /* 使能ADC中断 */

    ADC_CSR |= 0x20;

    

    /* 开始转换,第二次开启哦 */

    ADC_CR1 |= ((uint8_t)0x01)

 }


然后在.h中定义我们要的枚举和结构体


  typedef enum

  {

    ADC_ALIGN_LEFT = (uint8_t)0x00,

    ADC_ALIGN_RIGHT = (uint8_t)0x08

  } Adc_AlignType_t;

  

  typedef enum

  {

    ADCDRV_CHANNEL2 = 0x02,

    ADCDRV_CHANNEL3 = 0x03,

    ADCDRV_CHANNEL4 = 0x04,

    ADCDRV_CHANNEL5 = 0x05,

    ADCDRV_CHANNEL6 = 0x06

  } Adc_Channel_t;

  

  typedef enum

  {

    ADC_EXTTRIG_TIM = (uint8_t)0x40,

    ADC_EXTTRIG_GPIO = (uint8_t)0x50,

    ADC_EXTTRIG_DISABLE = (uint8_t)0x00

  } Adc_ExtTrig_TypeDef;

  

  typedef enum

  {

    ADC_SCHMITTTRIG_CHANNEL2 = 0x02,

    ADC_SCHMITTTRIG_CHANNEL3 = 0x03,

    ADC_SCHMITTTRIG_CHANNEL4 = 0x04,

    ADC_SCHMITTTRIG_CHANNEL5 = 0x05,

    ADC_SCHMITTTRIG_CHANNEL6 = 0x06

  } Adc_SchmittTrigg_TypeDef;

  

  typedef enum

  {

    ADC_CONVERSIONMODE_SINGLE = (uint8_t)0x00,

    ADC_CONVERSIONMODE_CONTINUOUS = (uint8_t)0x01

  } Adc_ConversionMode_t;

  

  typedef enum

  {

    ADC_PRESSEL_FCPU_D2  = (uint8_t)0x00, 

    ADC_PRESSEL_FCPU_D3  = (uint8_t)0x10, 

    ADC_PRESSEL_FCPU_D4  = (uint8_t)0x20,

    ADC_PRESSEL_FCPU_D6  = (uint8_t)0x30,

    ADC_PRESSEL_FCPU_D8  = (uint8_t)0x40, 

    ADC_PRESSEL_FCPU_D10 = (uint8_t)0x50,

    ADC_PRESSEL_FCPU_D12 = (uint8_t)0x60, 

    ADC_PRESSEL_FCPU_D18 = (uint8_t)0x70 

  } Adc_PrescalerType_t;

  

  typedef struct

  {

    Adc_ConversionMode_t Mode;

    Adc_Channel_t Channel;

    Adc_PrescalerType_t Prescaler;

    Adc_AlignType_t Align;

    Adc_ExtTrig_TypeDef ExtTrig;

    Adc_SchmittTrigg_TypeDef SchmittTrigg;

  } Adc_Config_t;


然后我们定义一个配置好参数的结构体,将这个结构体的首地址传进初始化函数就可以啦

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

上一篇:STM8S使用外部时钟引起串口数据传输错误
下一篇:关于STM8S003F3P6开发的笔记

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

推荐阅读

解决STM8S103K3T6打开BEEP功能遇到的无法操作BEEP_CSR的问题
最近项目用到了STM8S103K3T6的beep功能,调试时遇到了无法更改寄存器BEEP_CSR的值的问题,造成无法开启beep功能;网上一搜全是提到OPTION BYTE的设置问题,不管用IAR或者stvp烧写前设置,还是在程序中操作FLASH通过软件方式改变OPTION BYTE,都没有作用,自己翻看最新版的手册,里面讲的也是前后冲突,英文版的也是言归正传,项目中就是在PD4脚接的无源蜂鸣器,没什么问题;手册中也可能为了兼容多个型号说的不够详细,前后冲突在手册DocID15441 Rev 13的第4.9章说要设置op(option data简写)的ARF7位,打开复用但是在第8.1章又说AFR7是保留位,无作用,在第八章中也没
发表于 2020-03-17
解决STM8S103K3T6打开BEEP功能遇到的无法操作BEEP_CSR的问题
stm8s之STVD中stm8s903k.h: No such file or directory问题解决
关键问题是找不到stm8s903k.h那么stm8s903k.h到底在哪呢?查一下STVD安装路径C:Program Files (x86)STMicroelectronicsst_toolsetinclude相信您能找到超多的ST系列单片机之.h文件 stm8s903k.h也在其中把stm8s903k.h的路径加进去,OK!
发表于 2020-02-29
stm8s之STVD中stm8s903k.h: No such file or directory问题解决
STM8S105K4使用硬件SPI来读取LSM9DS1
STM8S105K4使用硬件spi读LSM9DS1的注意SPI配置的几个要素:MSB、主从、PHASE_EDGE、POLARITY、NSS ;主机时钟和SPI的速度的匹配,需要测试。STM8的spi初始化函数中的CRC是个什么鬼?SPI读取LSM9DS1时,需要先指定读取地址,然后再发一个直接的时序,读取该地址的数据。此时一定把第一次读地址的数据(虽然没有用)也读出来。代码SPI_Cmd(ENABLE);    CS_M_L;    while(SPI_GetFlagStatus(SPI_FLAG_TXE) == RESET);    SPI->DR
发表于 2020-02-20
STM8S105K6T6单片机的IIC配置问题
最近在用MCP3421,需要用到IIC接口。MCU用的是STM8S105K6T6。使用MCU内部的IIC外设,这个接口配置折腾一下午,遇到了很坑爹的事情。我使用的是寄存器开发的,该设置了感觉都设置好了,就是不能工作。后来以为没配置好,又用库函数来开发,妈的 ,还是不能工作。后来在群里的一位大神的指导下成功的调通了IIC。闲话有点多,毕竟是我第一次开通博客来写博客的,心情不免有些激动。现在把经验分享给不知道的小伙伴们,少走些弯路。在使用STM8S105K6T6的IIC前,必须先通过STVP这个软件来进行配置。这三个步骤是最重要的,当然还需要选择单片机的下载模式,型号什么的,这个不是本文的重点。特别要强调一点,步骤二中一定要选择第二
发表于 2020-02-20
STM8S105K6T6单片机的IIC配置问题
使用STM8S105K4T6C 模数转换器的12通道
分享今天遇到的一个stm8s模数转换的小问题~~~这款单片机一共提供了7个模数转换通道,他们分别是AIN0-AIN5和AIN12。stm8s105k4t6c的管脚图其中AIN0-AIN5的配置和使用方法如下,配置为连续转换、扫描模式(代码写的不好,大神请见谅~):[mw_shl_code=c,true]/*---------------------------------包含头文件---------------------------------*/#include "adc.h" #define        ADC     
发表于 2020-02-08
STM8L ADC功能
STM8L系列单片机集成了AD功能,有一个ADC模块,但是有最多可达28个AD通道,可以配置为单次采样或者连续采样。ADC的精度最多可配置为12位精度,另外可以选择6位、8位、10位的精度。下面举例初始化一个ADC的配置函数:void ADC21Conver_Init(){  ADC_ChannelCmd(ADC1,                 ADC_Channel_0,         //关闭其他的采样通道         
发表于 2020-03-04
小广播
何立民专栏 单片机及嵌入式宝典

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

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