历史上的今天

今天是:2024年09月18日(星期三)

正在发生

2021年09月18日 | STM8 ADC转换模式-------单次模式

发布者:数据之翼 来源: eefocus关键字:STM8  ADC  转换模式  单次模式 手机看文章 扫描二维码
随时随地手机看文章

STM8单片机ADC支持5种转换模式:单次模式,连续模式,带缓存的连续模式,单次扫描模式,连续扫描模式。


单次模式

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


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


其中ADC结果的读取可以采用查询模式也可以采用中断模式。


查询模式代码如下:


#include "adc.h"

#include "main.h"

 

u16  DATAH = 0;                          //ADC转换值高8位

u16  DATAL = 0;                          //ADC转换值低8位

_Bool ADC_flag = 0;                     //ADC转换成功标志

 

//AD通道引脚初始化

void ADC_GPIO_Init( void )

{

    PD_DDR &= ~( 1 << 3 );              //PD3 设置为输入      电流

    PD_CR1 &= ~( 1 << 3 );              //PD3 设置为悬空输入

}

/*

ch 为ADC对应通道

通过置位ADC_CR1寄存器的ADN位来开启ADC。当第一次置位ADON时,ADC从低功耗模式唤醒。


为了启动转换必须第二次使用写指令来置位ADON位。


在转换结束时,ADC会保持在上电状态,用户只需要置位ADON位一次来启动下一次转换。


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

ADC输入通道初始化入口参数表示通道选择

*/

void ADC_CH_Init( u8 ch )

{

    char l = 0;

    ADC_CR1  = 0x00;                    //fADC = fMASTER/2, 8Mhz  单次转换,禁止转换

    ADC_CSR  = ch ;                     //控制状态寄存器 选择要 AD输入通道  如:PD2(AIN3)

    ADC_CR2  = 0x00;                    //默认左对齐 读数据时先读高在读低

    ADC_TDRL = ( 1 <<  ch  );           //禁止相应通道 施密特触发功能 1左移ch+1位

    ADC_CR1 |= 0x01;                    //使能ADC并开始转换

    //ADC_CSR |= 0x20;                    //EOCIE 使能转换结束中断  EOC中断使能

    for( l = 0; l < 100; l++ );         //延时,保证ADC模块的上电完成 至少7us

    ADC_CR1 = ADC_CR1 | 0x01;           //再次将CR1寄存器的最低位置1 使能ADC 并开始转换

}

 

//采集PD2电压值

u16 ReadVol_CH3( void )

{

    u16 voltage = 0;

    while( ( ADC_CSR & 0x80 ) == 0 );      //等待转换结束

    if( ADC_CSR & 0x80 )

    {

        DATAH = ADC_DRH;                    // 读出ADC结果的高8位

        DATAL = ADC_DRL;                    // 读出ADC结果的低8位

        voltage = ( DATAH << 2 ) + DATAL ; //得到十位精度的数据  0--1024

        ADC_CR1 = ADC_CR1 | 0x01;          //再次将CR1寄存器的最低位置1  启动下一次转换

        ADC_CSR &= 0x7F;

    };

    return voltage;

}

中断模式代码如下:


#include "adc.h"

#include "main.h"

 

u16  DATAH = 0;                          //ADC转换值高8位

u16  DATAL = 0;                          //ADC转换值低8位

_Bool ADC_flag = 0;                     //ADC转换成功标志

 

//AD通道引脚初始化

void ADC_GPIO_Init( void )

{

    PD_DDR &= ~( 1 << 3 );              //PD3 设置为输入      电流

    PD_CR1 &= ~( 1 << 3 );              //PD3 设置为悬空输入

}

/*

ch 为ADC对应通道

通过置位ADC_CR1寄存器的ADON位来开启ADC。当第一次置位ADON时,ADC从低功耗模式唤醒。

为了启动转换必须第二次使用写指令来置位ADON位。

在转换结束时,ADC会保持在上电状态,用户只需要置位ADON位一次来启动下一次转换。

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

ADC输入通道初始化入口参数表示通道选择

*/

void ADC_CH_Init( u8 ch )

{

    char l = 0;

    ADC_CR1  = 0x00;                    //fADC = fMASTER/2, 8Mhz  单次转换,禁止转换

    ADC_CSR  = ch ;                     //控制状态寄存器 选择要 AD输入通道  如:PD2(AIN3)

    ADC_CR2  = 0x00;                    //默认左对齐 读数据时先读高在读低

    ADC_TDRL = ( 1 <<  ch  );           //禁止相应通道 施密特触发功能 1左移ch+1位

    ADC_CR1 |= 0x01;                    //使能ADC并开始转换

    

    ADC_CSR |= 0x20;                    //EOCIE 使能转换结束中断  EOC中断使能

    

    for( l = 0; l < 100; l++ );         //延时,保证ADC模块的上电完成 至少7us

    ADC_CR1 = ADC_CR1 | 0x01;           //再次将CR1寄存器的最低位置1 使能ADC 并开始转换

}

//采集PD3电压值

u16 ReadVol_CH3( void )

{

   static  u16 voltage = 0;

    if( ADC_flag )

    {

        ADC_flag = 0;

        voltage = ( DATAH << 2 ) + DATAL ; //得到十位精度的数据  0--1024

        ADC_CR1 = ADC_CR1 | 0x01;          //再次将CR1寄存器的最低位置1  启动下一次转换

    };

    return voltage;

}

