历史上的今天
返回首页

历史上的今天

今天是:2025年02月07日(星期五)

正在发生

2020年02月07日 | 使用STM8S003K3 ADC简介以及初始化

2020-02-07 来源:eefocus

简介

最近用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;


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

推荐阅读

史海拾趣

全智景(Allvision)公司的发展小趣事

全智景公司自成立以来,一直致力于电子视觉技术的研发。早期,公司面临激烈的市场竞争和技术瓶颈,但全智景团队凭借坚韧不拔的精神,成功研发出了一款具有划时代意义的高清摄像头芯片。这款芯片以其出色的图像质量和稳定性,迅速获得了市场的认可,并推动了整个电子视觉行业的进步。这一技术突破不仅让全智景公司在市场上站稳了脚跟,也为公司后续的发展奠定了坚实的基础。

Everbuild公司的发展小趣事

为了进一步扩大市场份额,Everbuild开始积极拓展国际市场。公司派遣专业的团队参加国际电子产品展览会,与国际知名厂商进行技术交流和合作。同时,Everbuild还针对不同国家和地区的市场需求,推出了定制化的电子产品解决方案。这些努力使Everbuild的产品逐渐进入国际市场,并赢得了越来越多客户的信任和支持。

Dino-Lite公司的发展小趣事

Dino-Lite公司在发展过程中,始终注重市场拓展和合作伙伴关系的建立。公司与多家知名企业建立了长期稳定的合作关系,共同开拓市场、分享资源。通过与合作伙伴的紧密合作,Dino-Lite公司的产品得以快速进入各个行业领域,并获得了良好的口碑和市场份额。

此外,Dino-Lite公司还积极参与国际展览和交流活动,展示公司的最新技术和产品。这些活动不仅提高了公司的知名度,也为公司带来了更多的商业机会和合作伙伴。

CoolerMaster公司的发展小趣事

Cooler Master一直致力于技术创新,不断推出具有颠覆性的产品。例如,其推出的MasterLiquid 360 Ion高性能散热器,配备了壮观的2.1英寸LCD屏幕,可实现无与伦比的定制显示内容。这一产品不仅展现了Cooler Master在散热技术上的领先地位,更体现了其对于用户体验的深刻洞察。此外,公司还借助Atmos系列迈向可持续散热的未来,为行业的发展注入了新的活力。

博众电气(BZCN)公司的发展小趣事

在追求经济效益的同时,博众电气也始终关注环保问题。公司积极响应国家绿色发展的号召,将环保理念融入产品研发和生产过程中。通过采用环保材料和节能技术,博众电气成功降低了产品对环境的影响,实现了经济效益和环境保护的双赢。这一举措不仅提升了公司的社会形象,也为公司的可持续发展注入了新动力。

Anderson Power公司的发展小趣事

随着市场的不断扩大,博众电气意识到质量是企业生存和发展的关键。因此,公司决定引入国际先进的质量管理体系,全面提升产品质量和服务水平。通过严格的质量控制和持续改进,博众电气的产品质量得到了显著提升,客户满意度也大幅提高。这一举措不仅增强了公司的市场竞争力,还为公司的长远发展奠定了坚实基础。

问答坊 | AI 解惑

谁能帮我找到10102A 芯片的PDF

谁能帮我找到10102A 芯片的PDF,非常感谢!请联系我QQ:645652168…

查看全部问答>

CDMA模块

CDMA模块基于CDMA平台的通信模块,它将通信芯片、存储芯片等集成在一块电路板上,使其具有发送通过CDMA平台收发短消息、语音通话、数据传输等功能。CDMA模块可以实现普通CDMA手机的主要通信功能,也可以说是一个“精简版”的手机。电脑、单片机、AR ...…

查看全部问答>

在6F877,18F1320,18F1220上通过的18B20程序

这是在6F877,18F1320,18F1220上通过的18B20程序,18B20主要是延时问题,这个解决了,什么都可以通过。 # include <pic18f1220.h> # define uch unsigned char # define unint unsigned int # define DQ        R ...…

查看全部问答>

编译uclinux内核时候遇到的问题,帮我看看吧。

由于毕业设计需要和本身兴趣,要构造ARM+uclinux,本机Linux版本:UBUNTU6 .06. 在本机上安装了www.uclinux.org上下的arm-elf-tools, 然后arm-elf-gcc-v,显示如下 Reading specs from /usr/local/lib/gcc-lib/arm-elf/2.95.3/specs gcc ver ...…

查看全部问答>

有谁做过 BF532 的视频开发吗?

有项目要做,自己想从头学。…

查看全部问答>

怎样程序烧写到指定的flash地址里?

在项目中遇到一个问题:需要将一个变量放到一个指定的flash地址里,即flash的绝对地址中。我查看了IAR的complier手册,上面的例子说以下面的方式定义即可。const int bootKey @ 0x0801FFFC = 3; /* O ...…

查看全部问答>

关于选折NANDFLASH,还是SPIFLASH?

所用STM32F103ZET6, 由于,512K Flash, 64 RAM,已经能够满足系统的需要。 所以就不加NORFLASH, 和SRAM了, 但是由于要存储数据,所以就想到NandFlash,和SPI Flash. 而NandFlash容量大,但是引脚多,(NAND128W3A, 128M) SPI Flash容 ...…

查看全部问答>

谁来做一次9B96的使用教程?

期待EEWORLD和TI能够为我们这些菜鸟提供一些学习的方法和使用介绍!我想以后使用这个9B96但是这个入门貌似还不懂!…

查看全部问答>

稳定电源/负载电路的快速瞬态响应

吉时利的2300系列电池/充电器仿真器(快速瞬态响应电源)专用于研发和制造环境中RFIC功放、手机及其它便携式电池供电产品的功率估计。这些电池仿真电源能从变化量高达1000%(即负载电流增大10倍)的短脉冲负载电流中快速恢复并测量负载电流脉冲的 ...…

查看全部问答>