历史上的今天
返回首页

历史上的今天

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

正在发生

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

2021-09-18 来源:eefocus

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

}

推荐阅读

史海拾趣

Hi-Light Electronic Co Ltd公司的发展小趣事

机顶盒,全称为数字视频变换盒,是连接电视机与外部信号源的关键设备,其专业性与科普性并存。从广义上讲,任何能与电视机连接并处理信号的网络终端设备均可视为机顶盒。随着技术的发展,机顶盒已从早期的模拟频道增补器演变为支持高清、甚至4K超高清内容的数字设备。

机顶盒的核心功能在于接收来自有线电缆、卫星、宽带网络及地面广播的数字电视信号,并通过解码处理,将这些信号转换成适合电视机播放的音视频格式。此外,机顶盒还集成了多种增值服务,如电子节目指南、因特网网页浏览、在线购物、视频点播等,极大地丰富了用户的观看体验。

根据功能和应用场景的不同,机顶盒可分为数字机顶盒和网络机顶盒两大类。数字机顶盒侧重于实现数模转换,让用户能在模拟电视上观看数字电视;而网络机顶盒则能接入互联网,提供更广泛的娱乐内容和互动服务。

在技术不断进步的今天,机顶盒正朝着高清化、智能化方向发展。未来,随着人工智能、云计算等技术的融合应用,机顶盒将能提供更个性化的节目推荐、语音控制等便捷功能,进一步提升用户的观看体验。同时,随着智能电视的普及,机顶盒作为智能电视的有效补充,其市场需求也将持续增长。

EFINIX公司的发展小趣事

EFINIX公司成立于2012年,由一群来自知名FPGA企业的创始人团队创立。他们拥有丰富的FPGA设计经验,并致力于在可编程逻辑行业实现突破性的创新。公司总部位于美国加利福尼亚州圣克拉拉市,计划采用一种全新的现场可编程门阵列(FPGA)技术——量子可编程技术,来设计芯片。这种技术旨在实现芯片尺寸仅为传统芯片的四分之一,能耗减少一半,同时结构更加简化。EFINIX公司相信,这种技术将推动人工智能和深度学习的发展,使数据处理更加高效。

FTDI公司的发展小趣事

EFINIX公司成立于2012年,由一群来自知名FPGA企业的创始人团队创立。他们拥有丰富的FPGA设计经验,并致力于在可编程逻辑行业实现突破性的创新。公司总部位于美国加利福尼亚州圣克拉拉市,计划采用一种全新的现场可编程门阵列(FPGA)技术——量子可编程技术,来设计芯片。这种技术旨在实现芯片尺寸仅为传统芯片的四分之一,能耗减少一半,同时结构更加简化。EFINIX公司相信,这种技术将推动人工智能和深度学习的发展,使数据处理更加高效。

Denyo Europa Gmbh公司的发展小趣事

Denyo Europa Gmbh公司一直将产品质量视为企业的生命线。公司建立了严格的质量管理体系,从原材料采购到生产流程,再到产品检测,每一个环节都严格把关。公司还定期对员工进行质量意识培训,确保每一个员工都能深刻理解质量对于企业发展的重要性。这种对质量的执着追求,使公司的产品在市场上赢得了良好的口碑。

ApexTool Group公司的发展小趣事

在电子制造业的快速发展中,Apex Tool Group敏锐地捕捉到了市场对高效、精准电动工具的需求。公司研发团队经过长时间的研发和试验,成功推出了一款具有革命性的电动螺丝刀。这款螺丝刀不仅具有高效的工作性能,而且操作简单,极大地提高了电子产品的装配效率。这一创新产品迅速在市场上占据了一席之地,为Apex Tool Group在电子行业中树立了良好的口碑。

华瓷(Chinocera)公司的发展小趣事

随着公司实力的增强和市场份额的扩大,华瓷开始将目光投向国际市场。公司积极参加国际陶瓷及电子行业的展会,与国际同行交流学习,同时大力推广自身的品牌和产品。通过多年的努力,华瓷的陶瓷材料在国际市场上获得了广泛的认可,成功打入欧洲、北美等高端市场。

问答坊 | AI 解惑

我国博客用户明年有望近亿

我国博客用户明年有望近亿 2006-7-17     随着我国网民数量的增长以及博客的进一步普及,明年我国博客用户的数量有可能接近一亿。近日,赛迪顾问发布的《中国博客(BLOG)商业模式及投资前景研究报告》称,我国博客市场的成熟阶段即 ...…

查看全部问答>

一本tcpip不错的书

是英文的 对研究tcpip有帮助…

查看全部问答>

IC封装命名规则

1、BGA(ball grid array)                 球形触点陈列,表面贴装型封装之一。在印刷基板的背面按陈列方式制作出球形凸点用以代替引脚,在印刷基板的正面装配LSI 芯片,然后用模压树脂或灌 ...…

查看全部问答>

用FPGA驱动lcd

最近在做一个关于FPGA的项目,但是怎么去驱动一个1602的lcd,没有什么思路。那位大侠做过,给个思路或者给点指导意见,小弟谢过了!!…

查看全部问答>

APB总线驱动?

有谁会写APB的总线驱动。。或是给出大概的函数。。最好是S3C2410的。谢谢了…

查看全部问答>

Driverstudio3.2编译发生链接错误!急啊!

最近研究驱动开发,环境如下: VS2005.NET+DDKXP+DriverStudio3.2   写了hello程序,设置如下: 1 project type页中选择\"Kernel Mode Service\"点 2 IRP Handlers页中把所有自动勾上的请求都去掉,因为我要手工写DriverWorks代码 3 ...…

查看全部问答>

新配i3电脑,请高手指点指点

CPU: i3 530 盒 805 主板:msi H55M-E33 749 内存:2条 宇瞻 1GB DDR3 1333 210 硬盘:WD 500GB 7200转 16MB(串口/RE3) 330 光驱:先锋 DVR-218CHV 219 显示器:三星 E2220W 1199 机箱:酷冷至尊 毁灭者RC-K100 299 电源:航嘉 冷静王钻石2. ...…

查看全部问答>

关于门控时钟综合

请问门控时钟在编写代码时用的是哪种形式啊?1.     always @(posedge  clk)   begin     if(enable)      out<= in;    else       out ...…

查看全部问答>

求救!!!从网上下载了某算法源码之后,怎么编译到嵌入式ARM中呢?老师们教教我呀~

以下是本人的做法:(本人在虚拟机VMware上安装了Ubuntu,开发板为AT91RM9200,交叉编译胃2.95.3) 第一步:./configure --prefix=/home/hello/try --host=arm-linux --build=i686-pc-linux-gnu 第二步:make 第三步:make install 第四步:前几 ...…

查看全部问答>

专业PCB 打样

都说业务工资高,我却发现业务真的很辛苦的,拼命的开阔客户都是呢么辛苦,  一个月下来 单多还好,少了挨骂不说工资还么么低,都不知道怎么过,生活啊生活,真的不是一般的难过,日子还是要继续,可是真的很迷茫,哪位高手可以指点下啊 ...…

查看全部问答>