STM8 AD的学习

发布者:码字奇才最新更新时间:2018-06-18 来源: eefocus关键字:STM8 手机看文章 扫描二维码
随时随地手机看文章

STM8模拟/数字转换器(ADC)


采样的过程一定要满足奈圭斯特采样定理,并一般要经过采样保持、量化和编码3个步骤。

采样保持电路:

    在A/D转换系统中的作用是保持模拟输入电压不变,以获得正确的数字量结果。

量化:

量化过程中所取最小数量单位成为量化单位。


STM8S105xx系列基础型产品包括一个10位连续渐进式模数转换器(ADC1),提供多达10个多


路复用输入通道。



模拟看门狗

    在单次转换模式和不带缓存的连续模式中模拟看门狗可以通过置位ADC_CSR寄存器的AWDEN位来使能。当模拟电压通过ADC转换后的值低于下限门槛值或者高于上限门槛值时AWD模拟看门狗会被置位。可通过对ADC_HTR和ADC_LTR的10位寄存器编程来设定门槛值,并且通过置位ADC_CSR寄存器的AWDIE位可使能中断。


1、ADC开关控制

通过位置ADC_CR1寄存器的ADON位来开启ADC。当首次置位ADON位时,ADC从低功耗模式唤醒。

2、ADC时钟

时钟的预分频因子是由ADC_CR1寄存器的SPSEL[2:0]决定的。

3、通道的选择

有多达16个外部输入通道。

4、转换模式

1)单次模式

2)连续和带缓存的连续模式

3)单次扫描模式

4)连续扫描模式



ADC相关的功能寄存器



1、ADC高位数据缓存寄存器(ADC_DBxRH)

    数据的左对齐还是右对齐由ALIGN位决定。

数据的左对齐:这些数据位包含高8位的转换数据。需要在杜低位数据前先读取。

数据的右对齐:这些数据包含(ADC数据宽度减8)的高位转换结果数据。剩下的位为0.



2、ADC低位数据缓存寄存器(ADC_DBxRL)

数据的左对齐还是右对齐由ALIGN位决定。

数据的左对齐:这些数据包含(ADC数据宽度减8)的高位转换结果数据。剩下的位为0.

数据的右对齐:这些数据位包含低8位的转换结果数据。低位字节必须先读,再读高位字节。


3、ADC控制/状态寄存器(ADC_CSR)

4、ADC配置寄存器1(ADC_CR1)

5、ADC配置寄存器2(ADC_CR2)

6、ADC配置寄存器3(ADC_CR3)

7、ADC数据高位寄存器(ADC_DRH)

8、ADC数据低位寄存器(ADC_DRL)

9、ADC施密特触发器禁止寄存器高位(ADC_TDRH)

10、ADC施密特触发器禁止寄存器低位(ADC_TDRL)

11、ADC上限门槛值高位寄存器(ADC_HTRH)

模拟看门狗上限电压高位,此位由硬件置位和软件清零。这些位定义了模拟看门狗

上限电压高位值(V refh)的MSB。

12、ADC上限门槛值低位寄存器(ADC_HTRL)

13、ADC下限门槛值高位寄存器(ADC_LTRH)

14、ADC下限门槛值低位寄存器(ADC_LTRL)

15、ADC看门狗状态高位寄存器(ADC_AWSRH)

0:在数据寄存器x中无模拟看门狗事件;

1:数据寄存器x中发生了模拟看门狗事件。



void adc_init(void)

{

    GPIO_Init(GPIOB, GPIO_PIN_4, GPIO_MODE_IN_PU_NO_IT);

    ADC1_DeInit();

    ADC1_Init(ADC1_CONVERSIONMODE_SINGLE,

        ADC1_CHANNEL_4,

        ADC1_PRESSEL_FCPU_D2,

        ADC1_EXTTRIG_TIM,DISABLE,

        ADC1_ALIGN_RIGHT,

        ADC1_SCHMITTTRIG_CHANNEL4,DISABLE);

    ADC1_Cmd(ENABLE);

    ADC1_ClearFlag(ADC1_FLAG_EOC);

    ADC1_StartConversion();

}



void ADC1_DeInit(void)

{

    ADC1->CSR = ADC1_CSR_RESET_VALUE;

    ADC1->CR1 = ADC1_CR1_RESET_VALUE;

    ADC1->CR2 = ADC1_CR2_RESET_VALUE;

    ADC1->CR3 = ADC1_CR3_RESET_VALUE;

    ADC1->TDRH = ADC1_TDRH_RESET_VALUE;

    ADC1->TDRL = ADC1_TDRL_RESET_VALUE;

    ADC1->HTRH = ADC1_HTRH_RESET_VALUE;

    ADC1->HTRL = ADC1_HTRL_RESET_VALUE;

    ADC1->LTRH = ADC1_LTRH_RESET_VALUE;

    ADC1->LTRL = ADC1_LTRL_RESET_VALUE;

    ADC1->AWCRH = ADC1_AWCRH_RESET_VALUE;

    ADC1->AWCRL = ADC1_AWCRL_RESET_VALUE;

}



