1. 综诉

  想学会如何在STM8上使用ADC这个功能,我们先得了解单片机中ADC究竟是什么。

  ADC是模拟信号转成数值信号,单片机只能识别TTL电平,其实就是 1 或者 0 ,但是如果我们给它一个3.3V电压,单片机就无法识别,,若想使用单片机读取出来得时候,它必须将模拟量变成数字量。

2. 关于STM8S103手册的ADC简介

由官方的全英手册可知。

----------------------------------------------------------------------------------------------------------------------------------

STM8中ADC1和ADC2主要功能如下:

  • 10位分辨率
  • 单词和连续的转换模式
  • 可编程的(转换频率的)预分频,fMASTER 可以被分频 2到18
  • 可选择ADC专用外部中断(ADC_ETR)或者定时器触发信号(TRGO)来作为外部触发信号
  • 模拟放大(对于具有VREF引角的型号)
  • 转换结束时可产生中断
  • 灵活的数据对齐方式
  • ADC输入电压范围:VSSA≤VIN≤VDDA

----------------------------------------------------------------------------------------------------------------------------------

ADC1具有以下拓展功能:

  • 带缓冲的连续转换模式
  • 单次和连续转换的扫描模式
  • 具有上限和下限门槛的模拟看门狗
  • 模拟看门狗时间发生可产生中断

----------------------------------------------------------------------------------------------------------------------------------

3. 例程

3.1 编译环境

  我的编译环境是IAR,这款软件是现在STM8的主流平台,比较推荐。不过我打算等到STCubeMX更新出比较方便的版本后再去使用Keil5,因为我在用STM32的时候就是利用Keil5,的确很方便,你们也可以学着用一下。

3.2 主芯片

  我的主芯片是STM8S系列中的103,其中STM8S的003、005、和103、105,配置一样(外设和CPU频率,FLASH),在代码相同的情况下均可进行烧写。

3.3 库文件的添加

  我们的工程可以在IAR的例程中复制,操作过程:打开STM8S_StdPeriph_Lib(这是一个官方的库文件,下载IAR STM8包的时候就携带,里面有库文件和相对应的例程),将Libraries文件复制到你工程所在的文件下,并将有关于ADC的库文件添加到你的工程列表当中。添加完成后,有可能你会看到一些C文件会有红色的小点报错,这是因为你选的芯片上没有该功能,你需要将其删掉才能不报错。如图。

添加成功后,我们需要将头文件添加进来,头文件的路径存放在 Libraries->STM8S_StdPeriph_Driver->inc中,如图。

3.4 代码编写

  STM8SF003这款芯片能用的是5个AD采样通道,分别为为AIN2~AIN6。其一个通道AIN7,但在官方手册中我没找到有对其描述的,感兴趣的朋友可以去察看芯片的英文手册进行研究,也许会找到和我不一样的结果。

在ADC头文件中,将ADC1所有的ADC1_CHANNEL(ADC通道)都进行枚举,以方便调用。

 /* Enum ----------------------------------------------------------------------*/

 enum ADC1_CHANNEL
{ //bit 8 7 6 5 4 3 2 1 ADC1_CHANNEL2 = 0x01, // 0 0 0 0 0 0 0 1
ADC1_CHANNEL3 = 0x02, // 0 0 0 0 0 0 1 0
ADC1_CHANNEL4 = 0x04, // 0 0 0 0 0 1 0 0
ADC1_CHANNEL5 = 0x08, // 0 0 0 0 1 0 0 0
ADC1_CHANNEL6 = 0x10 // 0 0 0 1 0 0 0 0 };

在ADC.C文件中,分为了多个函数,降低他们的耦合性,也方便理解。

首先是ADC中引角的初始化,将你所选通道的引角进行初始化,没有选到的就不进行初始化。