//AD中断服务函数 中断号22

#pragma vector = 24                     // IAR中的中断号,要在STVD中的中断号上加2

__interrupt void ADC_Handle( void )

{

    ADC_CSR &= ~0x80;                   // 转换结束标志位清零  EOC

    //默认左对齐 读数据时先读高高8位 再读低8位

    DATAH = ADC_DRH;                    // 读出ADC结果的高8位

    DATAL = ADC_DRL;                    // 读出ADC结果的低8位

    ADC_flag = 1;                       // ADC中断标志 置1

}

关键字:STM8  ADC  转换模式  单次模式 引用地址:STM8 ADC转换模式-------单次模式

上一篇:STM8 ADC转换模式-------连续模式
下一篇:STM8学习笔记---ADC平均值采样和有效值采样算法分析

推荐阅读

现今存储设备已经广泛安装在各种移动设备、笔记本电脑和超大规模数据中心,和人们的日常生活已经密不可分。人们对存储效率的要求不断提高,大多数工程师开始将重点从传统的机械硬盘解决方案转移到更优秀的固态硬盘解决方案。可靠的固态硬盘,其比特误码率极低,更能耐受数据中心内部的极端温度、也更耐久。固态硬盘可使用多年,专为硬盘使用率较高的应用而...
Ⅰ、写在前面在【IAR for ARM系列教程(三)_菜单(Ⅰ)】文章中讲述了前面四个重要菜单File文件、Edit编辑、View视图、Project工程里面的内容。本文讲述后面六个菜单Debug调试、Disassembly反汇编、ST-Link下载调试工具、Tools工具、Window窗口、Help帮助的内容。其中“Debug调试、Disassembly反汇编”两个菜单是在调试模式时才有的。“下载调试工具”...
“新技术既是战胜疫情、应对人类共同挑战的新力量,也是全速开创人类共同未来的新力量。”阿里巴巴集团董事会主席兼首席执行官张勇在2020云栖大会开幕式上说到。和往年在杭州云栖小镇拉开云栖大会帷幕不同的是,受疫情影响,此次云栖大会利用线上的形式,在网上掀起了一股科技热潮。2020年,一场突如其来的疫情给社会生产生活带来巨大灾难的同时,却无意中...
在...CMSISDeviceSTSTM32F10x中的stm32f10x.h,然后在结构体IRQn_Type找到对应单片机型号的代码片段。比如STM32F103C8T6属于STM32F10X_MD,那对应的中断源为:再比如STM32F103ZET6对应的是STM32F10X_HD

史海拾趣

问答坊 | AI 解惑

谁能给点想法啊

我们要设计一个简单的单片机应用系统,想做一个智能识别的系统通过刷卡能识别一些信息,能不能提供点想法谢了…

查看全部问答∨

0-30v_4a数控稳压电源

0-30v_4a数控稳压电源…

查看全部问答∨

mmc国赛程序

本帖最后由 paulhyde 于 2014-9-15 08:55 编辑  …

查看全部问答∨

【专题讲座】你不可不知的嵌入式发展趋势(一)

  身在嵌入式领域做设计的我们,是不是有时也会爆出这样的疑问:究竟什么是嵌入式?嵌入式未来几年将如何发展?目前市场最火的嵌入式应用有哪些?最新的嵌入式技术又包括什么?还有哪些是我们未曾想到的?   本期的专题,将携嵌入式领域诸多大 ...…

查看全部问答∨

wince 用c#如何结束进程

wince 用c#如何结束进程…

查看全部问答∨

[猎头职位]招聘硬件工程师(北京)

一家从事数字移动电视,宽带网络等产品开发的大型欧洲企业招聘硬件工程师,高级硬件工程师,Leader.工作职责包括: 客户需求分析; ?产品具体硬件技术规范的制定; ?完成复杂的技术模块的可行性研究,管理各种硬件设计工作,如:原理图设计,PCB ...…

查看全部问答∨

请教arm仿真器问题

请问如果使用AXD和仿真器调试,板子的flash上要先烧boot么? 我每次都要先烧一个boot来初始化CPU,才能用AXD和仿真器调试其他程序。 是不是一定要烧BOOT呢? 我想如果仿真器连上芯片,应该和板子上的程序无关才对啊~…

查看全部问答∨

有没有domino中用ajax生成树形部门选择对话框的代码?

因人数较多时,一次显示出来有点慢,就像eeworld那样的,点击时异步计算下级菜单并显示出来。在domino中做出来的朋友提供一下,谢谢! 给出方案的送100分。…

查看全部问答∨

打印机旋转180度打印问题

请问一下 OKI 1190C 针孔打印机 能不能旋转180度打印,我向打印的是  超市的标价签,有没有什么外部驱动什么的,打印机设置里面根本没有反转打印这一项,那位能帮个忙吗?…

查看全部问答∨

新手请教关于stm8的捕获问题

我现在使用的是STM8s103单片机,哪位大侠有这款单片机的捕获功能的例子,如果是用库函数写的程序就不用了,因为初学这个cpu所以想参考下,希望各位大侠帮个忙。。。。。。。我的邮箱307179045@qq.com…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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