历史上的今天
返回首页

历史上的今天

今天是:2024年09月24日(星期二)

正在发生

2021年09月24日 | STM8的ADC多种采集模式详解及应用

2021-09-24 来源:eefocus

一,STM8S 的 ADC 支持 5 种转换模式:单次模式、连续模式、带缓冲的连续模式、单次扫描模式、连续扫描模式。

在这里插入图片描述

1单次模式

单次模式,STM8S 的 ADC 只在选定的通道上进行一次 ADC 转换,转换的结果存储在 ADC_DR 寄存器中。


void ADC_Init(void)

{

ADC1_DeInit();//ADC 相关寄存器恢复默认值

//初始化 ADC:单次转换/通道 8/时钟分频/关闭事件/数据右对齐/使能施密特触发器

ADC1_Init(ADC1_CONVERSIONMODE_SINGLE, ADC1_CHANNEL_8, ADC1_PRESSEL_FCPU_D2,

ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_ALL,

DISABLE);

ADC1_Cmd(ENABLE);//使能 ADC

}


void main( void )



u16value=0;


  adc_init();


  while(1)


  {

ADC1_StartConversion();//开启一次转换一次


while(!ADC1_GetFlagStatus(ADC1_FLAG_EOC));//等待转换完成


    ADC1_ClearFlag(ADC1_FLAG_EOC);//软件清除


    value=(u16)ADC1_GetConversionValue();//从ADC_DR中读取ADC值


}


}

}


**2连续模式

连续模式,ADC 在结束一次转换之后立刻自动进行下一次转换。连续模式时,转换结果存储在 ADC_DR 寄存器**


void ADC_Init(void)

{

ADC1_DeInit();//ADC 相关寄存器恢复默认值

//初始化 ADC:连续转换/通道 8/时钟分频/关闭事件/数据右对齐/使能施密特触发器

ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_CHANNEL_8, ADC1_PRESSEL_FCPU_D2,

ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_ALL,

DISABLE);

ADC1_Cmd(ENABLE);//使能 ADC

}



void main( void )



u16value=0;


  adc_init();


  while(1)


  {

while(!ADC1_GetFlagStatus(ADC1_FLAG_EOC));//等待转换完成


    ADC1_ClearFlag(ADC1_FLAG_EOC);//软件清除


    value=(u16)ADC1_GetConversionValue();//从ADC_DR中读取ADC值


}


}


**3带缓冲的连续模式

ADC 在结束一次转换之后立刻自动进行下一次转换,连续 8 个或 10 个转换结果被存储在数据缓冲区。**


void ADC_Init(void)

{

ADC1_DeInit();//ADC 相关寄存器恢复默认值

//初始化 ADC:连续转换/通道 8/时钟分频/关闭事件/数据右对齐/使能施密特触发器

ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS,ADC1_CHANNEL_8, ADC1_PRESSEL_FCPU_D2,

ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_ALL,

DISABLE);

ADC1_Cmd(ENABLE);//使能 ADC

ADC1_DataBufferCmd(ENABLE);//开启缓存

}


void main( void )



u16value=0;


  adc_init();


  while(1)


  {

while(!ADC1_GetFlagStatus(ADC1_FLAG_EOC));//等待转换完成


    ADC1_ClearFlag(ADC1_FLAG_EOC);//软件清除


    value=0;


for(u8 i=0;i<10;i++)//


    {

      value+=ADC1_GetBufferValue(i);//将10个缓存中的值求和


    }


    value=value/10;//求出ADC的平均值


}


}


**4单次扫描模式

ADC 对通道 AIN0~AINn 逐个进行单次转换,并接结果存储在数据缓冲区**


void ADC_Init(void)

{

ADC1_DeInit();//ADC 相关寄存器恢复默认值

//初始化 ADC:连续转换/通道 8/时钟分频/关闭事件/数据右对齐/使能施密特触发器

ADC1_Init(ADC1_CONVERSIONMODE_SINGLE, ADC1_CHANNEL_8, ADC1_PRESSEL_FCPU_D2,

ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_ALL,

ENABLE);//该处在串口发送及接收时需配置为ENABLE,否则会出现无法发送的现象。

ADC1_ScanModeCmd(ENABLE);

ADC1_Cmd(ENABLE);//使能 ADC

}


void main( void )



u16value1=0;