 /*******************************************************************************
* Function Name : MX_ADC_GPIO_Init
* Description : ADC GPIO Init
* Input : ADC1_CHANNEL
* Output : None
* Return : None
********************************************************************************/ void MX_ADC_GPIO_Init(uint8_t ADC1_CHANNEL)
{
switch(ADC1_CHANNEL)
{
case ADC1_CHANNEL2: GPIO_Init(ADC_Opt_GPIOC_Port,ADC_channe2_Pin,GPIO_MODE_IN_PU_NO_IT);break;
case ADC1_CHANNEL3: GPIO_Init(ADC_Opt_GPIOD_Port,ADC_channe3_Pin,GPIO_MODE_IN_PU_NO_IT);break;
case ADC1_CHANNEL4: GPIO_Init(ADC_Opt_GPIOD_Port,ADC_channe4_Pin,GPIO_MODE_IN_PU_NO_IT);break;
case ADC1_CHANNEL5: GPIO_Init(ADC_Opt_GPIOD_Port,ADC_channe5_Pin,GPIO_MODE_IN_PU_NO_IT);break;
case ADC1_CHANNEL6: GPIO_Init(ADC_Opt_GPIOD_Port,ADC_channe6_Pin,GPIO_MODE_IN_PU_NO_IT);break;
} }

  然后是ADC1的选择通道初始化:ADC连续读取,所选的通道,二分频,外部转换触发,外部触发器不开启,数据右对齐,施密特触发,不开启。(注意:STMS8003中的串口使用了PD5和PD6,与ADC1中通道5、通道6发生冲突,故不可使用。如需使用,请将串口的TX\RX引角更改换为其它的引角。)

 /*******************************************************************************
* Function Name : MX_ADC1_CHANNEL_Init
* Description : ADC CHANNEL Init
* Input : ADC1_CHANNEL
* Output : None
* Return : None
********************************************************************************/ void MX_ADC1_CHANNEL_Init(uint8_t ADC1_CHANNEL)
{
switch(ADC1_CHANNEL)
{
case ADC1_CHANNEL2:
{
ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_CHANNEL_2,
ADC1_PRESSEL_FCPU_D2, ADC1_EXTTRIG_TIM, DISABLE,
ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL2, DISABLE);break;
}
case ADC1_CHANNEL3:
{
ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_CHANNEL_3,
ADC1_PRESSEL_FCPU_D2, ADC1_EXTTRIG_TIM, DISABLE,
ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL3, DISABLE);break;
}
case ADC1_CHANNEL4:
{
ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_CHANNEL_4,
ADC1_PRESSEL_FCPU_D2, ADC1_EXTTRIG_TIM, DISABLE,
ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL4, DISABLE);break;
}
case ADC1_CHANNEL5:
{
ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_CHANNEL_5,
ADC1_PRESSEL_FCPU_D2, ADC1_EXTTRIG_TIM, DISABLE,
ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL5, DISABLE);break;
}
case ADC1_CHANNEL6:
{
ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_CHANNEL_6,
ADC1_PRESSEL_FCPU_D2, ADC1_EXTTRIG_TIM, DISABLE,
ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL6, DISABLE);break;
}
}
}

这里就是将所有的ADC初始化进行一个统一的一个归类。

 /*******************************************************************************
* Function Name : MX_ADC1_Init
* Description : ADC Init
* Input : ADC1_CHANNEL
* Output : None
* Return : None
********************************************************************************/
void MX_ADC1_Init(uint8_t ADC1_CHANNEL)
{
//初始化GPIO
MX_ADC_GPIO_Init(ADC1_CHANNEL); //初始化ADC1所有寄存器
ADC1_DeInit(); //配置ADC1寄存器中的参数
MX_ADC1_CHANNEL_Init(ADC1_CHANNEL); //使能ADC1
ADC1_Cmd(ENABLE); //ADC1转换开始
ADC1_StartConversion();
}

最后就是数据获取,可以选择直接获取数据,也可以获取十次数据后取平均数。

注意:

ADC获取的值是AD值,需要将其进行代入公式中才能得到电压值。

Vin = (ADC * Vref) / 1024

VCC很明显可以使用万用表先测出来,1024是因为STM8S这款的AD是10位精度。