void ADC1_Init(ADC1_ConvMode_TypeDef ADC1_ConversionMode,

               ADC1_Channel_TypeDef ADC1_Channel,

               ADC1_PresSel_TypeDef ADC1_PrescalerSelection,

               ADC1_ExtTrig_TypeDef ADC1_ExtTrigger,

               FunctionalState ADC1_ExtTriggerState,

               ADC1_Align_TypeDef ADC1_Align,

               ADC1_SchmittTrigg_TypeDef ADC1_SchmittTriggerChannel, FunctionalState ADC1_SchmittTriggerState)

{



    /* Check the parameters */

    assert_param(IS_ADC1_CONVERSIONMODE_OK(ADC1_ConversionMode));

    assert_param(IS_ADC1_CHANNEL_OK(ADC1_Channel));

    assert_param(IS_ADC1_PRESSEL_OK(ADC1_PrescalerSelection));

    assert_param(IS_ADC1_EXTTRIG_OK(ADC1_ExtTrigger));

    assert_param(IS_FUNCTIONALSTATE_OK(((ADC1_ExtTriggerState))));

    assert_param(IS_ADC1_ALIGN_OK(ADC1_Align));

    assert_param(IS_ADC1_SCHMITTTRIG_OK(ADC1_SchmittTriggerChannel));

    assert_param(IS_FUNCTIONALSTATE_OK(ADC1_SchmittTriggerState));



  /*-----------------CR1 & CSR configuration --------------------*/

    /* Configure the conversion mode and the channel to convert

       respectively according to ADC1_ConversionMode & ADC1_Channel values  &  ADC1_Align values */

    ADC1_ConversionConfig(ADC1_ConversionMode, ADC1_Channel, ADC1_Align);

    /* Select the prescaler division factor according to ADC1_PrescalerSelection values */

    ADC1_PrescalerConfig(ADC1_PrescalerSelection);



  /*-----------------CR2 configuration --------------------*/

    /* Configure the external trigger state and event respectively

       according to NewState, ADC1_ExtTrigger */

    ADC1_ExternalTriggerConfig(ADC1_ExtTrigger, ADC1_ExtTriggerState);



  /*------------------TDR configuration ---------------------------*/

    /* Configure the schmitt trigger channel and state respectively

       according to ADC1_SchmittTriggerChannel & ADC1_SchmittTriggerNewState  values */

    ADC1_SchmittTriggerConfig(ADC1_SchmittTriggerChannel, ADC1_SchmittTriggerState);



    /* Enable the ADC1 peripheral */

    ADC1->CR1 |= ADC1_CR1_ADON;



}



void ADC1_Cmd(FunctionalState NewState)

{



    /* Check the parameters */

    assert_param(IS_FUNCTIONALSTATE_OK(NewState));



    if (NewState != DISABLE)

    {

        ADC1->CR1 |= ADC1_CR1_ADON;

    }

    else                        /* NewState == DISABLE */

    {

        ADC1->CR1 &= (u8) (~ADC1_CR1_ADON);

    }



}



void ADC1_ClearFlag(ADC1_Flag_TypeDef Flag)

{

    u8 temp = 0;



    /* Check the parameters */

    assert_param(IS_ADC1_FLAG_OK(Flag));



    if ((Flag & 0x0F) == 0x01)

    {

        /* Clear OVR flag status */

        ADC1->CR3 &= (u8) (~ADC1_CR3_OVR);

    }

    else if ((Flag & 0xF0) == 0x10)

    {

        /* Clear analog watchdog channel status */

        temp = (u8) (Flag & 0x0F);

        if (temp < 8)

        {

            ADC1->AWSRL &= (u8) (~((u8) 1 << temp));

        }

        else

        {

            ADC1->AWSRH &= (u8) (~((u8) 1 << (temp - 8)));

        }

    }

    else                        /* Clear EOC | AWD flag status */

    {

        ADC1->CSR &= (u8) (~Flag);

    }

}





void ADC1_StartConversion(void)

{

    ADC1->CR1 |= ADC1_CR1_ADON;

}


关键字:STM8 引用地址:STM8 AD的学习

上一篇:用PWM波控制LED灯的闪烁
下一篇:STM8 I2C的学习

推荐阅读最新更新时间:2024-03-16 16:05

