历史上的今天
返回首页

历史上的今天

今天是:2024年11月18日(星期一)

正在发生

2019年11月18日 | STM8S——Analog/digital converter (ADC)

2019-11-18 来源:eefocus

1、ADC1 and ADC2 are 10-bit successive approximation Anolog to Digital Converters.


所谓successive approximation,是逐次逼近的意思;


2、ADC分为ADC1和ADC2,ADC1的功能相比起ADC2更为强大,我们使用的是ADC1;



3、ADC有多种模式:(1)Single mode(2)Continuous mode(3)Buffered continuous mode(4)Single scan mode(5)Continuous scan mode


我们选用Continuous mode来实现,主要实现步骤:


(1)模式选择:

set CONT bit in the ADC_CR1 register (bit1),表示选择Continuous型;


clear DBUF bit in the ADC_CR3 register (bit7),表示no-buffering型的Continuous。


(2)转换配置:set EOCIE bit in the ADC_CSR register (bit 5),表示EOC中断使能;


在转换完成之后,硬件会自动将EOC(End of Conversion)flag置1,表示一次转换完成,进入下一次转换时需要在代码中将其清0;


而EOCIE位是EOC 中断的使能位,当EOCIE为1时,允许EOC中断。


(3)开始转换:set ADON bit in the ADC_CR1 register (bit0)。


(4)转换完后的数据存放在ADC_DR register中,只需读取寄存器中的内容即可获得答案。


(5)停止转换:reset ADON bit,更直接的是将ADC_CR1 register赋值为0x00。


说明:


(*)DBUF=1(Buffered continuous mode)时,转换后的数据存放在ADC_DBxR(x=or 0...7 or 0...9)中;


而DBUF=0时,转换后的数据存放在ADC_DR中; 


(*)由于ADC1和ADC2都是10-bit,一个8bit的寄存器装不下,所以在数据存放寄存器ADC_DR中,分为ADC_DRH和ADC_DRL;


我们采用右对齐的方式(ADC1_ALIGN_RIGHT)存储转换后的数据;所以10bit中的低8bit(D7...D0)存放在ADC_DRL中;剩下的2bit(D9、D8)存放在ADC_DRH的低位中,ADC_DRH的其余位全置0。同样的ADC1_ALIGN_LEFT为左对齐方式。


说了这么多废话,其实只需要我们选择ADC1_ALIGN_RIGHT即可,其他操作都已经内部封装好了。



4、(软件部分)根据以上步骤开始编程:


(1)首先申请一个PIN脚给ADC,我们申请E6脚(第24脚)


  GPIO_Init(GPIOE, GPIO_PIN_6, GPIO_MODE_IN_FL_NO_IT);;


(2)初始化ADC的各类寄存器,清零;


(3)配置ADC1:


//1.Continuous conversion mode

//2.specifies 9 channels to convert

//3.Prescaler selection fADC1 = fcpu/2

//4.Conversion from Internal TIM1 TRGO event

//5.ADC1_ExtTrigger DISABLE

//6.Data alignment right

//7.Schmitt trigger disable on AIN9

//8.ADC1_SchmittTriggerState DISABLE


ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_CHANNEL_9, ADC1_PRESSEL_FCPU_D2,

    ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL9,

    DISABLE);


(4)允许EOC中断,即将EOCIE置1,即ADC_CSR赋值为(uint8_t)0x20或(uint16_t)0x020;


(5)打开通用中断:enableInterrupts();


(6)开始转换:将ADON置1,即ADC_CR1赋值为(uint8_t)0x01;



 1 void main(void)

 2 { 

 3   /*  Init GPIO for ADC1 */

 4   GPIO_Init(GPIOE, GPIO_PIN_6, GPIO_MODE_IN_FL_NO_IT); //pin E6 ,24

 5   

 6   /* De-Init ADC peripheral*/

 7   ADC1_DeInit(); //reset registers

 8 

 9   /* Init ADC1 peripheral */

10   ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_CHANNEL_9, ADC1_PRESSEL_FCPU_D2,

11             ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL9,

12             DISABLE);