这里测试的VCC是3.35V,VCC另外一个意思就是单片机的供给电源。

 /*******************************************************************************
* Function Name : MX_ADC1_Get_Data
* Description : get VCC data
* Input : None
* Output : None
* Return : fVCC
********************************************************************************/
float MX_ADC1_Get_Data(void)
{
int iADC1_Value;
float fVCC; //读取转换结果
iADC1_Value = ADC1_GetConversionValue();
fVCC = (iADC1_Value * 3.350)/;
return fVCC; } /*******************************************************************************
* Function Name : MX_ADC1_Get_Average_Data
* Description : Get VCC ten times average data.
* Input : None
* Output : None
* Return : fAverage_VCC
********************************************************************************/
float MX_ADC1_Get_Average_Data(void)
{
int i;
float fAverage_VCC = 0.0; for(i=;i<;i++)
{
fAverage_VCC += MX_ADC1_Get_Data();
}
fAverage_VCC /= ; return fAverage_VCC; }

将上面需要用到的函数在主函数中调用打印即可。

4. 实验结果

 调试仪器:可调式电源,可通过旋钮控制电压的输出大小。

 当没有输出电压时,打印的值为0V.

当可调式电源输出的电压值为3.3V,串口助手上打印的也是3.3V。

当可调式电源输出的电压值为24V,串口助手上打印的也是24V。

注意:请不要将24V电源直接通入单片机中,我是自己设置了一条电路进行测试的。ADC的最大输入电压是3.3V,为了安全起见,请不要超过该值。

注意:请不要将24V电源直接通入单片机中,我是自己设置了一条电路进行测试的。ADC的最大输入电压是3.3V,为了安全起见,请不要超过该值。

注意:请不要将24V电源直接通入单片机中,我是自己设置了一条电路进行测试的。ADC的最大输入电压是3.3V,为了安全起见,请不要超过该值。

5. 结尾

对STM8的ADC的说明和引用到这里结束,感谢各位看官的点击。

如果觉得有所收获请点下推荐,若认为该博客中存在错误的说明或者对博客中某方面有疑问请留言。

作 者:浩宇99✌
出 处:https://www.cnblogs.com/zhenghaoyu/p/10672864.html
版权声明:本文原创发表于 博客园,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。