u16value2=0;


  adc_init();


  while(1)


  {

ADC1_StartConversion();//开启一次转换


while(!ADC1_GetFlagStatus(ADC1_FLAG_EOC));//等待转换完成


    ADC1_ClearFlag(ADC1_FLAG_EOC);//软件清除


    value1=(u16)ADC1_GetBufferValue(ADC1_SCHMITTTRIG_CHANNEL2)//读取AIN2的值


value2=(u16)ADC1_GetBufferValue(ADC1_SCHMITTTRIG_CHANNEL4)//读取AIN4的值


}


}


**5连续扫描模式

此模式下 ADC 重复单次扫描模式**


void ADC_Init(void)

{

ADC1_DeInit();//ADC 相关寄存器恢复默认值

//初始化 ADC:连续转换/通道 8/时钟分频/关闭事件/数据右对齐/使能施密特触发器

ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_CHANNEL_8, ADC1_PRESSEL_FCPU_D2,

ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_ALL,

DISABLE);

ADC1_Cmd(ENABLE);//使能 ADC

}


void main( void )



u16value1=0;


u16value2=0;


  adc_init();


  while(1)


  {

while(!ADC1_GetFlagStatus(ADC1_FLAG_EOC));//等待转换完成


    ADC1->CSR = (uint8_t)(ADC1->CSR &(~ADC1_FLAG_EOC)|ADC1_CHANNEL_4);//软件清除


     value1=(u16)ADC1_GetBufferValue(ADC1_SCHMITTTRIG_CHANNEL2)//读取AIN2的值


value2=(u16)ADC1_GetBufferValue(ADC1_SCHMITTTRIG_CHANNEL4)//读取AIN4的值


}


}


二,在单次扫描模式工作时,必须使用ADC1_ClearFlag函数清除ADC读取标志位。而在连续扫描模式中,则不能清除该标志位,否则会导致ADC通道工作不正常。代码如下:


void main(void)

{

ADC1_StartConversion();//启动转换

while(1)

  {

    u16_adc1_value=ADC1_GetBufferValue(2);//读取通道2

    VoltageValue=u16_adc1_value;//转换为电压值 

    u16_adc1_value=ADC1_GetBufferValue(3);//读取通道3

    CurrentValue=u16_adc1_value;//转换为电流值  

    //ADC1_ClearFlag(ADC1_FLAG_EOC); //该处代码在ADC连续扫描模式时禁用  

  }

}


三,在ADC1_PRESSEL_FCPU_D2函数中D2代表预分频器选择fcpu/2

该函数还有


typedef enum 

{

  ADC1_PRESSEL_FCPU_D2  = (uint8_t)0x00, /**< Prescaler selection fADC1 = fcpu/2 */

  ADC1_PRESSEL_FCPU_D3  = (uint8_t)0x10, /**< Prescaler selection fADC1 = fcpu/3 */

  ADC1_PRESSEL_FCPU_D4  = (uint8_t)0x20, /**< Prescaler selection fADC1 = fcpu/4 */

  ADC1_PRESSEL_FCPU_D6  = (uint8_t)0x30, /**< Prescaler selection fADC1 = fcpu/6 */

  ADC1_PRESSEL_FCPU_D8  = (uint8_t)0x40, /**< Prescaler selection fADC1 = fcpu/8 */

  ADC1_PRESSEL_FCPU_D10 = (uint8_t)0x50, /**< Prescaler selection fADC1 = fcpu/10 */

  ADC1_PRESSEL_FCPU_D12 = (uint8_t)0x60, /**< Prescaler selection fADC1 = fcpu/12 */

  ADC1_PRESSEL_FCPU_D18 = (uint8_t)0x70  /**< Prescaler selection fADC1 = fcpu/18 */

} ADC1_PresSel_TypeDef;


共八种选项,D2→D18,该值越大,则ADC转换速度越慢,数值越稳定。误差也会越小。


四,注意:在扫描模式(连续扫描模式)中,不要使用位操作指令(BRES)去清除EOC标志位,这是因为该指令是对整个ADC_CSR寄存器的一个读-修改-写操作。从CH[3:0]寄存器中读取当前的通道编号和写回该寄存器,将会改变扫描系列的最后通道编号。在连续扫描模式中正确的清除EOC标志位的方法是 个RAM变量中载入一个字节到ADC_CSR寄存器,这样来清除EOC标志位同时还重新载入扫描系列新的最后通道编号。


通过实验可以发现,位操作指令只在连续扫描模式中会清除CH[3:0]寄存器中的值,但并不影响其他值。因此将ADC_CSR中的值读出,再将CH[3:0]中原来通道号加入进去,最后重新写入ADC_CSR中即可。写法如下:


ADC1->CSR = (uint8_t)(ADC1->CSR &(~ADC1_FLAG_EOC)|ADC1_CHANNEL_n);


注:ADC1_CHANNEL_n表示扫描到那个通道结束。

推荐阅读

史海拾趣

High Tech Chips Inc公司的发展小趣事

机顶盒,全称为数字视频变换盒,是连接电视机与外部信号源的重要设备,具有高度的专业性和广泛的应用性。它不仅能接收来自有线电缆、卫星天线、宽带网络及地面广播的数字电视信号,还能将这些信号转换成适合在电视机上播放的格式,极大地丰富了用户的观看体验。

机顶盒分为数字机顶盒和网络机顶盒两大类。数字机顶盒主要实现数模转换功能,使用户能用原有的模拟电视机观看数字电视,包括有线电视、卫星电视和地面广播电视的数字机顶盒。而网络机顶盒则进一步扩展了功能,能接入互联网,提供如IPTV、视频点播、在线游戏、网页浏览等多元化服务,使电视机转变为一个智能互动终端。

机顶盒的工作原理涵盖接收、解码和显示三个关键步骤。通过内置的调谐器接收信号,解调器将信号从载波中提取,解码器再将信号转换为电视可识别的视频和音频流,最终通过电视机呈现给用户。随着技术的不断进步,机顶盒的功能也在不断升级,如支持4K、8K超高清视频播放,搭载智能推荐算法提供个性化内容推荐,以及通过语音识别技术实现便捷操作等。

综上所述,机顶盒作为连接电视与互联网的重要桥梁,其专业性和科普性不言而喻。它不仅为用户提供了丰富多彩的电视节目和娱乐选择,还推动了电视产业的智能化发展,成为现代家庭不可或缺的一部分。

南京绿芯(Grenergy)公司的发展小趣事

对于电子消毒柜电路,网友可能的问题涉及多个方面,包括故障排查、日常维护、使用注意事项等。以下是一些可能的问题及详细回答:

一、故障排查类问题

1. 消毒柜通电后跳闸怎么办?

回答
消毒柜通电后跳闸可能是由电路短路引起的。首先,检查电源插座的火线(L)、零线(N)、地线(E)是否接线正确。其次,按照消毒柜上的线路图检查柜内线路接线是否正确,以及线路绝缘层是否被破坏(如被螺丝钻破、被金属边角划破等)。如果以上检查均正常,可能是电源板或继电器等部件损坏,建议联系专业维修人员进行检查和更换。

2. 消毒柜插上电源后无法启动,指示灯不亮怎么办?

回答
消毒柜无法启动且指示灯不亮,可能是由以下原因造成:电源插座无电或接触不良、熔断器烧坏、电源线与机体接触不良或断路、变压器烧坏或断路、电路板烧坏、继电器失灵等。解决方法包括检查电源插座、更换熔断器、检查并修复线路、更换电路板或继电器等。如果问题依然存在,建议联系专业维修人员进行检查。

二、日常维护类问题

1. 消毒柜需要定期清洁哪些部位?

回答
消毒柜需要定期清洁的部位包括柜体内部、层架、门封条以及散热孔等。清洁时,应使用柔软的布或海绵,避免使用腐蚀性强的清洁剂。同时,要注意不要将水溅入电路板等电子元件区域,以免造成短路或损坏。

2. 消毒柜的电源线应该如何保养?

回答
消毒柜的电源线应定期检查是否老化或破损,如有发现应及时更换。在使用过程中,应避免电源线过度弯折或受到重物压迫,以免影响其使用寿命和安全性。此外,电源线应远离高温、潮湿和腐蚀性强的环境,以确保其绝缘性能不受影响。

三、使用注意事项类问题

1. 消毒柜在使用时需要注意哪些安全问题?

回答
消毒柜在使用时需要注意以下安全问题:

  • 确保电源插座接地良好,避免漏电危险。
  • 不要将易燃易爆物品放入消毒柜内,以免发生火灾或爆炸。
  • 在使用过程中,应避免频繁开关柜门,以免影响消毒效果和能耗。
  • 使用完毕后,应及时关闭电源并拔掉插头,以节约能源和延长设备使用寿命。

2. 消毒柜是否可以一直插电使用?

