STM8单片机ADC支持5种转换模式:单次模式,连续模式,带缓存的连续模式,单次扫描模式,连续扫描模式。
连续扫描模式
该模式和单次扫描模式相近,只是每一次在最后通道转换完成时,一次新的从通道0到通道n扫描转换会自动开始。如果某个数据缓存寄存器在被读走之前被覆盖,OVR标志将置1。
连续扫描模式是在当SCAN位和CONT位已被置时,通过置位ADON位来启动的。
在转换序列正在进行过程中不要清零SCAN位。
连续扫描模式可以通过清零ADON位来立即停止。另外一种选择就是当转换过程中清除CONT位那么转换会在下一次的最后一个通道转换完成时停止。
注意:在扫描模式中,不要使用位操作指令 (BRES) 去清除 EOC 标志位,这是因为该指令是对整个ADC_CSR 寄存器的一个读 - 修改 - 写操作。从 CH[3:0] 寄存器中读取当前的通道编号和写回器,将会改变扫描系列的最后通道编号。
在连续扫描模式中正确的清除 EOC 标志位的方法是从一个 RAM 变量中载入一个字节到ADC_CSR寄存器,这样来清除EOC 标志位同时还重新载入扫描系列新的最后通道编号。
读取转换结果的时候可以通过查询方式,也可以通过中断的方式,
连续扫描模式通过查询方式读取数据代码:
#include "adc.h"
#include "main.h"
#include "led.h"
_Bool ADC_flag = 0; //ADC转换成功标志
u16 ADC_DB[10] = {0};
u16 adc_data[5] = {0};
//AD通道引脚初始化
void ADC_GPIO_Init( void )
{
PD_DDR &= ~( 1 << 2 ); //PD2 设置为输入
PD_CR1 &= ~( 1 << 2 ); //PD2 设置为悬空输入
PD_DDR &= ~( 1 << 3 ); //PD3 设置为输入
PD_CR1 &= ~( 1 << 3 ); //PD3 设置为悬空输入
PC_DDR &= ~( 1 << 4 ); //PC4 设置为输入
PC_CR1 &= ~( 1 << 4 ); //PC4设置为悬空输入
}
//设置为 连续扫描模式
//ch 为ADC通道 连续转换AIN0---AINch 通道的数据
void ADC_CH_Init( u8 ch )
{
char l = 0;
ADC_GPIO_Init();
ADC_CR1 &= ~( 7 << 4 ); //预分频 2
ADC_CR2 &= ~( 1 << 6 ); //不使用外部触发
//禁止 AIN2 AIN4 的施密特触发器,降低 IO 静态功耗 PD5,PD6 上的通道如果施密特方式禁用会导致串口无法收发数据!
ADC_TDRL |= ( 1 << 2 );
ADC_TDRL |= ( 1 << 4 );
ADC_CR1 |= ( 1 << 1 ); //连续转换
ADC_CSR |= 0x04; //配置通道号最大的那个
ADC_CR2 |= ( 1 << 3 ); //右对齐
ADC_CR1 |= ( 1 << 0 ); //开启 ADC
ADC_CR2 |= ( 1 << 1 ); // SCAN = 1 开启扫描模式
//当首次置位ADON位时,ADC从低功耗模式唤醒。为了启动转换必须第二次使用写指令来置位ADC_CR1寄存器的ADON位。
for( l = 0; l < 10; l++ ); //延时,保证ADC模块的上电完成 至少7us
ADC_CR1 |= ( 1 << 0 ); //再次将CR1寄存器的最低位置1 使能ADC 并开始转换
}
/*
注意:在扫描模式(连续扫描模式)中,不要使用位操作指令(BRES)去清除EOC标志位,
这是因为该指令是对整个ADC_CSR寄存器的一个读-修改-写操作。
从CH[3:0]寄存器中读取当前的通道编号和写回该寄存器,将会改变扫描系列的最后通道编号。
在连续扫描模式中正确的清除EOC标志位的方法是 个RAM变量中载入一个字节到ADC_CSR寄存器,
这样来清除EOC标志位同时还重新载入扫描系列新的最后通道编号。
实验发现,位操作指令只在连续扫描模式中会清除CH[3:0]寄存器中的值,但并不影响其他值。
因此将ADC_CSR中的值读出,再将CH[3:0]中原来通道号加入进去,最后重新写入ADC_CSR中即可。写法如下:
ADC1->CSR = (uint8_t)(ADC1->CSR &(~ADC1_FLAG_EOC)|ADC1_CHANNEL_n);
注:ADC1_CHANNEL_n表示扫描到那个通道结束。
*/
u16 ain2_val = 0,ain3_val = 0,ain4_val = 0;
//读取采样电压值
u16 ReadVol_CHx( void )
{
u16 voltage = 0;
u16 temph = 0;
u8 templ = 0;
while( 1 )
{
LED = !LED; //程序运行一圈耗时 10us
while( ( ADC_CSR & 0x80 ) == 0 ); //等待转换结束
//ADC_CSR &= ~( 1 << 7 ); // 不能通过位操作来清零 EOC 标志
ADC_CSR = ADC_CSR & 0x7F | 0x04; // 转换结束标志位清零 EOC
//读取 AIN2 的值
templ = ADC_DB2RL;
temph = ADC_DB2RH;
temph = ( u16 )( templ | ( u16 )( temph << ( u16 )8 ) );
ain2_val = temph;
//读取 AIN3 的值
templ = ADC_DB3RL;
temph = ADC_DB3RH;
temph = ( u16 )( templ | ( u16 )( temph << ( u16 )8 ) );
ain3_val = temph;
//读取 AIN4 的值
templ = ADC_DB4RL;
temph = ADC_DB4RH;
temph = ( u16 )( templ | ( u16 )( temph << ( u16 )8 ) );
ain4_val = temph;
}
return voltage;
}
连续扫描模式通过中断方式读取数据代码:
#include "adc.h"
#include "main.h"
#include "led.h"
_Bool ADC_flag = 0; //ADC转换成功标志
u16 ADC_DB[10] = {0};
u16 adc_data[5] = {0};
//AD通道引脚初始化
void ADC_GPIO_Init( void )
{
PD_DDR &= ~( 1 << 2 ); //PD2 设置为输入
PD_CR1 &= ~( 1 << 2 ); //PD2 设置为悬空输入
PD_DDR &= ~( 1 << 3 ); //PD3 设置为输入
PD_CR1 &= ~( 1 << 3 ); //PD3 设置为悬空输入
PC_DDR &= ~( 1 << 4 ); //PC4 设置为输入
PC_CR1 &= ~( 1 << 4 ); //PC4设置为悬空输入
}
//设置为 连续扫描模式
//ch 为ADC通道 连续转换AIN0---AINch 通道的数据
void ADC_CH_Init( u8 ch )
{
char l = 0;
ADC_GPIO_Init();
ADC_CR1 &= ~( 7 << 4 ); //预分频 2
ADC_CR2 &= ~( 1 << 6 ); //不使用外部触发
//禁止 AIN2 AIN4 的施密特触发器,降低 IO 静态功耗 PD5,PD6 上的通道如果施密特方式禁用会导致串口无法收发数据!
ADC_TDRL |= ( 1 << 2 );
ADC_TDRL |= ( 1 << 4 );
ADC_CR1 |= ( 1 << 1 ); //连续转换
ADC_CSR |= 0x04; //配置通道号最大的那个
ADC_CR2 |= ( 1 << 3 ); //右对齐
ADC_CR1 |= ( 1 << 0 ); //开启 ADC
ADC_CR2 |= ( 1 << 1 ); // SCAN = 1 开启扫描模式
ADC_CSR |= ( 1 << 5 ); //EOCIE 使能转换结束中断
//当首次置位ADON位时,ADC从低功耗模式唤醒。为了启动转换必须第二次使用写指令来置位ADC_CR1寄存器的ADON位。
for( l = 0; l < 10; l++ ); //延时,保证ADC模块的上电完成 至少7us
ADC_CR1 |= ( 1 << 0 ); //再次将CR1寄存器的最低位置1 使能ADC 并开始转换
}
/*
注意:在扫描模式(连续扫描模式)中,不要使用位操作指令(BRES)去清除EOC标志位,
这是因为该指令是对整个ADC_CSR寄存器的一个读-修改-写操作。
从CH[3:0]寄存器中读取当前的通道编号和写回该寄存器,将会改变扫描系列的最后通道编号。
在连续扫描模式中正确的清除EOC标志位的方法是 个RAM变量中载入一个字节到ADC_CSR寄存器,
这样来清除EOC标志位同时还重新载入扫描系列新的最后通道编号。
实验发现,位操作指令只在连续扫描模式中会清除CH[3:0]寄存器中的值,但并不影响其他值。
因此将ADC_CSR中的值读出,再将CH[3:0]中原来通道号加入进去,最后重新写入ADC_CSR中即可。写法如下:
ADC1->CSR = (uint8_t)(ADC1->CSR &(~ADC1_FLAG_EOC)|ADC1_CHANNEL_n);
注:ADC1_CHANNEL_n表示扫描到那个通道结束。
*/
u16 ain2_val = 0, ain3_val = 0, ain4_val = 0;
u16 temph = 0;
u8 templ = 0;
//AD中断服务函数 中断号22
#pragma vector = 24 // IAR中的中断号,要在STVD中的中断号上加2
__interrupt void ADC_Handle( void )
{
LED = !LED; //程序运行一圈耗时 14us
//ADC_CSR &= ~( 1 << 7 ); // 不能通过位操作来清零 EOC 标志
ADC_CSR = ADC_CSR & 0x7F | 0x04; // 转换结束标志位清零 EOC
//单通道扫描模式,转换结果存储在 ADC_DBxR 寄存器中
//读取 AIN2 的值
templ = ADC_DB2RL;
temph = ADC_DB2RH;
temph = ( u16 )( templ | ( u16 )( temph << ( u16 )8 ) );
ain2_val = temph;
//读取 AIN3 的值
templ = ADC_DB3RL;
temph = ADC_DB3RH;
temph = ( u16 )( templ | ( u16 )( temph << ( u16 )8 ) );
ain3_val = temph;
//读取 AIN4 的值
templ = ADC_DB4RL;
temph = ADC_DB4RH;
temph = ( u16 )( templ | ( u16 )( temph << ( u16 )8 ) );
ain4_val = temph;
ADC_flag = 1; // ADC中断标志 置1
}
上一篇:STM8输出PWM变频时波形断开解决方法
下一篇:STM8 ADC转换模式-------单次扫描模式
推荐阅读
史海拾趣
进入21世纪,“General Microcircuits”开始实施全球化战略,先后在美国、欧洲、亚洲等地建立研发中心和生产基地。通过全球化布局,公司不仅能够更快地响应不同地区的市场需求,还能充分利用各地的资源优势和技术优势,进一步提升产品的竞争力和市场占有率。同时,公司还加强了与国际知名电子制造商的战略合作,共同推动半导体技术的创新与发展。
常忆科技股份有限公司,始创于1995年,总部位于台湾。在电子行业的发展历程中,常忆科技以其专注于IC设备制造领域的执着和创新能力,逐渐崭露头角。公司成立之初,便致力于开发P型晶体管非挥发性内存,由pFlash和pFusion两个事业单位组成,分别负责不同方面的工作。pFlash专注于开发和生产标准型NOR内存,而pFusion则负责向晶圆代工厂及IC设计公司提供嵌入式非挥发内存的生产技术及知识产权,并提供定制化设计及技术咨询服务。
随着消费电子产品、电脑及周边设备、无线通讯和网络装置等领域的快速发展,常忆科技的产品得到了广泛应用。公司凭借其卓越的技术和产品质量,逐渐在市场上占据了一席之地,为后续的蓬勃发展奠定了坚实基础。
随着科技的飞速发展,常忆科技深知技术创新的重要性。因此,公司不断加大研发投入,引进和培养了一批高素质的研发人员。这些研发人员致力于开发新型的非挥发性内存技术,以满足市场对于更高性能、更低功耗和更小体积的需求。
经过多年的努力,常忆科技成功研发出了一系列具有自主知识产权的新型内存产品。这些产品不仅性能卓越,而且具有极高的可靠性,赢得了众多客户的青睐。技术创新和产品升级成为常忆科技在电子行业中脱颖而出的关键因素。
面对日益激烈的市场竞争和技术变革,Carling Technologies始终保持着对技术创新的热情。公司投入大量资源进行产品研发和技术升级,推出了一系列具有创新性和高性能的产品。例如,在数据通信/电信领域,公司提供了全系列的创新型高性能、可靠的液压磁力断路器,满足了市场对高效、稳定产品的需求。这些技术创新和产品升级不仅提升了公司的竞争力,也为客户提供了更好的解决方案。
以上五个故事是基于Carling Technologies公司的发展历程和常识进行的概述,旨在描述其在电子行业中的发展和成就。请注意,这些故事是基于现有信息和常识的推测,并不代表公司实际发展的具体细节。如果您需要更详细的信息或故事,建议您查阅公司官方网站、新闻稿或相关行业报告。
面对全球电子行业的激烈竞争,FINECHIPS公司意识到供应链优化的重要性。公司积极调整供应链策略,与全球领先的半导体制造商和原材料供应商建立长期稳定的合作关系,确保原材料的稳定供应和成本控制。同时,FINECHIPS还在全球范围内设立生产基地和研发中心,实现本地化生产和快速响应市场需求,进一步提升了公司的全球竞争力。
在电子行业的初期,BELLING LEE公司以其对新技术的敏锐洞察力和强大的研发能力脱颖而出。公司投入大量资源研发出了一款具有革命性的高效能电子芯片,这一创新产品不仅提高了电子设备的性能,还大大降低了能耗。凭借这一技术突破,BELLING LEE公司迅速在电子市场上获得了认可,并逐渐建立起自己的市场地位。
用quartus 2编译一下程序:LIBRARY ieee;USE ieee.std_logic_1164.ALL;ENTITY seg7dec IS PORT(bcdin : IN std_logic_vector(3 DOWNTO 0); segout : OUT std_logic_vector(6 DOWNTO 0));END seg7 ...… 查看全部问答∨ |
|
例如: 1、_stext是什么意思? 2、这个地址可能改吗?如果程序里有BOOTLOADER是不是要改。 3、typedef void @far (*interrupt_handler_t)(void);是什么意 ...… 查看全部问答∨ |