最近在进行stm8s003MCU的嵌入式开发,因为其中要进行电压采集,所以学习了下该MCU的ADC模块。之前自己也开发过NXP cortex-M3的MCU,但是之前主要是在前人的基础上进行的开发,所以对ADC其实没有很深刻的认识。接下来介绍下这几天的收获。
一、stm8系列MCU的ADC支持5种转换模式:单次模式,连续模式,带缓存的连续模式,单次扫描模式,连续扫描模式。
单次模式
在STM8的ADC单次转换模式中,ADC仅在由ADC_CSR寄存器的CH[3:0]选定的通道上完成一次转换。该模式是在当CONT位为0时通过置位ADC_CR1寄存器的ADON位来启动的。
一旦转换完成,转换后的数据存储在ADC_DR寄存器中,EOC(转换结束)标志被置位,如果EOCIE被置位将产生一个中断。
连续和带缓存的连续模式
连续转换模式时ADC在完成一次转换后就立刻开始下一次的转换。当CONT位被置位时即在连换模式中,该模式是通过置位ADC_CR1寄存器的ADON位来启动的。
如果缓冲功能没有被使能(ADC_CR3寄存器的DBUF位=0),那么转换结果数据保存在ADC_DR寄存器中同时EOC标志被置位。如果EOCIE位已被置位时将产生一次中断。然后开始下一次转换。
如果缓存功能被使能(DBUF=1),那么某个选定通道上的8个或者10个连续的转换结果会填满数据缓存,当缓存被填满时,EOC(转换结束)标志被置位,如果EOCIE位已被置位,则会产生一个中断,然后一个新的转换自动开始。如果某个数据缓存寄存器在被读走之前被覆盖,OVR标志将置1。
如果要停止STM8的ADC连续转换,可以复位清零CONT位来停止转换或者复位清零ADON位来关闭ADC的电源。
单次扫描模式
该模式是STM8S用来转换从AIN0到之间的一连串模拟通道,'n'是在ADC_CSR寄存器的CH[3:0]位中指定的通道编号。在扫描转换的过程中,序号CH[3:0]位的值是被硬件自动更新的,它总保存当前正在被转换的通道编号。
单次转换模式可以在在SCAN位被置位且CONT位以被清零时通过置位ADON位来启动。
注意:当使用扫描模式时,不可以将AIN0到AINn之间通道对应的I/O口设为输出状态,因为ADC的多路选择器已经将这些I/O口的输出模块禁用了。
对于单次扫描模式,转换是从AIN0通道开始的,而且结果数据被存储在数据缓冲寄存器 ADC_DBxR中,当最后一个通道(通道'n')被转换完成后,EOC(转换结束)标志被置位,当 EOCIE位已被置位时将产生一个中断。可以从缓冲寄存器中读取各个通道的转换结果值。如果某个数据缓存寄存器在被读走之前被覆盖,OVR标志将置1。
在转换序列正在进行过程中不要清零SCAN位;单次扫描模式可通过清零ADON位来立即停止。为了开启一次新SCAN扫描转换,可以通过对ADC_CR1寄存器的EOC位清零和ADON位置位来实现。
连续扫描模式
该模式和单次扫描模式相近,只是每一次在最后通道转换完成时,一次新的从通道0到通道n扫描转换会自动开始。如果某个数据缓存寄存器在被读走之前被覆盖,OVR标志将置1。
连续扫描模式是在当SCAN位和CONT位已被置时,通过置位ADON位来启动的。在转换序列正在进行过程中不要清零SCAN位。连续扫描模式可以通过清零ADON位来立即停止。另外一种选择就是当转换过程中清除CONT位那么转换会在下一次的最后一个通道转换完成时停止。
注意:在STM8扫描模式中,不要使用位操作指令(BRES)去清除EOC标志位,这是因为该指令是对整个ADC_CSR寄存器的一个读-修改-写操作。从CH[3:0]寄存器中读取当前的通道编号和写回该寄存器,将会改变扫描系列的最后通道编号。
在连续扫描模式中正确的清除EOC标志位的方法是从一个RAM变量中载入一个字节到ADC_CSR寄存器,这样来清除EOC标志位同时还重新载入扫描系列新的最后通道编号。
本次我在实际使用过程中,考虑到只使用了两个AD通道,并且不需要一直采集,所以使用的是单次模式。我之前参与开发的使用其他MCU的项目也都是使用的单次模式。
关键字:stm8s 问题总结 AD转换
引用地址:
stm8s使用问题总结2——AD转换
推荐阅读最新更新时间:2024-11-08 16:33
PCF8563 时钟芯片驱动程序 (STM8S/STM8L)
模拟I2C读取时钟芯片PCF8563中的日期时间 #define SCLK_Clr() GPIO_ResetBits(GPIOD, GPIO_PIN_1)//SDA IIC接口的时钟信号 #define SCLK_Set() GPIO_SetBits(GPIOD, GPIO_PIN_1) #define SDIN_Clr() GPIO_ResetBits(GPIOD, GPIO_PIN_2)//SCL IIC接口的数据信号 #define SDIN_Set() GPIO_SetBits(GPIOD, GPIO_PIN_2) u8 buf ; void SDA_IN(u8 in) { if(in) GPIO_I
[单片机]
开关电源设计常见问题总结
如何为 开关电源 电路选择合适的元器件和参数? 很多未使用过 开关电源 设计的工程师会对它产生一定的畏惧心理,比如担心 开关电源 的干扰问题,PCB layout问题,元器件的参数和类型选择问题等。其实只要了解了,使用开关电源设计还是非常方便的。 一个开关电源一般包含有开关电源控制器和输出两部分,有些控制器会将MOSFET集成到芯片中去,这样使用就更简单了,也简化了PCB设计,但是设计的灵活性就减少了一些。 开关控制器基本上就是一个闭环的反馈控制系统,所以一般都会有一个反馈输出电压的采样电路以及反馈环的控制电路。因此这部分的设计在于保证精确的采样电路,还有来控制反馈深度,因为如果反馈环响应过慢的话,对瞬态响应能力是会有很
[电源管理]
STM8S(105K4)使用笔记——系统时钟的基础配置
0、STM8s105在系统复位后默认开启HSI,同时进行8分频 可以通过查看 寄存器CLK_ICKR为0x03(HSI使能) 寄存器CLK_CKDIVR为0x18(HSI分频为8分频) 1、初始化 使能HSI(系统初始化后HSI默认使能) CLK- ICKR |= 0x01; 禁用HSI CLK- ICKR &= (uint8_t)(~0x01); 使能LSI(若需要使用awu,请使能LSI) CLK- ICKR |= 0x08; 禁用LSI CLK- ICKR &= (uint8_t)(~0x08); 2、时钟分频 a、主时钟分频 1分频 CLK- CKDIVR &= (uint8_t)(~0x1
[单片机]
STM8S Timer2_OC1_PWM1输出模式
C语言: Codee#11722 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 实验平台: STM8S103F2P6 FM 接收实验核心板 + 硬件 : STM8S103F2P6 + 开发平台: IAR For STM8 1.10 + 仿真器 : ST-Link + 日期 : 2010-6-22 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #include stm8s.h /******
[单片机]
STM8S 定时器的使用
看了网上的资源,都不怎么好用,于是决定总结总结,记录下定时器的简单实用方法。 环境: STM8SF103 ,仿真器为:STLINK TIM4 属于8位定时器,最大128分频。 这个定时器的时钟源是系统时钟源(fMaster),然后直接通过预分频器分频后供CK_CNT使用。如:系统频率为4MHz,经过128分频后,提供给定时器使用的频率就为 31250Hz 因为项目需要,我这里使用的内部RC 16MHz振荡器,并进行LSI 4分频,所以主频为4MHz。 //main.c void Init_Tim4(void) { /*很多人都是在这里装填0xFF,其实是为了让PSC尽快生效,对于PSC的设置,需要在下一个
[单片机]
学习单片机步骤
学习使用单片机就是理解单片机硬件结构,以及内部资源的应用,在汇编或C语言中学会各种功能的初始化设置,以及实现各种功能的程序编制。 第一步:数字I/O的使用 使用按钮输入信号,发光二极管显示输出电平,就可以学习引脚的数字I/O功能,在按下某个按钮后,某发光二极管发亮,这就是数字电路中组合逻辑的功能,虽然很简单,但是可以学习一般的单片机编程思想,例如,必须设置很多寄存器对引脚进行初始化处理,才能使引脚具备有数字输入和输出输出功能。每使用单片机的一个功能,就要对控制该功能的寄存器进行设置,这就是单片机编程的特点,千万不要怕麻烦,所有的单片机都是这样。 第二步:定时器的使用 学会定时器的使用,就可以用单片机实现时序电路,时序电路的功能是
[单片机]
正点原子关于STM8S精确延时函数
已经写完了STM8S的系统文件(同stm32一样,包括sys.c,delay.c和uart.c三个文件) 这里先分享delay.c和delay.h. 本来想仿效STM32用一个定时器来做,无奈STM8S提供的是一个8位定时器,真是食之无味了... 算来算去,用这个8位的定时器横竖都不好做延时,用16位的定时器嘛又怕浪费.真不知道st的人怎么想的. 这个8位的基本定时器,连ucosii的滴答时钟都不好提供...(24Mhz下,最大只能1.3ms左右中断一次,16Mhz则是2ms左右) 难不成多次中断,触发一次任务切换? 所以,表示蛋疼的很,无奈只能想用汇编的方式来实现精确延时了. 研究了几天,终于小有成就.汇编写了一个us级
[单片机]
Modbus通讯协议4-20ma/0-10v转RS485数字模拟信号隔离AD转换模块
YL121产品实现传感器和主机之间的信号采集,用来检测模拟信号。YL121系列产品可应用在RS-485总线工业自动化控制系统,4-20mA / 0-5V信号测量、监测以及工业现场信号隔离及长线传输等等。 产品包括电源隔离,信号隔离、线性化,A/D转换和RS-485串行通信。每个串口最多可接255只 YL121系列模块,通讯方式采用ASCII码通讯协议或MODBUS RTU通讯协议,波特率可由代码设置,能与其他厂家的控制模块挂在同一RS-485总线上,便于计算机编程。 YL121系列产品是基于单片机的智能监测和控制系统,所有的用户设定的校准值,地址,波特率,数据格式,校验和状态等配置信息都储存在非易失性存储器EEPROM里
[嵌入式]