回答
消毒柜是否可以一直插电使用取决于用户的使用情况和需求。如果用户经常使用消毒柜且没有其他特殊需求,可以保持电源连接;如果用户不经常使用消毒柜或者有其他特殊需求(如节约能源、避免设备老化等),建议在使用前提前通电,并在非使用状态下拔掉电源。此外,为了确保安全,插座应具备防水、防漏电等功能。

综上所述,对于电子消毒柜电路的问题,网友可能关注故障排查、日常维护和使用注意事项等方面。通过了解这些问题的解决方法和注意事项,可以更好地使用和维护消毒柜,确保其正常运行和延长使用寿命。

Gravitech公司的发展小趣事

对于电子猜数玩具电路的网友可能提出的问题,我整理了一些常见问题及其回答:

一、电路设计相关问题

  1. 问题:电子猜数玩具电路的基本组成部分有哪些?
    回答:电子猜数玩具电路通常由触摸控制器、多谐振荡器、LED驱动电路和受控声、光电路等部分组成。具体来说,包括时基集成电路(如NE555)、非门集成电路(如CD4069)、计数分配器集成电路(如CD4017)、音乐集成电路、继电器、二极管、发光二极管、电阻器、电容器等元器件。

  2. 问题:如何设计电路以确保游戏能够正确运行?
    回答:设计电路时,需要确保各个部分能够协调工作。例如,触摸控制器负责检测玩家的输入,多谐振荡器产生计数脉冲,LED驱动电路控制LED的显示,受控声、光电路则在玩家猜中数字时发出声音和光信号。设计时还需要注意电路的稳定性和可靠性,避免信号干扰和元件损坏。

  3. 问题:电路中的LED如何布局以实现数字显示?
    回答:LED的布局通常根据要显示的数字范围进行设计。例如,如果要显示0-9的数字,可以使用7段LED数码管或分散的LED灯。7段LED数码管内部含有8个LED小灯(7个用于显示数字段,1个用于小数点或原点),通过控制这些LED的亮灭来显示不同的数字。如果是分散的LED灯,则需要根据数字的形状来布置LED,并通过编程控制它们的亮灭。

二、元件选择与参数设置问题

  1. 问题:如何选择适合的集成电路和元器件?
    回答:选择集成电路和元器件时,需要考虑电路的需求、元器件的性能参数以及成本等因素。例如,时基集成电路可以选择NE555,因为它具有成本低、易于获取和使用的优点;非门集成电路可以选择CD4069,因为它提供了多个非门输出,方便电路设计;发光二极管则需要选择高亮度的型号以确保显示效果良好。

  2. 问题:电阻器和电容器的参数如何设置?
    回答:电阻器和电容器的参数设置需要根据电路的具体需求来确定。电阻器的阻值会影响电流的大小和LED的亮度,因此需要根据LED的电流需求和驱动电压来选择合适的阻值。电容器的容量则会影响多谐振荡器的振荡频率和电路的响应时间,需要根据实际需要进行调整。

三、调试与故障排除问题

  1. 问题:如何调试电子猜数玩具电路?
    回答:调试电路时,可以按照以下步骤进行:首先检查电路连接是否正确,包括电源连接、信号连接和地线连接等;然后使用万用表等工具测试电路中的电压和电流是否正常;最后观察LED的显示和声音输出是否符合预期。如果出现问题,可以逐步排查各个部分,找出故障点并进行修复。

  2. 问题:电路中出现LED不亮或声音不响的故障怎么办?
    回答:如果LED不亮或声音不响,首先需要检查电源是否正常供电;然后检查相关元器件是否损坏或接触不良;最后检查控制信号是否正确传输。如果以上都正常,可能是程序设计或电路布局存在问题,需要进一步检查和调整。

四、拓展与改进问题

  1. 问题:如何增加电子猜数玩具的趣味性和挑战性?
    回答:可以通过增加游戏难度、丰富游戏模式或添加互动元素等方式来增加电子猜数玩具的趣味性和挑战性。例如,可以设置不同的难度等级、增加倒计时功能、设置奖励机制或添加与手机等设备的互动功能等。

  2. 问题:如何对电子猜数玩具电路进行改进以降低成本或提高性能?
    回答:降低成本可以通过选择性价比更高的元器件、优化电路设计、减少不必要的元器件数量等方式实现;提高性能则可以通过升级元器件、改进电路设计、优化算法等方式实现。具体改进方案需要根据实际情况和需求进行制定。

芯朋微电子(chipown)公司的发展小趣事

