STM8单片机ADC支持5种转换模式:单次模式,连续模式,带缓存的连续模式,单次扫描模式,连续扫描模式。
单次模式
在单次转换模式中,ADC仅在由ADC_CSR寄存器的CH[3:0]选定的通道上完成一次转换。该模式是在当CONT位为0时通过置位ADC_CR1寄存器的ADON位来启动的。
一旦转换完成,转换后的数据存储在ADC_DR寄存器中,EOC(转换结束)标志被置EOCIE 被置位将产生一个中断。
其中ADC结果的读取可以采用查询模式也可以采用中断模式。
查询模式代码如下:
#include "adc.h"
#include "main.h"
u16 DATAH = 0; //ADC转换值高8位
u16 DATAL = 0; //ADC转换值低8位
_Bool ADC_flag = 0; //ADC转换成功标志
//AD通道引脚初始化
void ADC_GPIO_Init( void )
{
PD_DDR &= ~( 1 << 3 ); //PD3 设置为输入 电流
PD_CR1 &= ~( 1 << 3 ); //PD3 设置为悬空输入
}
/*
ch 为ADC对应通道
通过置位ADC_CR1寄存器的ADN位来开启ADC。当第一次置位ADON时,ADC从低功耗模式唤醒。
为了启动转换必须第二次使用写指令来置位ADON位。
在转换结束时,ADC会保持在上电状态,用户只需要置位ADON位一次来启动下一次转换。
转换完成后,转换数据存储在ADC_DR寄存器中,EOC(转换结束)标志被置位,如果EOCIE被置位将产生一个中断
ADC输入通道初始化入口参数表示通道选择
*/
void ADC_CH_Init( u8 ch )
{
char l = 0;
ADC_CR1 = 0x00; //fADC = fMASTER/2, 8Mhz 单次转换,禁止转换
ADC_CSR = ch ; //控制状态寄存器 选择要 AD输入通道 如:PD2(AIN3)
ADC_CR2 = 0x00; //默认左对齐 读数据时先读高在读低
ADC_TDRL = ( 1 << ch ); //禁止相应通道 施密特触发功能 1左移ch+1位
ADC_CR1 |= 0x01; //使能ADC并开始转换
//ADC_CSR |= 0x20; //EOCIE 使能转换结束中断 EOC中断使能
for( l = 0; l < 100; l++ ); //延时,保证ADC模块的上电完成 至少7us
ADC_CR1 = ADC_CR1 | 0x01; //再次将CR1寄存器的最低位置1 使能ADC 并开始转换
}
//采集PD2电压值
u16 ReadVol_CH3( void )
{
u16 voltage = 0;
while( ( ADC_CSR & 0x80 ) == 0 ); //等待转换结束
if( ADC_CSR & 0x80 )
{
DATAH = ADC_DRH; // 读出ADC结果的高8位
DATAL = ADC_DRL; // 读出ADC结果的低8位
voltage = ( DATAH << 2 ) + DATAL ; //得到十位精度的数据 0--1024
ADC_CR1 = ADC_CR1 | 0x01; //再次将CR1寄存器的最低位置1 启动下一次转换
ADC_CSR &= 0x7F;
};
return voltage;
}
中断模式代码如下:
#include "adc.h"
#include "main.h"
u16 DATAH = 0; //ADC转换值高8位
u16 DATAL = 0; //ADC转换值低8位
_Bool ADC_flag = 0; //ADC转换成功标志
//AD通道引脚初始化
void ADC_GPIO_Init( void )
{
PD_DDR &= ~( 1 << 3 ); //PD3 设置为输入 电流
PD_CR1 &= ~( 1 << 3 ); //PD3 设置为悬空输入
}
/*
ch 为ADC对应通道
通过置位ADC_CR1寄存器的ADON位来开启ADC。当第一次置位ADON时,ADC从低功耗模式唤醒。
为了启动转换必须第二次使用写指令来置位ADON位。
在转换结束时,ADC会保持在上电状态,用户只需要置位ADON位一次来启动下一次转换。
转换完成后,转换数据存储在ADC_DR寄存器中,EOC(转换结束)标志被置位,如果EOCIE被置位将产生一个中断
ADC输入通道初始化入口参数表示通道选择
*/
void ADC_CH_Init( u8 ch )
{
char l = 0;
ADC_CR1 = 0x00; //fADC = fMASTER/2, 8Mhz 单次转换,禁止转换
ADC_CSR = ch ; //控制状态寄存器 选择要 AD输入通道 如:PD2(AIN3)
ADC_CR2 = 0x00; //默认左对齐 读数据时先读高在读低
ADC_TDRL = ( 1 << ch ); //禁止相应通道 施密特触发功能 1左移ch+1位
ADC_CR1 |= 0x01; //使能ADC并开始转换
ADC_CSR |= 0x20; //EOCIE 使能转换结束中断 EOC中断使能
for( l = 0; l < 100; l++ ); //延时,保证ADC模块的上电完成 至少7us
ADC_CR1 = ADC_CR1 | 0x01; //再次将CR1寄存器的最低位置1 使能ADC 并开始转换
}
//采集PD3电压值
u16 ReadVol_CH3( void )
{
static u16 voltage = 0;
if( ADC_flag )
{
ADC_flag = 0;
voltage = ( DATAH << 2 ) + DATAL ; //得到十位精度的数据 0--1024
ADC_CR1 = ADC_CR1 | 0x01; //再次将CR1寄存器的最低位置1 启动下一次转换
};
return voltage;
}
//AD中断服务函数 中断号22
#pragma vector = 24 // IAR中的中断号,要在STVD中的中断号上加2
__interrupt void ADC_Handle( void )
{
ADC_CSR &= ~0x80; // 转换结束标志位清零 EOC
//默认左对齐 读数据时先读高高8位 再读低8位
DATAH = ADC_DRH; // 读出ADC结果的高8位
DATAL = ADC_DRL; // 读出ADC结果的低8位
ADC_flag = 1; // ADC中断标志 置1
}
上一篇:STM8 ADC转换模式-------连续模式
下一篇:STM8学习笔记---ADC平均值采样和有效值采样算法分析
推荐阅读
史海拾趣
Electrocube Inc公司高度重视产品质量管理。公司建立了严格的质量管理体系,从原材料采购到生产流程控制,再到产品检验和售后服务,每一个环节都严格把关。这种对质量的执着追求,使得Electrocube Inc公司的产品具有极高的可靠性和稳定性,赢得了客户的信赖和好评。
随着技术的不断进步和市场需求的日益增长,EUDYNA开始实施全球化战略。公司不仅在全球范围内建立了多个研发中心和生产基地,还积极拓展海外市场,与众多国际知名企业建立了紧密的合作关系。EUDYNA的全球化战略不仅为公司带来了更广阔的市场空间,也进一步提升了其品牌影响力和竞争力。
在质量管理方面,ALD始终坚持以客户为中心的原则,不断完善其质量体系。公司建立了严格的质量控制流程,从原材料采购到产品生产的每一个环节都进行严格把关。同时,ALD还引入了先进的质量检测设备和方法,确保每一片集成电路都符合客户的要求和标准。这些措施不仅提高了产品的质量和可靠性,还赢得了客户的信任和好评。
以上五个故事均基于ALD在电子行业中的发展事实进行构建,旨在展示公司在技术创新、产品线拓展、封装技术创新、国际化战略推进以及质量体系完善等方面的努力和成就。这些故事不包含任何主观评价,仅是对事实的客观描述。
“创新动力”是Discrete Semiconductor Industries公司中一家以创新驱动发展的典范。该公司注重研发投入,积极引进和培养科技人才,建立了完善的研发体系。通过不断的技术创新和产品升级,创新动力不断推出具有市场竞争力的新产品。同时,公司还积极探索新的应用领域和市场机会,不断拓展业务范围。这种创新驱动的发展战略使得创新动力在激烈的市场竞争中保持了强劲的发展势头。
随着产品质量的提升和市场口碑的积累,Ametherm公司开始积极拓展国内外市场。他们与多家知名企业建立了合作关系,将产品应用于各种电子设备中。同时,公司还积极参加国际电子展会,与全球客户进行交流与合作。这些举措使得Ametherm的品牌影响力逐渐扩大,市场份额也稳步提升。
身在嵌入式领域做设计的我们,是不是有时也会爆出这样的疑问:究竟什么是嵌入式?嵌入式未来几年将如何发展?目前市场最火的嵌入式应用有哪些?最新的嵌入式技术又包括什么?还有哪些是我们未曾想到的? 本期的专题,将携嵌入式领域诸多大 ...… 查看全部问答∨ |
|
一家从事数字移动电视,宽带网络等产品开发的大型欧洲企业招聘硬件工程师,高级硬件工程师,Leader.工作职责包括: 客户需求分析; ?产品具体硬件技术规范的制定; ?完成复杂的技术模块的可行性研究,管理各种硬件设计工作,如:原理图设计,PCB ...… 查看全部问答∨ |
|
请问如果使用AXD和仿真器调试,板子的flash上要先烧boot么? 我每次都要先烧一个boot来初始化CPU,才能用AXD和仿真器调试其他程序。 是不是一定要烧BOOT呢? 我想如果仿真器连上芯片,应该和板子上的程序无关才对啊~… 查看全部问答∨ |
有没有domino中用ajax生成树形部门选择对话框的代码? 因人数较多时,一次显示出来有点慢,就像eeworld那样的,点击时异步计算下级菜单并显示出来。在domino中做出来的朋友提供一下,谢谢! 给出方案的送100分。… 查看全部问答∨ |
请问一下 OKI 1190C 针孔打印机 能不能旋转180度打印,我向打印的是 超市的标价签,有没有什么外部驱动什么的,打印机设置里面根本没有反转打印这一项,那位能帮个忙吗?… 查看全部问答∨ |
我现在使用的是STM8s103单片机,哪位大侠有这款单片机的捕获功能的例子,如果是用库函数写的程序就不用了,因为初学这个cpu所以想参考下,希望各位大侠帮个忙。。。。。。。我的邮箱307179045@qq.com… 查看全部问答∨ |