历史上的今天
返回首页

历史上的今天

今天是:2025年02月12日(星期三)

正在发生

2020年02月12日 | STM8S003/903 使用ADC中断功能

2020-02-12 来源:elecfans

对使用STM8S003/903这个片子的ADC中断功能(包括两种情况),记录下自己的理解:


一、单通道使用ADC中断的场合:

如果项目中只需要采集一路模拟量,并且想使用中断方式来获取AD值,那么,设置如下:


void ADC1_Init(void)

{

    CLK->PCKENR2 |= CLK_PCKENR2_ADC;                                        //ADC Clock Enable

    ADC1->TDRL = 0x02;                                                                               //禁用对应AD通道的施密特触发器

    ADC1->CR2  &= ~ADC1_CR2_ALIGN;                                                //结果左对齐。

 


    /*使能中断的同时一定要同时设定ADC通道号。*/


    ADC1->CSR  |= ADC1_CSR_EOCIE;                                          //使能ADC中断

    ADC1->CSR  |= 0x02;                                                                   //选择通道



    ADC1->CR1  |= (0x20 );                                                                     //时钟4分频

    ADC1->CR1  |= (ADC1_CR1_ADON);                                              //开启ADC1电源


    //这里还需要开启全局中断,省略,一般放到main函数的初始化部分开启全局中断。

}  


void ADC1_Start(u8 channel)

{

    ADC1->CR1 |= ADC1_CR1_ADON; //启动ADC1开始转换

}


@far @interrupt void ADC1_IRQHandler(void)

{

    u8 adc_value = 0;


    ADC1->CSR &= ~ADC1_CSR_EOC;                //结束标志位清零

    adc_value = ADC1->DRH;


    //在这个中断服务函数中获取数据,你可以取高8位, 也可以把高8位和低8位全部取出来。看你的精度需要。


}


使用思路: 在main函数初始化阶段调用ADC1_Init(),在需要开启ADC采集的时候调用ADC1_Start(),在ADC1_IRQHandler()中断处理函数中,读取AD值。


二、多通道使用的场合:

要在STM8S003/903上使用ADC,特别是多通道又不是连续的通道(因为有时候PCB布线受限制,无法使用连续的ADC通道采集多路模拟量),并且你又需要采用单次转换加中断的方式读取AD值,而不是查询的方式, 那么,这种情况,有点特别的设定,设置如下:


void ADC1_Init(void)

{

    CLK->PCKENR2 |= CLK_PCKENR2_ADC;                                        //ADC Clock Enable

    ADC1->TDRL = 0x02;                                                                               //禁用对应AD通道的施密特触发器

    ADC1->CR2  &= ~ADC1_CR2_ALIGN;                                                //结果左对齐。

 


    /* 特别的地方:注释掉这两行,不需要在这里设置 */


    //ADC1->CSR  |= ADC1_CSR_EOCIE;                                          //使能ADC中断

    //ADC1->CSR  |= 0x02;                                                                   //选择通道



    ADC1->CR1  |= (0x20 );                                                                     //时钟4分频

    ADC1->CR1  |= (ADC1_CR1_ADON);                                              //开启ADC1电源


    //这里还需要开启全局中断,省略,一般放到main函数的初始化部分开启全局中断。

}  


void ADC1_Start(u8 channel)

{

   /*  特别的地方: 每次启动AD转换的时候设定通道号和开启中断 */

    ADC1->CSR  = channel;                              //选择通道

    ADC1->CSR  |= ADC1_CSR_EOCIE;          //使能ADC中断

    ADC1->CR1 |= ADC1_CR1_ADON;            //启动ADC1开始转换

}


@far @interrupt void ADC1_IRQHandler(void)

{

    u8 adc_value = 0;


    ADC1->CSR &= ~ADC1_CSR_EOC;                //结束标志位清零

    adc_value = ADC1->DRH;


    //这里获取你的数据,你可以取高8位, 也可以把高8位和低8位全部取出来。看你的精度需要。


    if( Enable_ch1_Flag )

    {

        Enable_ch1_Flag = 0;

        //这里读取数据到你的采样数组中。

    }

    else if( Enable_ch2_Flag )

    {

        Enable_ch2_Flag = 0;

        //这里读取数据到你的采样数组中。

    }

    else if( Enable_ch3_Flag )

    {

        Enable_ch3_Flag = 0;

        //这里读取数据到你的采样数组中。

    }


}


void ADC_Capture(void)

{

   static u8 getstep = 0;

    switch (getstep )

    {

        case 0:                                                     

            ADC1_Start(CH_AD1);                         

            Enable_ch1_Flag = 1;    

            Enable_ch2_Flag = 0;

            Enable_ch3_Flag = 0;

            getstep ++;

            break;

        case 1:       

            ADC1_Start(CH_AD2);                         

            Enable_ch2_Flag = 1;    

            Enable_ch1_Flag = 0;

            Enable_ch3_Flag = 0;

            getstep ++;

            break;

        case 2:  

            ADC1_Start(CH_AD3);                         

          Enable_ch3_Flag = 1;    

            Enable_ch1_Flag = 0;

            Enable_ch2_Flag = 0;

            getstep ++;

            break;

        default:

            break;

    }

}


使用思路: 在main函数初始化阶段调用ADC1_Init(),在一个500us定时器中断中调用ADC_Capture(),在ADC1_IRQHandler()中断处理函数中,读取AD值。