2020年7月22日,芯朋微电子在上交所科创板成功挂牌上市,这一里程碑事件标志着公司进入了全新的发展阶段。上市后,公司凭借资本市场的支持,加速了产品研发和市场拓展,品牌影响力得到进一步提升。

巴丁微公司的发展小趣事

巴丁微深知人才是企业发展的核心动力。因此,公司始终注重团队建设与人才培养。公司拥有一支由行业精英组成的骨干团队,他们在集成电路设计、研发、销售等方面具有丰富的经验和深厚的专业知识。

同时,巴丁微也积极引进和培养新人才,通过定期的培训和学习机会,提升员工的技能水平和综合素质。公司还建立了完善的激励机制,鼓励员工勇于创新、敢于担当,为企业的发展贡献智慧和力量。

通过以上五个故事,我们可以看出巴丁微在电子行业发展的历程中,始终坚持以技术创新为核心,不断提升产品质量和市场竞争力。同时,公司也注重团队建设与人才培养,为企业的可持续发展提供了有力保障。未来,我们有理由相信巴丁微将继续在电子行业中取得更加辉煌的成就。

请注意,以上故事是基于公开资料编写的,可能与实际情况存在细微差别。如需获取更详细和准确的信息,建议直接联系巴丁微公司或查阅相关官方资料。

华润微(CRMICRO)公司的发展小趣事

华润微的前身可以追溯到1983年成立的香港华科电子公司。这家公司在电子行业中默默耕耘,逐渐积累了技术实力和市场份额。1999年,公司开始涉足6英寸晶圆代工业务,标志着其向半导体制造领域的进军。经过数年的发展和积累,华润微于2002年收购了中国华晶电子集团公司,进一步扩大了其业务范围和市场份额。此后,华润微不断壮大,逐步成为电子行业的佼佼者。

问答坊 | AI 解惑

SPMC65单片机在电动自行车控制器中的应用

1 引言 所谓中断是指当CPU正在处理某件事情的时候,外部发生的某一事件(如一个电平的变化,一个脉冲沿的发生或定时器计数溢出等)请求CPU迅速去处理,于是CPU暂时中止当前的工作,转去处理所发生的事件。中断服务处理完该事件以后,再 ...…

查看全部问答>

本田开发出新型脑波识别系统

近日,汽车大亨本田宣称与其它公司合作开发出了一种新的脑波识别系统(BMI),这种系统允许控制者单纯通过脑波即可控制机器人运动。该系统是本田和日本政府资助的国际高等电信研究院(ATR)以及一家精密仪器制造商Shimadzu共同开发,系统以三年前发 ...…

查看全部问答>

五花八门的电池技术-2010年影响世界的十大潜力新技术

已经非常成熟的电池技术无法像是依循着摩尔定律(Moore\'s law)的IC那样,继续在能量密度上有所进展;但无可讳言,虽然我们希望电池能储存更多的电能,那也有可能带来其他的安全性风险。各种可携式电子设备都需要电池来供电,诉求环保的电动车若是少 ...…

查看全部问答>

急?为什么车载录像机的自检没有了

一台车载录像机突然没有自检了,不能开机了怎么办?是什么原因造成的呢?…

查看全部问答>

关于网络连接

想得到点思路:PIC和MODEM连接,要实现PIC上的程序用MODEM进行拨号上网 (相当于windows dial-up connection)。  谢谢大家。…

查看全部问答>

WinCE 串口

各位兄弟谁开发过或者正在开发WinCE串口程序,一起交流一下,QQ:987530739,交流进步,谢谢!…

查看全部问答>

inquiry命令后,出现bus reset 问题???

我现在是当发完inquiry命令后,出现bus reset现象,在BUS HOUND出现如下命令后 DO 55 53 42 43 10 84 53 89 08 00 00 00 80 00 0a 25 00 00 00 00 00 00 00 00 00 00 00 00 00   ssts 0e bus reset 就出现bus reset~~~,而且不知为什 ...…

查看全部问答>

Linux/UNIX人才培训

我公司一直有大量的(Linux/UNIX) 以及ORACLE中的人才,如有需要,请加             MSN:xuchuang3344@hotmail.com             邮箱:xuchuang@uplooking.com ...…

查看全部问答>

请求指点

我想学习嵌入式系统开发,但又无从下手,请高手指点我应该学些什么专业知识?…

查看全部问答>

INTEL VT的应用

  想知道INTEL VT 技术对普通用户能带来什么具体的应用?…

查看全部问答>