基于STM8的ADC读取---STM8-第四章的更多相关文章

  1. 《机器学习实战(基于scikit-learn和TensorFlow)》第四章内容的学习心得

    本章主要讲训练模型的方法. 线性回归模型 闭式方程:直接计算最适合训练集的模型参数 梯度下降:逐渐调整模型参数直到训练集上的成本函数调至最低,最终趋同与第一种方法计算出的参数 首先,给出线性回归模型的 ...

  2. Creating Dialogbased Windows Application (4) / 创建基于对话框的Windows应用程序(四)Edit Control、Combo Box的应用、Unicode转ANSI、Open File Dialog、文件读取、可变参数、文本框自动滚动 / VC++, Windows

    创建基于对话框的Windows应用程序(四)—— Edit Control.Combo Box的应用.Unicode转ANSI.Open File Dialog.文件读取.可变参数.自动滚动 之前的介 ...

  3. 构建一个基本的前端自动化开发环境 —— 基于 Gulp 的前端集成解决方案(四)

    通过前面几节的准备工作,对于 npm / node / gulp 应该已经有了基本的认识,本节主要介绍如何构建一个基本的前端自动化开发环境. 下面将逐步构建一个可以自动编译 sass 文件.压缩 ja ...

  4. 基于.net开发chrome核心浏览器【四】

    原文:基于.net开发chrome核心浏览器[四] 一: 上周去北京出差,给国家电网的项目做架构方案,每天都很晚睡,客户那边的副总也这样拼命工作. 累的不行了,直接导致第四篇文章没有按时发出来. 希望 ...

  5. 基于flask的网页聊天室(四)

    基于flask的网页聊天室(四) 前言 接前天的内容,今天完成了消息的处理 具体内容 上次使用了flask_login做用户登录,但是直接访问login_requare装饰的函数会报401错误,这里可 ...

  6. 统计学习导论:基于R应用——第四章习题

    第四章习题,部分题目未给出答案 1. 这个题比较简单,有高中生推导水平的应该不难. 2~3证明题,略 4. (a) 这个问题问我略困惑,答案怎么直接写出来了,难道不是10%么 (b) 这个答案是(0. ...

  7. 《Entity Framework 6 Recipes》中文翻译系列 (20) -----第四章 ASP.NET MVC中使用实体框架之在MVC中构建一个CRUD示例

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第四章  ASP.NET MVC中使用实体框架 ASP.NET是一个免费的Web框架 ...

  8. 05 技术内幕 T-SQL 查询读书笔记(第四章)

    第四章 子查询:在外部查询内嵌套的内部查询(按照期望值的数量分为,标量子查询 scalar subqueries,多值子查询multivalued subqueries)(按照子查询对外部查询的依赖性 ...

  9. 《Linux内核设计与实现》课本第四章自学笔记——20135203齐岳

    <Linux内核设计与实现>课本第四章自学笔记 进程调度 By20135203齐岳 4.1 多任务 多任务操作系统就是能同时并发的交互执行多个进程的操作系统.多任务操作系统使多个进程处于堵 ...

随机推荐

  1. 3D数学基础(二)向量

    向量的基本运算包括加法.减法.点乘.叉乘.单位化运算等,而在游戏开发中使用最为广泛的是减法.点乘.叉乘.单位化运算.向量是具有方向和长度的矢量,有2D.3D.4D等的.在游戏开发里面一般使用的是2D和 ...

  2. Android连接服务器端的Socket

    package com.example.esp8266; import java.io.IOException;import java.io.InputStream;import java.io.Ou ...

  3. Python学习笔记,day4

    Python学习第四天 一.装饰器 函数调用顺序: 其他高级语言类似,Python 不允许在函数未声明之前,对其进行引用或者调用 高阶函数: 满足下列条件之一就可成函数为高阶函数 某一函数当做参数传入 ...

  4. Linux 系统的用户和组

    目录 1. 用户及组相关文件 2. 用户相关查询 2.1 直接通过cat文件查看用户及组文件内容 2.2 使用下面查询命令查看 3. 使用操作命令修改用户及组相关文件 3.1 专有编辑命令(仅限高级用 ...

  5. 关于nginx安装、iptables设置和查看端口指令netstat/ss

    实验1: Nginx介绍 Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器,也是一个 IMAP/POP ...

  6. 基于C++的牛顿切线法演示

    牛顿切线法 中心思想: 利用目标函数二阶泰勒多项式的最优解作为函数的近似最优解.如果新的近似最优解满足计算精度,则终止计算,否则将函数在新点展开成二阶泰勒多项式,用新的泰勒多项式的最优解作为函数的近似 ...

  7. javascript 5.2

    window.open(url,name,features):创建新的浏览器窗口:url是窗口的地址,name是新窗口名字,features是新窗口的各种属性 真协议特指因特网上两台计算机之间传输各种 ...

  8. Python基础:三、Python的解释器

    当我们编写python代码的时候,我们得到的是一个包含python代码的以.py为拓展名的文本文件,要运行代码,就需要python解释器去执行.py文件. 由于整个python语言从规范到解释器都是开 ...

  9. BUAA-OO第一单元小结

    引言 四周过去了,oo课程的第一阶段作业也算告一段落.在第一单元的内容中,主题是始终如一的多项式求导,但三次作业要求完善的求导功能一次比一次丰富,难度也逐渐增加,也是费了不少心思.接下来就回顾与小结一 ...

  10. pip install torch on windows, and the 'from torch._C import * ImportError: DLL load failed:' solution

    通过pip安装PyTorch 0.4.0成功(cpu, not gpu; python3.5; pip): pip3 install http://download.pytorch.org/whl/c ...