推荐阅读

史海拾趣

ERA Transformers公司的发展小趣事

在电子行业中,ERA Transformers公司以其开创性的技术而闻名。该公司专注于研发和生产高效的电子变压器,以满足不断增长的电子设备需求。在一次研发过程中,公司工程师们面临了一个重大挑战:如何提高变压器的能效和稳定性。经过数月的深入研究与反复试验,他们终于开发出了一种新型的高效能变压器,该变压器采用了先进的材料和独特的设计,显著提高了能效和稳定性,这一创新技术的突破使得ERA Transformers公司在电子行业中崭露头角。

Cavium Networks公司的发展小趣事

随着通信网络的不断升级和转型,Cavium Networks 看到了市场的巨大潜力。在2008年,尽管全球经济风暴肆虐,但 Cavium Networks 依然保持着强劲的增长势头。同年11月,公司宣布收购 W&W Communications 公司,这一举措进一步拓展了 Cavium Networks 的业务范围,增强了其在网络通信领域的竞争力。通过收购,Cavium Networks 获得了更多的技术资源和市场份额,为其后续的发展提供了有力的支持。

Block USA Inc.公司的发展小趣事

在发展过程中,Block USA Inc.也面临着来自竞争对手和行业变化的挑战。然而,公司始终保持着创新精神,不断调整和优化产品与服务,以适应市场的变化。例如,面对数据安全和隐私保护的日益严格要求,Block加强了其数据保护措施,并公开承认了数据泄露事件并积极采取措施进行补救。同时,公司还继续拓展其业务边界,探索新的增长点,以保持其在电子行业中的竞争优势。

这些故事只是Block USA Inc.在电子行业发展历程中的一部分,它们展示了公司如何通过不断创新和拓展业务领域,逐步成为一家具有影响力的综合性电子企业。然而,随着市场的不断变化和竞争的加剧,Block仍需保持警惕并持续努力,以应对未来的挑战和机遇。

General Instrument公司的发展小趣事
误动作会导致电器设备突然断电,可能对设备造成冲击损害。
Fluke公司的发展小趣事
保持设备运行环境的温湿度适宜,定期清理灰尘。
乔光电子(FTR)公司的发展小趣事
误动作会导致电器设备突然断电,可能对设备造成冲击损害。

问答坊 | AI 解惑

单片机与TA8435的步进电机细分控制方法

1 步进电机 步进电动机是纯粹的数字控制电动机,它将电脉冲信号转变成角位移,即给一个脉冲,步进电机就转一个角度,因此非常适合单片机控制。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响, ...…

查看全部问答>

SAW器件封装技术概述

1 引言 现今,随着整机尺寸的减小和元器件的高度集成,促进了元器件的小型化、薄型化。由于SAW(Surface Acoustic Wave)器件小型化并且有着出众的滤波功能,它们存许多领域的应用中扮演着非常重要的角包。小型化和多功能化是SAW器件发展的主要动力 ...…

查看全部问答>

二相与五相步进电机的差异

 概述:步进电机主要是依相数来做分类,而其中又以二相、五相步进电机为目前市场上所广泛采用。二相步进电机每转最细可分割为400等分,五相则可分割为 1000等分, 所以表现出来的特性以五相步进电机较佳、 加减速时间较短、 动态惯性较低。 二相/ ...…

查看全部问答>

ALTERA 的家庭网络产品方案

本帖最后由 jameswangsynnex 于 2015-3-3 20:02 编辑 针对消费娱乐的家庭网络连接 利用多媒体家庭联网技术,各种多媒体设备 ( 例如电视机、便携式媒体播放器、照相机和蜂窝电话等) 以及数据设备 (例如PC和PDA) 可以在安全的家庭网络环境中共享音 ...…

查看全部问答>

如何不让导航仪连接上电脑识别为U盘,而是识别为同步移动设备

目前我手上有一台导航仪,用的是wince5.0的系统,现在我想在这台导航仪上开发一个程序。 目前的问题是,我无法直接在该导航仪上调试我的程序,只能将程序编译好后再复制到导航仪上运行,这样调试起来非常不方便。 因为我的导航仪目前是只要通过US ...…

查看全部问答>

菜鸟请教各位高手!!!!!

软件工程中的嵌入式软件与系统是个怎么样的专业 它的就业前景如何啊??????????…

查看全部问答>

推荐一本用PowerPC开发通信设备的书,我还是第一次见同类型的书

嵌入式设计及通信设备开发详解——基于MPC82XX处理器 卓越的链接 http://www.amazon.cn/mn/detailApp?qid=1238487283&ref=SR&sr=13-1&uid=168-0888845-7367438&prodid=bkbk941360 当当的链接 http://product.dangdang.com/product.aspx?pro ...…

查看全部问答>

WinCE中如何禁止/开启Edit自动换行功能

如题,我想实现PC上记事本的自动换行功能。…

查看全部问答>

一个非常奇怪的keil c51串口中断问题!

一个非常奇怪的keil c51串口中断问题! 比如我的程序如下: uchar b[10]; #define a4 0x03 void fun1(void) interrupt 4 { fun2(2); } fun2(uchar a2) { while(a2--) { .... } fun3(a4); } void fun3(uchar a3)//这个函数无论有没 ...…

查看全部问答>

开关电源工程调试技术

《开关电源工程调试技术》可以看一下…

查看全部问答>