今天有空来继续写学习笔记。STM8片上集成了10位逐次比较型模数转换器,在开发板上有个电位器接到了AIN3,但没有可以显示数据的LED数码管或LCD液晶显示屏,怎么办呢?通过前面的学习,这个问题不难解决,在这里可以把AD采集数据通过UART发送到电脑上显示。
#i nclude
void CLK_init(void)
{
CLK_CKDIVR = 0x08; // 16M内部RC经2分频后系统时钟为8M
}
void GPIO_init(void)
{
PD_DDR = 0x08; // 配置PD端口的方向寄存器PD3输出
PD_CR1 = 0x08; // 设置PD3为推挽输出
PD_CR2 = 0x80; // 使能PD7外部中断
}
void EXTI_init(void)
{
EXTI_CR1 = 0x80; // PD口下降沿触发中断
}
#pragma vector=0x02
__interrupt void EXTI_PD7_TLI(void)
{
unsigned int value;
ADC_CSR &= ~0x80; // 清除EOC转换结束标志
ADC_CR1 |= 0x01; // 开始单次转换
while(!(ADC_CSR&0x80)); // 等待单次转换完成
value = ((int)ADC_DRH<<2); // 先读高8位,默认设置数据左对齐
value |= ADC_DRL; // 再读低8位
while(!UART3_SR_TXE);
UART3_DR = value; // 通过UART3发送AD采样结果
while(!UART3_SR_TXE);
UART3_DR = value>>8;
}
void ADC_init(void)
{
ADC_CSR = 0x03; // ADC输入引脚AIN3
ADC_CR1 = 0x01; // ADC开启
}
void UART3_init(void)
{
UART3_BRR2 = 0x01;
UART3_BRR1 = 0x34; // 8M/9600 = 0x341
UART3_CR2 = 0x0C; // 允许接收,允许发送
}
void init_devices(void)
{
asm("sim");
CLK_init();
GPIO_init();
EXTI_init();
ADC_init();
UART3_init();
asm("rim");
}
void main( void )
{
init_devices();
// 主循环里没有程序需要执行
while(1);
}
在本例中仅使用了ADC的单次转换模式,每按一次按键进行一次AD转换,并把转换结果通过UART发送,这样可以在电脑上通过超级终端或串口调试软件查看数据。
通过这次测试,还发现一个现象,如果把清除EOC转换结束标志放在读取数据之后,那么在下次启动单次转换后,EOC标志位会自动置位,此时必须人为的等待7us后才能读到正确的数据,否则只能读到上一次的转换数据,可能这是STM8的ADC与其他MCU不同之处。
关键字:IAR STM8 ADC 模数转换器
引用地址:
IAR+STM8——ADC模数转换器
推荐阅读最新更新时间:2024-03-16 15:20
STM32L0 ADC使用HAL库关于校准问题的说明
前言 最近是有一个产品用到了ADC,使用的是STM32L051 芯片,使用 STM32CubeMX 生成的代码,本来以为简简单单,但是在调用 HAL ADC校准函数的时候遇到一个问题有点疑问,度娘一下也没有找到解答,还是经过翻阅了一些资料才得到答案,特此来记录一下。 我是矜辰所致,全网同名,尽量用心写好每一系列文章,不浮夸,不将就,认真对待学知识的我们,矜辰所致,金石为开! 一、ADC 配置说明 详细的 STM32 ADC 的使用,本文不做过多说明,这个网上一搜一大把。 本文使用的是 HAL 库,直接用 STM32CubeMX 生成的代码,ADC 的配置步骤在我的另外一篇博文: 中有过介绍(发烧友小伙伴需我还没发
[单片机]
ADC前端电路的五个设计步骤
现代通信系统和测试设备常常需要尽快地将模拟信号数字化,以便在数字域中完成信号处理。但是,为模数转换器(ADC)设计变压器前端电路很有挑战性,特别是在高中频(IF)的系统中。本文总结了5个设计步骤,以帮助开发出最佳的ADC前端。这5个步骤包括:1. 了解系统和设计要求;2. 确定ADC的输入阻抗;3. 确定ADC的基本性能;4. 选择变压器及与负载匹配的无源元件;5. 对设计进行基准测试。这种设计方法简单、快捷,可以在任何应用中获得理想的性能。
第一个步骤听起很简单,但很重要,因为仅需知道特殊应用的要求就能减少迭代次数,并一开始就可以选择合适的元件,快速实现想要的性能。应该列出包括每个设计要求的清单,并设定想要的性能指标边界值,
[电源管理]
用差分放大器来驱动高速ADC
当今的世界是一个充斥着海量数据的世界。人们的生活从中获益颇多,但系统设计者面临的压力却日益增大,为模拟数字转换器(ADC)挑选合适的驱动器就是一个重要课题。作为联系现实世界和数据世界重要桥梁的ADC,往往要以数百兆赫兹的频率和高达16位的分辨率来进行采样工作。这样,选择与其相匹配的驱动器来充分发挥其潜力,就变得至关重要。高带宽、高无杂散动态范围、低噪声和低失真度已成为挑选ADC驱动器的重要指标。 差分信号的优点 目前,用来驱动ADC的方案有两种,第一种是使用变压器,第二种则是差分放大器。不过,在介绍差分放大器之前,让我们先来了解一下什么是差分信号。 简单地讲,差分信号就是两个相关信号的差值,本文介绍的是电
[模拟电子]
STM8 LCD602显示子程序
软件设计 /********************************************************************* 目 的: 建立LCD1602操作库 目标系统: 基于STM8单片机 应用软件: Cosmic CxSTM8 *********************************************************************/ #define PORT_busy PB_DDR=0x00;PB_CR1=0xff; #define busy PB_IDR #define PORT_OUT PB_DDR=0xff;PB_CR1=0xff; #define
[单片机]
STM8 嵌入式特性编程之构建你的系统时间
时间或许对一个系统来说太重要了,他是系统定时任务处理,测量度量、信号捕捉、事件记录的基础。在手机里面开机时系统会从PMU的RTC模块读取时间,作为系统一切任务的时间基准,此后就有操作系统来维护这个时间,关机的时候内存下电系统时间也会同时丢失,时间由RTC硬件驱动。这就是Android等这样完善的系统对时间的大概处理方法,他们自有非常成熟的方案去实现相应的需求。 那么低端的嵌入式平台也需要时间吗?我想很多时候这样的需求是非常必须的,比如你要测试一段代码的执行时间你会怎么做呢?或者你要定时去执行一项任务你又该如何设计?最常见的你要做一段精确到us的延时你怎么办? 不要说我每次对时间有依赖的操作我都直接去操作定时器!前辈们一直都
[单片机]
stm8的独立看门狗与窗口看门狗
STM8拥有两个硬件看门狗,分别叫做独立看门狗和窗口看门狗 独立看门狗的框图如下 我们可以看到,独立看门狗的时钟来自于LSI内部低速振荡器,经过二分频到达看门狗外设单元,在经过一个七位的预分频到达计数器,这个七位的分频由PR控制,看门狗内部使用一个八位的向下计数计数器来计数,计数到0的时候发出看门狗复位信号,同时有一个RLR可以存放看门狗的初始化值,但对KR操作的时候看门狗计数器重载RLR的数据,达到喂狗目的 所以,对看门狗的处理应该分为以下步骤 1. 关闭看门狗 2. 启动LSI系统低速时钟 3. 设置时钟的分频系数 4. 设置看门狗重载的值 5. 在没有复位之前喂狗,重新计数
[单片机]
STM8 4线驱动1602乱码
近段时间用STM8驱动1602,采用4线方式,首次上电出现乱码,现在网上找到解决方法,做此总结。 网上大佬分析,出现乱码原因是在单片机发送0x28初始化时,高4位发送就已经完成初始化,低4位发送导致出现乱码,需要延时后再初始化可解决。这位大佬提供的方法确实可以解决问题,但感觉问题应该不在这,具体原因还没得出。 #include iostm8s105k4.h #define u8 uint8_t #define u16 uint16_t #define u32 uint32_t typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef
[单片机]
ADuC812中A/D转换器的安全应用
ADuC812内集成的ADC转换模块,包含了8通道、12位、单电源 A/D转换器。这些A/D转换器由基于电容DAC的常规逐次逼近转换器组成 ,接收的模拟输入范围0~+VREF(+2.5V)。另外,此模块还为用户提供片内基准、校准特性,模块内的所 有部件能方便地通过3个寄存器SFR接口来设置。总之,ADu C812的ADC模块具有与一般ADC芯片相比拟的性能,并且操作简单、可靠性高,采集 速率可高达200 kHz。但是,ADuC812内集成的ADC转换模块有其特殊性,如果应用不适当,轻则 影响ADC的性能,重则电路完全不能工作,甚至烧毁器件。 ADuC812内A/D转换器的2.5V基准电压既可由片内提供,也可由外
[应用]