历史上的今天
返回首页

历史上的今天

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

正在发生

2021年09月18日 | STM8 ADC转换模式-------连续模式

2021-09-18 来源:eefocus

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


连续和带缓存的连在连 换模式中,将ADC设为连续模式,该模式是通过置位 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寄存器的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_CR1 |= ( 1 << 1 );              //开启连续转换模式

    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 )

    {

        ADC_CSR &= 0x7F;

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

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

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

    }

 

    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_CR1 |= ( 1 << 1 );              //开启连续转换模式

    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 )

{

    static  u16 voltage = 0;

    if( ADC_flag )

    {

        ADC_flag = 0;

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

        DATAH = ADC_DRH;

        DATAL = ADC_DRL;

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

 

    };

    return voltage;

}

 

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

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

__interrupt void ADC_Handle( void )

{

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

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

}

推荐阅读

史海拾趣

品赞(G-Switch)公司的发展小趣事
能够准确区分不同类型的故障,避免误动作。
Gentron Corp公司的发展小趣事
在演出或活动中作为舞台灯光效果使用,增加舞台氛围。
百蓉(ECE)公司的发展小趣事

随着公司的发展,百蓉公司意识到技术创新是保持竞争力的关键。他们决定投入更多资源在研发上,特别是集成电路设计领域。经过几年的努力,百蓉成功开发出了一系列高效能、低功耗的集成电路芯片,广泛应用于消费电子、汽车电子和工业控制等领域。这些芯片在市场上大受欢迎,进一步提升了百蓉在电子行业中的地位。

GTE Microcircuits公司的发展小趣事
复合放大器在长时间工作后性能下降的原因可能包括元件老化(如电阻、电容值的变化)、温度漂移、以及电源波动等。为了缓解这些问题,可以定期校准电路、使用温度稳定性好的元件、以及加强电源的稳定性和滤波。
Acculin Inc公司的发展小趣事

Acculin Inc深知人才是企业发展的核心。为了吸引和留住优秀人才,公司建立了完善的培训体系,并为员工提供了良好的晋升机会。此外,公司还注重团队建设,通过举办各种团建活动活动增强员工之间的凝聚力。这些举措使得Acculin在人才竞争激烈的市场中保持了优势。

Eureka Microelectronics Inc公司的发展小趣事

随着Eureka产品线的不断拓展,公司开始积极拓展海外市场。通过与国际知名电子制造商的合作,Eureka的产品逐渐打入国际市场。同时,公司也积极参与国际展会和技术交流活动,提升了品牌知名度和影响力。这些努力不仅帮助Eureka扩大了市场份额,也促进了公司与国际同行的交流与合作。

问答坊 | AI 解惑

请哪位高手解释下这个quartus编译waring

converted tri node “端口名”that feeds logic to a wire removing OPNDRN node “端口名” that feeds logic 请问意思是说把三态门和OD门 remove掉了吗?出现这个warning的原因是什么呀? 我的代码剪切下来如下: inout dq; reg oe; assig ...…

查看全部问答>

什么仿真软件中有ad7714元件?

什么仿真软件中有ad7714元件?…

查看全部问答>

STC12C2052单片机如何下载

想用一下STC12C2052这个单片机,想知道它和stc89c52系列一样能用串口下载吗?不甚感激!…

查看全部问答>

DAQ advanced Counters and Timing

DAQ advanced Counters and Timing…

查看全部问答>

急!串口通讯只能发送,无法接收

请教一下高手,我现在用Microchip的30F系列的单片机6011A与触摸屏进行485串口通讯,现在的情况是:液晶模块可以显示汉字等,但是不能实现翻屏。也就是单片机可以发送给液晶,但是液晶触摸屏反馈来的信息单片机没有回应,没有接收。用串口调试助手, ...…

查看全部问答>

WinCE依据什么来调用同名但是不同功能的的函数

在WinCE当中定义了很多函数,它们具有一些特定的功能。但是在各个厂商的BSP当中也有定义很多同名的函数,提供了针对该平台的一些特定功能。那么WinCE到底靠什么来确定该调用那个函数了。比喻说在在在InterruptInitialize()调用OEMInterruptEnable ...…

查看全部问答>

C51定义结构体时,位对齐的一个怪问题

typedef struct {         uchar src_mac_id        :8;         uchar dest_mac_id        :8;         uchar ack      ...…

查看全部问答>

μC/os Ⅲ较μC/OSⅡ的改进

上传一点资料,看看μC/os Ⅲ较μC/OSⅡ的改进。…

查看全部问答>

【跟TI学电源】系列-----TI模拟应用期刊2012年前三期

TI每季度的模拟应用期刊---2012 [ 本帖最后由 qwqwqw2088 于 2012-11-15 23:04 编辑 ]…

查看全部问答>