历史上的今天
返回首页

历史上的今天

今天是:2024年09月16日(星期一)

2021年09月16日 | STM8单片机ADC连续采样模式

2021-09-16 来源:eefocus

STM8S003单片机内部ADC为12位,A/D转换的各个通道可以执行单次和连续的转换模式。


单次转换模式的意思就是,ADC每次转换一次数据后,就会停止转换,如果还需要继续转换的话,就需要手动开启第二次转换功能。


连续转换模式的意思就是每次转换结束后,系统会自动开启第二次转换,不需要手动设置第二次转换的开启,也就是说连续转换模式只需要开启一次。


ADC框图如下:

image.png?imageView2/2/w/550

ADC连续模式转换时序图如下:

image.png?imageView2/2/w/550

通过时序图可以看出,在第2次转换完成后,第一次采样的结果才会输出,也就是结果输出比采样滞后了一个周期。


下面用代码来实现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 为单片机的对应管脚

void ADC_CH_Init( u8 ch )

{

    char l = 0;

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

    ADC_CR1 |= ( 1 << 1 );              //开启连续转换模式

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

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

    ADC_TDRL = ( 1 << ( ch + 1 ) );     //禁止相应通道 施密特触发功能 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 )

{

    u16 voltage = 0;

    if( ADC_CSR & 0x80 )

    {

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

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

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

        ADC_CSR &= 0x7F;

    };

    return voltage;

}


连续转换模式,只需要开启一次转换,然后一直等待数据转换结束,读取数据就行。由于连续转换模转换速度和快,使用中断的话,系统中断太频繁,影响其他代码执行。所以可以不需要中断去读取数据,需要数据的时候直接判断转换结束标志位去读取数据就行。

ADC_CSR寄存器如下:

image.png?imageView2/2/w/550

当ADC转换结束后ADC_CSR寄存器的EOC位就会置1,读取完采样结果后需要手动将EOC位清零。


由于连续转换模式在初始化之后只会转换当前通道,如果要切换到其他通道需要重新初始化ADC。


在主程序中直接调用通道读取函数就行。


#include "iostm8s103F3.h"

#include "led.h"

#include "adc.h"

#include "stdio.h"

void SysClkInit( void )

{

    CLK_SWR = 0xe1;       //HSI为主时钟源  16MHz CPU时钟频率

    CLK_CKDIVR = 0x00;    //CPU时钟0分频,系统时钟0分频

}

void main( void )

{

    u16 val1 = 0;

    u16 i=0;

    u16 value[450]={0};

    SysClkInit();

    __asm( "sim" );                       //禁止中断

    LED_GPIO_Init();

    ADC_CH_Init( 3 );

    __asm( "rim" );                       //开启中断

    while( 1 )

    {

        LED = !LED;

        for(i=0;i<450;i++)

        {

          val1 = ReadVol_CH3();

          value[i]=val1;

        }

        i=0;

    }

}


在主函数中连续读取450次采样的数据存储在数组中。

推荐阅读

史海拾趣

Gamma Microelectronics ( APM )公司的发展小趣事

G24i的成立可以追溯到2006年,它自称是世界上首家生产商业化应用等级DSSC的公司。公司的技术根基源自瑞士洛桑联邦理工学院的M. Gratzel团队,该团队是DSSC技术的先驱。G24i由美国Kanorka Technologies公司投资,而Kanorka则得到了美国军方的资助。这一强大的技术背景为G24i的商业化之路奠定了坚实的基础。公司成立后不久,便致力于将实验室级别的DSSC技术推向市场,开启了其商业化探索的征程。

顺芯(Everest-semi)公司的发展小趣事

近年来,随着5G、物联网等技术的快速发展,电子行业面临着巨大的变革。顺芯公司及时调整战略方向,加大在5G通信芯片、物联网安全芯片等领域的研发力度。同时,公司还积极探索新的商业模式和市场机会,如与汽车制造商合作开发车载芯片等。这些举措使顺芯公司在行业变革中保持了竞争优势。

Global Components & Controls公司的发展小趣事
如果R4受照后亮度仍不稳定,可以考虑增加R3的阻值来进行微调。
Hong Kong X'Tals Ltd公司的发展小趣事
由于环境温度和元件参数的变化,实际定时时间可能会有所偏差。在设计时需要考虑这一因素,并留出适当的裕量。
BITECH公司的发展小趣事
在高负载或长时间工作的情况下,需要关注LM122的散热问题,以避免过热导致性能下降或损坏。
爱普特半导体(APTSEMI)公司的发展小趣事

凭借卓越的产品性能和稳定的市场表现,爱普特半导体的市场占有率持续提升。目前,公司在国内非ARM核MCU市场的出货量已经位居第一,市场占有率也遥遥领先。这一成绩的取得,不仅彰显了爱普特在MCU行业的领先地位,也反映了公司在技术创新和市场拓展方面的强大实力。随着公司研发能力的不断提升和市场布局的逐步完善,相信爱普特在未来的市场竞争中将继续保持领先地位。

这些故事只是爱普特半导体发展过程中的一部分,它们共同展现了公司在电子行业中的崛起和成长。作为一家坚持自主创新、构建高端人才队伍、与大型企业战略合作、践行纯国产化发展理念并持续提升市场占有率的企业,爱普特半导体在电子行业的发展道路上正稳步前行。

问答坊 | AI 解惑

Windows CE驱动程序开发.pdf

Windows CE驱动程序开发.pdf…

查看全部问答>

S3C2410管脚复用超级基础问题

新手提问,请勿取笑,呵呵。 S3C2410在管脚复用的时候有这样一段代码: //set GPG1 as EINT9 for CS8900A value = INREG32(&pOalPortRegs->GPGCON); OUTREG32(&pOalPortRegs->GPGCON,(value & ~(3…

查看全部问答>

有个产品使用了一段时间后无法启动了,帮分析分析

产品最初正常工作,内核和应用程序都好的。过了一段时间后启动异常。 步骤是开机Bootloader启动,启动时加载了LOGO界面填充了液晶的显示缓冲区,后来就停在这里了。 我可以按照原来的方式烧内核,更换了画面也可以显示。 重烧了BOOTLOADER后也没 ...…

查看全部问答>

在应用程序里如何查询某个USB连在哪一个USB controller上

在具有多个USB controller和多个USB设备的情况下, 如何查询这些USB设备连接在哪个USB controller上。 设备管理器中,如果选择“依连接排序设备”,就可以看到所 有设备的Device Tree,VC里有什么API或者什么方法可以获得 类似的信息吗? 请高 ...…

查看全部问答>

昨天收到开发板,今天做了第一块STM32的板子

看看有没有问题,第一次玩STM32,没有什么经验,硬件是按照st-link制作的,做了一些修改(st-link本来也是一块开发板)。准备自己做JTAG下载工具或者调试工具,呵呵,如果搞的定的话。PCB还没铺地,其他都OK了。发现一个错误,应该BOOT1接地,BO ...…

查看全部问答>

μC/OS-II实时性能测试指标

μC/OS-II实时性能测试指标   衡量嵌入式实时操作系统的好坏一般主要参考以下主要性能指标参数: 任务切换时间、中断响应时间、任务响应时间、任务创建/删除时间、交替信号量时间、取得/释放信号量时间、交替消息队列传输时间等。本文仅对前2个 ...…

查看全部问答>

51单片机实践群179146897

欢迎51单片机初学者加入…

查看全部问答>

lpc2366电源电压过高

最近调试LPC2366发现,该芯片再电源电压为3.5V时,可以下载程序但是不能正常工作;…

查看全部问答>

ispLEVER 软件问题,菜鸟求救

我写的一个程序,是Abel编写的,编译没用任何错误,怎么没用生成熔丝图文件啊。我用的是GAL16V8D…

查看全部问答>