13 

14   /* Enable EOC interrupt */

15   ADC1_ITConfig(ADC1_IT_EOCIE, ENABLE);

16 

17   /* Enable general interrupts */  

18   enableInterrupts();

19   

20   /*Start Conversion */

21   ADC1_StartConversion();

22 }


主函数


(7)中断处理,当EOC被硬件置1并产生中断,触发INTERRUPT_HANDLER(ADC1_IRQHandler, 22)


中断便是传输结束,所以这时我们应该读取数据并且重置EOC准备下一次转换;


读取数据:ADC1_GetConversionValue(void),内部函数,根据设置的左(右)对齐方式,返回一个16位的转换后的数据;


清除EOC:将EOC重新写0;


(8)到这里已经完成了所有的操作,由于我们选用的是Continuous mode,所以只要我们没有将ADON写回0,转换就不会停,一轮接一轮的循环下去;


但为了便于我们观察,可以在每一轮之后将ADON写0(在中断中写),这样在主函数里设置一个断点,并查看16位的返回值就可以观察到结果。



 1 INTERRUPT_HANDLER(ADC1_IRQHandler, 22)

 2  {

 3    /* Get converted value */

 4    Conversion_Value = ADC1_GetConversionValue();

 5 

 6    /* Clear EOC */

 7    ADC1_ClearITPendingBit(ADC1_IT_EOC);

 8    

 9    /* Stop Continuous Conversion */

10    ADC1->CR1 = 0x00;

11  }

中断函数

 


5、硬件部分:


(1)将STM8S105单片机的第24脚外接一个10K的电阻,再由电阻另一端接一根导线;由接地端再接出一根导线,将两条导线分别接入稳压电源器的正负极;


(2)设置断点并运行程序,调节稳压电源器的电压(0-5V),可以发现不同的电压值会对应一个不同的16bit数;


(3)平均每增加0.05V,示数会增加一个10。



注意:24脚外一定要接一个电阻保护电路,否者在打开稳压电源器的瞬间,可能因为瞬间电流过大而击穿单片机。


我是照着一个ADC2的例子修改实现本次实验的,ADC2有的函数ADC1都有,而写ADC1实现得更多,所以在将ADC2改成ADC1时,存在着很多陷阱(函数参数、中断类型等);


但是真正弄明白我们需要拿ADC1实现什么, 又需要对ADC1做什么操作后,这些陷阱还是可以慢慢爬出来的;


ADC1能实现的东西还有很多,比如Buffered continuous mode、analog watchd等,由于我们的实验没有用到,就先不做说明。


推荐阅读

史海拾趣

芯佰微(Corebai)公司的发展小趣事

随着技术的不断发展,芯佰微逐步拓展了自己的产品线,覆盖了放大器、接口电路、电源管理、时间数字转换器、DAC数模转换、ADC模数转换等多个领域。同时,公司积极开拓国内外市场,与众多知名企业建立了合作关系,将产品广泛应用于手持移动终端、消费类电子产品、个人电脑及周边设备、网络通信设备、医疗设备、办公设备等多个领域。这些努力使得芯佰微的产品在市场上获得了广泛认可。

辉芒微(FMD)公司的发展小趣事

在快速发展的过程中,辉芒微积极寻求外部合作与资本支持。2017年,公司与芯天下达成重要交易,通过股权转让的方式,将SPI NOR Flash产品线转让给芯天下,并获得了丰厚的现金回报和股权收益。这一战略举措不仅为公司带来了短期的财务收益,更为后续的发展提供了更多的资本支持和战略灵活性。此后,辉芒微还成功吸引了多家知名投资机构的关注和支持,为其未来的发展注入了强劲的动力。

FLIR公司的发展小趣事