STM8学习笔记---PWM互补波形输出
脉宽调制(PWM,Pulse Width Modulation)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。 常见的用法是输出一路PWM波,可以通过调节PWM的频率和占空比来控制电路。还有另一种方法是输出一组互补的PWM波,这两个波形频率相同,相位相反,两组波形之间有死区控制时间。 STM8单片机自带PWM互补波形输出功能,通过资料可以看出 STM8共有3个死区时间可调的互补输出。 本次实验用的STMs8003单片机有2个互补输出。 PC6口和PC3口是定时器1通道1互补输出。PC7口和PC4口是定时器1通道2互补输出。 要配置输出互补P
[单片机]
<font color='red'>STM8</font>学习笔记---PWM互补波形输出
基于STM8及UHF RF收发器SX1231的无线射频收发系统设计
2008年中国政府为微功率(短距离)无线电应用增加了868MHz~ 868.6MHz的工作频率。其对无线电设备的射频要求如下: (1)发射功率限值:5mW(e.r.p); (2)发射信号的占空比限值:1%; (3)载波频率容限:100×10-6; 并把该类设备归类于“各类民用设备的无线电控制装置中。 从上面的规定中可以看到,该频段可用带宽为600kHz,但并没有明确在该频道使用的带宽,数据速率以及调制方式方面要求,这就给予了应用很大的空间。本文主要是基于868MHz频段的要求,设计了比较简单通用的无线收发系统,该系统可适用于该频段的不同的无线传输应用。 SX1231介绍及性能描述 SX1231芯片是Semtech公司推出的一款高
[单片机]
基于<font color='red'>STM8</font>及UHF RF收发器SX1231的无线射频收发系统设计
超高速模数转换器AD9224及其应用
   1 引言   AD9224是美国AD公司生产的一种12位、40MSPS高性能模数转换器。它具有片内高性能采样保持放大器和电压参考。在单一+5V电源下,它的功耗,仅有376mW,信噪比与失真度为±0.7dB。且具有信号溢出指示位,并可直接以二进制形式输出数据。AD9224采用多级差动流水线式结构对输出错误进行逻辑纠正,以保证在整个工作温度范围内不失码。AD9224的接口十分方便,可广泛应用在图象、通信系统以及医疗超声波设备中。   2 内部结构与引脚说明   AD9224是一种高性能、单一电源供电的12位ADC,其内部结构框图如图1所示。   AD9224的模拟输入范围非常灵活,可以是DC或AC耦合的单端或差分输
[模拟电子]
低成本AD转换器电路图
低成本A,D转换器电路图
[模拟电子]
低成本<font color='red'>AD</font>转换器电路图
STM8 IAR新建寄存器工程
. 2. 3. 4.添加头文件目录 转化为相对目录 5.设置输出文件目录 6.设置仿真工具
[单片机]
<font color='red'>STM8</font> IAR新建寄存器工程
STM8 时钟切换
HSE、HSI、LSI 都可以作为系统主时钟源,STM8 单片机复位以后默认 HSI 的 8 分频作为系统主时钟,其原因是 HSI 稳定时间短,而其 8 分频又可以保证系统在较差的 VDD 条件下安全启动。在系统运行的过程中可以切换系统的主时钟源。系统时钟源的切换有 2 种方式:自动切换、手动切换。 自动切换可以使用最少的指令来完成主时钟源的切换,用户程序可以处理其他事物而不用关心确切的切换时间;手动切换在硬件准备好之后不立即切换,允许用户精确的控制切换发生的时间。 自动切换的步骤为: 1.设置切换控制寄存器 CLK_SWCR 中的 SWEN 位,使能时钟切换。 2.设置主时钟切换寄存器 CLK_SWR,选择目标时钟源
[单片机]
<font color='red'>STM8</font> 时钟切换
基于STM8主控的物美价廉的毫欧表设计
主控采用STM8单片机,测量使用开尔文接法,测量精度与系统使用电阻精度精度有很大关系,使用高精度电阻可以大大提高测量精度,下载程序后即可使用。
[单片机]
基于<font color='red'>STM8</font>主控的物美价廉的毫欧表设计
CBFET运放AD843及其在阻抗匹配电路中的应用
    摘要: 介绍了CBFET(互补双极型场效应管)运算放大器AD843的主要功能特点及其在阻抗匹配电路中的应用。并通过几种阻抗匹配电路的比较说明了该芯片的独特性和优越性,最后给出了AD843的一个应用实例。     关键词: CBFET 运算放大器 阻抗匹配 AD843 在电路设计中的许多情况下需要进行阻抗匹配变换,以适应各种芯片或元件间的匹配。传统的阻抗匹配由分立器件组成,因而电路干扰大、调试麻烦、开发周期长并且维护困难。而一些运放集成芯片由于本身在结构上的设计局限(如频带宽度,输入偏置电路等),远远不能满足较宽频带和精确匹配的要求。CBFEY(互补双级型场效应管)运算放大器AD843却能以其独特的
[半导体设计/制造]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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