历史上的今天
返回首页

历史上的今天

今天是:2025年06月18日(星期三)

正在发生

2018年06月18日 | STM8 AD的学习

2018-06-18 来源:eefocus

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;

}


推荐阅读

史海拾趣

德艺隆(DEALON)公司的发展小趣事

面对数字化转型和智能化升级的大趋势,德艺隆不甘落后。他们引进先进的生产设备和技术,提高了生产效率和产品质量;同时,公司还加大了对数字化和智能化技术的研发和应用力度,推出了一系列智能化产品解决方案。这些举措不仅提升了公司的竞争力,也为公司的未来发展奠定了坚实的基础。

DATEL Inc公司的发展小趣事

DATEL Inc.公司成立于1970年,总部位于美国马萨诸塞州。公司成立的初衷是解决当时数据采集领域的痛点,如数据准确性低、采集效率低下等问题。创始人带领一支由工程师组成的团队,开始研发第一代数据采集产品。他们日夜兼程,不断试验、调整,最终成功推出了一款体积小、功耗低、易于开发的数据采集器,这款产品迅速在市场中获得了认可。

Churod Electronics Co Ltd公司的发展小趣事

为了保证产品质量和客户满意度,中汇瑞德一直将质量管理体系的建设放在重要位置。公司引入了国际先进的质量管理理念和方法,建立了完善的质量管理体系,并通过了多项国际认证。同时,公司还加强了对供应商的管理和评估,确保原材料的质量符合公司要求。这些措施有效地提高了产品的质量稳定性和可靠性,赢得了客户的信任和认可。

电连(ECT)公司的发展小趣事

为了进一步扩大市场份额,ECT积极推进国际化战略。截止2022年初,公司在全球共设立23个分支机构,覆盖了中国台湾、中国香港、韩国、日本、泰国、越南、美国等国家和地区。通过国际化战略的实施,ECT不仅成功将产品推向全球市场,也提升了公司的国际影响力和竞争力。

Fuji Electric Co Ltd公司的发展小趣事

为了提高公司治理能力和运营效率,ECT在2019年引入并升级了SAP信息化系统。这一系统的引入不仅实现了公司各部门之间的信息共享和协同工作,也提高了公司对市场变化的响应速度和决策效率。通过SAP信息化系统的支持,ECT在保持技术领先的同时,也实现了业务的稳健发展。

以上五个故事概述了电连(ECT)公司在电子行业中的发展历程和关键事实。这些故事展示了ECT在技术创新、市场拓展、国际化战略和信息化建设等方面的努力和成果。

ZTE高新兴(Gosuncn)公司的发展小趣事

为了提高公司治理能力和运营效率,ECT在2019年引入并升级了SAP信息化系统。这一系统的引入不仅实现了公司各部门之间的信息共享和协同工作,也提高了公司对市场变化的响应速度和决策效率。通过SAP信息化系统的支持,ECT在保持技术领先的同时,也实现了业务的稳健发展。

以上五个故事概述了电连(ECT)公司在电子行业中的发展历程和关键事实。这些故事展示了ECT在技术创新、市场拓展、国际化战略和信息化建设等方面的努力和成果。

问答坊 | AI 解惑

产品介绍

这里面是无线龙通讯科技的一些产品资料,希望对大家有些帮助…

查看全部问答>

74LS47驱动数码管问题!!!

请问大家哈,我用74LS47驱动两个4位数码管,数码管亮度很微弱,我更改为双电源,单独给数码管提供5V电压,但是情况仍没有改变。我一时找不到原因!大家有什么看法没?感谢!!感谢!!感谢!!!…

查看全部问答>

开发PIC绝对不可缺少的仿真软件(转)

来源:http://pic16.com/bbs/dispbbs.asp?boardID=8&ID=41595&page=4 这里一分钟就让你学会使用PROTEUS(完整版) 近期流感爆发 由于小弟天天沉醉在电脑前忘乎所以 被染病多日随入院治疗 忽有客户来寻 手头一无开发工具 二无相关软件 只有笔记本 ...…

查看全部问答>

功放电路250种全集

功放电路250种全集 电路全部为图片格式,请大家视情况下载。…

查看全部问答>

wince5.0的死机问题

小弟用的wince5.0+2440,做了一些扳子后,发现有部分板子运行内存测试程序和串口通信时会死机,但是dnw上有没有任何错误提示信息,只是lcd屏上显示的内容停止了,程序感觉没有运行了,点触摸屏也没有任何反应。请问有没有大哥遇到同样的问题?原因 ...…

查看全部问答>

触摸屏的背光和触摸板驱动电路是分开的吗?为什么黑屏但触摸好用?

触摸屏的背光和触摸板驱动电路是分开的吗?为什么黑屏但触摸好用?…

查看全部问答>

关于单片机定时器溢出值的设定

本人最近在学习单片机,发现很多程序里面都有关于定时器溢出值的设定 例如,在DS18B20温度测量与控制实验中,有这样的程序 TR1=0; //STOP Timer1 TH1=(-SYSCLK/us)>>8; //set Timer1 to overflow in us TL1=-SYSCLK/us; TR1=1; //STAR Ti ...…

查看全部问答>

LM3S菜鸟成长日记-SD卡-文件写/读

replyreload += \',\' + 813951;实现功能:创建12-29.txt,写入EEWORD GOOD!,然后在读出来 主代码: int main(void){ //系统时钟 SysCtlClockSet(SYSCTL_SYSDIV_1|SYSCTL_USE_OSC| SYSCTL_OSC_MAIN |     &n ...…

查看全部问答>

全局时钟资源的使用方法

IBUFG + BUFG的使用方法:IBUFG后面连接BUFG的方法是最基本的全局时钟资源使用方法,由于IBUFG组合BUFG相当于BUFGP,所以在这种使用方法也称为BUFGP方法。 IBUFGDS + BUFG的使用方法:当输入时钟信号为差分信号时,需要使用IBUFGDS代替IBUFG。 ...…

查看全部问答>

大家说说 ,自己都什么情况下把 DSP给烧了.

大家说说 ,自己都什么情况下把 DSP给烧了. 说说我的: AD 的过压.   另外模拟地没有处理好. 短路了.   有经历过更复杂的吗? …

查看全部问答>