近年来,随着智能化和便携化趋势的兴起,FLIR积极响应市场需求,推出了一系列智能化、便携化的红外热像仪产品。例如,FLIR的I系列和T系列产品就以其小巧轻便、操作简便的特点受到了广大用户的青睐。这些产品不仅具备高性能的红外成像能力,还集成了多种智能化功能,如自动测温、图像分析、报告生成等,极大地提升了用户的使用体验和工作效率。此外,FLIR还推出了适用于智能手机的红外热像仪配件,进一步拓宽了产品的应用领域和市场空间。

百事通科技(BUDDIES)公司的发展小趣事

随着技术的不断成熟,百事通科技(BUDDIES)开始将目光投向更广阔的市场。公司制定了详细的市场拓展计划,通过参加国际电子展、与海外企业建立合作关系等方式,逐步打开了国际市场。同时,公司还注重品牌建设,通过精心设计的品牌形象和广告宣传,提升了品牌知名度和美誉度。

Electromagnetic Industries Llp公司的发展小趣事

EMI公司深知产品质量对企业的重要性。因此,公司建立了严格的质量管理体系,从原材料采购到生产加工再到产品检验,每一个环节都严格把关。同时,公司还引进了先进的检测设备和技术手段,确保产品质量的稳定性和可靠性。这些措施的实施使得EMI公司的产品质量得到了客户的广泛认可。

BB公司的发展小趣事

在电子行业竞争日益激烈的背景下,BB公司深知技术创新是企业发展的核心动力。因此,公司投入大量研发资金,积极引进和培养人才,不断推动技术创新。经过多年的努力,BB公司在模拟集成电路领域取得了多项重大突破,推出了一系列具有自主知识产权的创新产品。这些产品不仅提升了BB公司的市场竞争力,也为整个电子行业的发展做出了贡献。

问答坊 | AI 解惑

你听过这么感人的演讲

本帖最后由 paulhyde 于 2014-9-15 09:00 编辑 http://v.youku.com/v_show/id_XMTA3NTQ3Njky.html  …

查看全部问答>

DSP在直流电机控制中的应用

我用三恒星公司的2407的开发板做DSP控制直流电机的实验,要在原有基础上加一个编码器实现转速反馈,但是不懂具体连接方法以及编码器在其中的工作原理,请求帮助,QQ363906466 …

查看全部问答>

奇怪了无论改动什么,程序总是出错??

现在有一个wifi的驱动 ,在我的平台上编译没问题,通过。可是我想加打印信息,他就报错,编译不过去。可是最奇怪的是我就算不加打印信息,只是加几行空格,他也会报错。如果把原来的考过去,就好用,可以编译。…

查看全部问答>

买了个板子,点亮LED遇到问题,大家出出主意.

在用户手册上没有针对User Leds的一些定义, 只有一个LED的ADS工程,但是编译好以后将bin下载到板子上运行,User Leds似乎没反应,所以我判断工程有问题. 现在想自己编写代码操作User Leds,大家是怎么做的?…

查看全部问答>

EDU数据库使用方法

最近在Wince上做EDU数据库的毕业设计,编译的时候,EDU数据库的装载数据卷CeMountBDVolEx函数,卸载数据库卷CeMountDBVolEx函数,总之和EDU数据库相关的函数都不能用,EDU数据库下各种结构如CEPROPSPEC也提示:“ undeclared identifier”。哪位大 ...…

查看全部问答>

无线通信的硬件与软件方向各是什么?哪个比较有前途?

本人现在读研一,导师让选择研究方向(无线通信)是偏软还是偏硬,请问各位前辈哪个比较有前途? …

查看全部问答>

07.14【每周讨论】你们是如何看到老师监考的问题?

作为大学生或者以前的大学生,你们是如何看到老师监考的问题?说说你们学校的老师是怎么监考的?   还有怎么监考才能让师生之间的关系打到最好?    …

查看全部问答>

学习UCOS必看的三本书,珍藏版,重量级,绝版资料,更新中。。。

  本帖2011年12月12日更新中。。。今天是西安事变纪念日,别忘了呀。。。       先引用“历史的天空”的一个回帖,提到了这三本重量级的书籍,看过才发现我这里珍藏很多,恰好有这三本,特此奉上,根据回 ...…

查看全部问答>