STM8S003/903 使用ADC中断功能

发布者:冷漠之心最新更新时间:2020-02-12 来源: elecfans关键字:STM8S003  ADC  中断功能 手机看文章 扫描二维码
随时随地手机看文章

对使用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值。

关键字:STM8S003  ADC  中断功能 引用地址:STM8S003/903 使用ADC中断功能

上一篇:stm8s使用问题总结2——AD转换
下一篇:STM8 8位基本型定时器 TIM4

推荐阅读最新更新时间:2024-11-11 21:10

STM8 ADC读取数据异常问题的解决
做了一个stm8的一个测量电压电流的项目,发现adc通道通过一个10k电阻连接VCC,的时候ADC数据出来都是只有200多,按理说,10位adc应该出来1000多才对,由于adc出来的数据是十六位的,怀疑是串口发送数据的时候数据位数不对。于是改为 uint16_t dat_tmp = 0; // ADC_conf(4); // dat_tmp = ADC_GetConversionValue(); // printf( rnddddddddddrn ); // delay(0xffff); TIM1_SR1 &= ~(1 0); //清除中断标志 ms_count++; if(ms_count 1000) //1ms*
[单片机]
STM8 <font color='red'>ADC</font>读取数据异常问题的解决
MSP430F5438 ADC12学习笔记
1.前言 这几天实践了MSP430的ADC12功能,虽然片内AD功能比较简单但是还学出了点“门道”来,这个“门道”便是MSP430F5438A和MSP430F5438的区别。这里通过一个例子说明片内ADC的使用,首先实现UART和定时器1S溢出的功能,在上述功能的基础上每1S打印一次AD转换结果,转换通道定向到通道11,该通道对应AVCC和AVSS插值的一半,由于AVCC和LDO的输出之间只有一个电感连接,可以理解转换的结果为LDO输出电压的一般,若扩大两倍便是LDO的实际输出结果,在本文所用的开发板LDO输出为3.3V,所有打印的结果越接近3.3V越好。 2.代码实现和输出结果 代码实现 // 时钟默认情况 // FLL时钟
[单片机]
MSP430F5438 <font color='red'>ADC</font>12学习笔记
STM32学习之ADC
对于STM32,在使用ADC的时候需要配置几个参数。 (1) 第一个参数是ADC_Mode,这里设置为独立模式: ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; 在这个模式下,双ADC不能同步,每个ADC接口独立工作。所以如果不需要ADC同步或者只是用了一个ADC的时候,就应该设成独立模式了。 (2) 第二个参数是ADC_ScanConvMode,这里设置为DISABLE。 ADC_InitStructure.ADC_ScanConvMode = DISABLE; 如果只是用了一个通道的话,DISABLE就可以了,如果使用了多个通道的话,则必须将其设置
[单片机]
MSP430操作ADC0808程序
虽然MSP430F149自带10位的ADC,出于各种原因,我还是选用了ADC0808作为AD转化,下面是程序: #include msp430x14x.h #include lcd.h #define DATA_DIRIN P3DIR=0x00; #define DATA P3IN #define START_DIROUT P4DIR|=BIT0 //P4.0- START #define CLR_START P4OUT&=~BIT0 #define SET_START P4OUT|=BIT0 #define OE_DIROUT P4DIR|=BIT1 //P4.1- OE #define CLR_OE
[单片机]
0832ADC的51测试程序
#include reg52.h #include stdio.h #include intrins.h //========================================================== sbit CS=P3^0; //使能片选 sbit CLK=P3^1; //时钟 sbit Do=P3^2; //数据输出 sbit Di=P3^2; //数据输入 sbit Do2=P3^3; //数据输出 sbit Di2=P3^3; //数据输入 sbit Do3=P3^4; //数据输出 sbit Di3=P3^4; //数据输入 sbit Do4=P3^5; //数据输出 s
[单片机]
STM32F407ZGT6学习之ADC
工程代码:https://pan.baidu.com/s/1Qlfg1_br0tN6yy0fcDwCjg,密码:fhh2 (一)概述 ADC是用于将连续变化的模拟信号转换为离散的数字信号的器件,就是采集对应引脚的模拟信号,并转化为对应的数字信号值(本芯片的数字信号范围0~4095)。 (二)ADC框架 STM32F407ZGT6芯片的ADC有两类数据转换组。分别是规则转换组、注入转换组,两类转换组的区别在于,当注入转换触发时,如果此时规则通道组正在转换,注入转换组能中断规则转换组,先行采集数据(相当于中断功能),注入转换组结束后再接着进行规则转换。 (三)ADC功能说明: 1、ADC 时钟 ADC有
[单片机]
STM32F407ZGT6学习之<font color='red'>ADC</font>
stm32cubemx 多路adc采集
采用的软件是STM32CUBEMX+KEIL5 硬件为stm32F103C8T6 我与原文作者做的区别在于 External Trigger Conversion Edge,我在进行配置的时间没有None选项,我选择的是默认的Regular Conversion launched by software 原文地址: http://www.eemaker.com/stm32cubemxadc.html 实现功能:stm32cubeMX配置ADC多通道采集(非dma和中断方式) Stm32ADC的转换模式还是很灵活,很强大,模式种类很多,那么这也导致很多人使用的时候没细心研究参考手册的情况下容易混淆。不知道该用哪种方
[单片机]
stm32cubemx 多路<font color='red'>adc</font>采集
去耦与ADC接口
本文将针对《单个低压差(LDO)稳压器与ADC电源接口》中给出的例子做进一步探讨。该例使用较少的LDO,合并了ADC的电源轨,同时利用铁氧体磁珠保持隔离。到目前为止,还有另外一个非常重要的事项,便是适当的电源去耦。之前关注的重点是在较高层次上,现在看看哪些拓扑结构可以用于ADC电源。 先回到之前《单个低压差(LDO)稳压器与ADC电源接口》中的例子,并加上去耦。去耦电容(图1中用n个电容表示)的尺寸和值取决于多个因素,如电源电压、工作频率、ADC功耗、LDO特性等。 有许多事项需要考虑,但就本讨论而言,假设已经选好适当的去耦电容。请务必注意,良好的设计规程是将电源输入适当地去耦至ADC。 图1 . 采用单个LDO驱动
[电源管理]
去耦与<font color='red'>ADC</font>接口
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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