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平均值采样和有效值采样算法分析
推荐阅读最新更新时间:2024-11-07 10:13
推荐帖子
- AC101网络接口电路图
- AC101网络接口电路图AC101网络接口电路图
- klanlan 工控电子
- 精确测量nA级别微弱电流的开源方案
- 最近遇到如何精确测量nA级电流的问题,一般的手持万用表是难以达到这个要求的,且非常昂贵。那么有没有一种低成本的方法呢?答案是肯定的,采用电流放大+4位半万用表就可以实现,有没有大神组个团做几套的均摊下成本。下面是一个开源的微弱电流放大方案μCurrentGOLD:AProfessionalPrecisionCurrentAdapterforMultimeters.TheμCurrentturnsyourmultimeter(oroscillosc
- dql2016 stm32/stm8
- 大家来啊
- 本版希望游客多多支持学生,老师,专业人士多来顶啊大家来啊一顶一顶Re:大家来啊看到斑竹的呼唤~也许这是斑竹苦心经营的一大败笔~怎么才能让现实有所改观?7月中旬就开始追问的斑竹,现在想到什么好主意了没有?还是由有所希望已经步入无可奈何的现在呢?~Re:大家来啊这么好的论坛真是不多见.永远支持版主,支持论坛.版主大学是学什么专业的啊?真不知道还要学多长时间才能达到版主的水平哦Re:大家来啊会常来这里的,这里很亲切!Re:大家来啊
- fighting 模拟电子
- 学习PCB制作流程
- 本帖最后由jameswangsynnex于2015-3-320:01编辑PCB加工工PCB(印刷电路板)的原料是玻璃纤维,这种材料我们在日常生活中出处可见,比如防火布、防火毡的核心就是玻璃纤维,玻璃纤维很容易和树脂相结合,我们把结构紧密、强度高的玻纤布浸入树脂中,硬化就得到了隔热绝缘、不易弯曲的PCB基板了--如果把PCB板折断,边缘是发白分层,足以证明材质为树脂玻纤。光是绝缘板我们不可能传递电信号,于是需要在表面覆铜。所以我们把PCB板也称之为覆铜基板。在工厂里,常
- gqq890611 移动便携
- 玻璃盖板知识大全
- 玻璃盖板知识大全,大家看看用的上不!玻璃盖板知识大全
- Jason.D 传感器
- 请问这种LLC 谐振电路问题
- 这种半桥LLC谐振电路的变压器是怎么进行设计的呢?除了输入输出电压和功率参数,还要考虑哪些因素请问这种LLC谐振电路问题
- kal9623287 电源技术
设计资源 培训 开发板 精华推荐
- 具有低漂移满量程微调的 LT1021BMH-5 CMOS DAC 基准的典型应用
- 【已验证】莱曼耳放(纯放大板)
- AM2G-2409SZ 9V 2W DC/DC 转换器的典型应用
- LT3755EUD-1 50W 白光 LED 头灯驱动器的典型应用电路
- AM3G-1205DZ ±5V 3 瓦 DC 至 DC 转换器的典型应用
- EEPROM28_MS51
- 使用 Analog Devices 的 LT1117CM 的参考设计
- 使用 ROHM Semiconductor 的 BD5357 的参考设计
- LM2904EDR2G 维恩桥振荡器的典型应用
- EVAL-ADAU7002Z,使用 ADAU7002 TDM 数据转换的评估板