STM8学习笔记---ADC多通道采样
STM8S003单片机ADC采样通道总共有5个,从AIN2---AIN6,多通道采样时需要将ADC转换设置为单次转换模式,每次切换采样通道后,需要重新初始化 ADC,采样结果在中断中读取。
IO口初始化代码
//AD通道引脚初始化
void ADC_GPIO_Init( void )
{PD_DDR &= ~( 1 << 2 ); //PD2 设置为输入 AIN3PD_CR1 &= ~( 1 << 2 ); //PD2 设置为悬空输入PD_DDR &= ~( 1 << 3 ); //PD3 设置为输入 AIN4PD_CR1 &= ~( 1 << 3 ); //PD3 设置为悬空输入PC_DDR &= ~( 1 << 4 ); //PC4 设置为输入 AIN2PC_CR1 &= ~( 1 << 4 ); //PC4 设置为悬空输入PD_DDR &= ~( 1 << 5 ); //PD5 设置为输入 AIN5 PD_CR1 &= ~( 1 << 5 ); //PD5 设置为悬空输入PD_DDR &= ~( 1 << 6 ); //PD6 设置为输入 AIN6 PD_CR1 &= ~( 1 << 6 ); //PD6 设置为悬空输入}
将ADC的IO口都设置为输入模式,悬空输入。
下来初始化ADC功能
void ADC_CH_Init( u8 ch )
{char l = 0;ADC_CR1 = 0x00; //fADC = fMASTER/2, 8Mhz 单次转换,禁止转换ADC_CSR = ch + 1; //控制状态寄存器 选择要 AD输入通道 如:PD2(AIN3)ADC_CR2 = 0x00; //默认左对齐 读数据时先读高在读低ADC_TDRL = ( 1 << ( ch + 1 ) ); //禁止相应通道 施密特触发功能 1左移ch+1位ADC_CR1 |= 0x01; //使能ADC并开始转换ADC_CSR |= 0x20; //EOCIE 使能转换结束中断 EOC中断使能for( l = 0; l < 100; l++ ); //延时,保证ADC模块的上电完成 至少7usADC_CR1 = ADC_CR1 | 0x01; //再次将CR1寄存器的最低位置1 使能ADC 并开始转换
}
将ADC设置为单次转换模式,每次转换时需要手动将CR1寄存器最低位置1.
在中断中读取转换成功后的数据。
#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
}
中断中将转换后的采样值存储在DATAH,和DATAL中,并置位采样结束标志位ADC_flag,采样函数判断标志位为1时,就去读取ADC采样值。
采样值读取函数:
//采集PC4电压值 AIN2
u16 ReadVol_CH2( void )
{u16 voltage = 0;ADC_CH_Init( 1 );while( ADC_flag == 0 );if( ADC_flag ){ADC_flag = 0;voltage = ( DATAH << 2 ) + DATAL ; //得到十位精度的数据 0--1024//ADC_CR1 = ADC_CR1 | 0x01; // 再次将CR1寄存器的最低位置1 启动下一次转换};return voltage;
}
单片机有些引脚的功能需要通过选项字开启,通过ST Visual Programmer软件设置选项字方法如下:
在AFR7中,将选项字中将PC4设置为AIN2功能。
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 << 2 ); //PD2 设置为输入 AIN3PD_CR1 &= ~( 1 << 2 ); //PD2 设置为悬空输入PD_DDR &= ~( 1 << 3 ); //PD3 设置为输入 AIN4PD_CR1 &= ~( 1 << 3 ); //PD3 设置为悬空输入PC_DDR &= ~( 1 << 4 ); //PC4 设置为输入 AIN2PC_CR1 &= ~( 1 << 4 ); //PC4 设置为悬空输入PD_DDR &= ~( 1 << 5 ); //PD5 设置为输入 AIN5 PD_CR1 &= ~( 1 << 5 ); //PD5 设置为悬空输入PD_DDR &= ~( 1 << 6 ); //PD6 设置为输入 AIN6 PD_CR1 &= ~( 1 << 6 ); //PD6 设置为悬空输入}//ADC输入通道初始化入口参数表示通道选择
void ADC_CH_Init( u8 ch )
{char l = 0;ADC_CR1 = 0x00; //fADC = fMASTER/2, 8Mhz 单次转换,禁止转换ADC_CSR = ch + 1; //控制状态寄存器 选择要 AD输入通道 如:PD2(AIN3)ADC_CR2 = 0x00; //默认左对齐 读数据时先读高在读低ADC_TDRL = ( 1 << ( ch + 1 ) ); //禁止相应通道 施密特触发功能 1左移ch+1位ADC_CR1 |= 0x01; //使能ADC并开始转换ADC_CSR |= 0x20; //EOCIE 使能转换结束中断 EOC中断使能for( l = 0; l < 100; l++ ); //延时,保证ADC模块的上电完成 至少7usADC_CR1 = ADC_CR1 | 0x01; //再次将CR1寄存器的最低位置1 使能ADC 并开始转换
}//采集PC4电压值 AIN2
u16 ReadVol_CH2( void )
{u16 voltage = 0;ADC_CH_Init( 1 );while( ADC_flag == 0 );if( ADC_flag ){ADC_flag = 0;voltage = ( DATAH << 2 ) + DATAL ; //得到十位精度的数据 0--1024//ADC_CR1 = ADC_CR1 | 0x01; // 再次将CR1寄存器的最低位置1 启动下一次转换};return voltage;
}//采集PD2电压值 AIN3
u16 ReadVol_CH3( void )
{u16 voltage = 0;ADC_CH_Init( 2 );while( ADC_flag == 0 );if( ADC_flag ){ADC_flag = 0;voltage = ( DATAH << 2 ) + DATAL ;//ADC_CR1 = ADC_CR1 | 0x01; //当通道不需要切换时,只需初始化一次,以后每次读取完数据后,需要手动开启下一次转换};return voltage;
}
//采集PD3电压值 AIN4
u16 ReadVol_CH4( void )
{u16 voltage = 0;ADC_CH_Init( 3 );while( ADC_flag == 0 );if( ADC_flag ){ADC_flag = 0;voltage = ( DATAH << 2 ) + DATAL ; //得到十位精度的数据 0--1024//ADC_CR1 = ADC_CR1 | 0x01; // 再次将CR1寄存器的最低位置1 启动下一次转换};return voltage;
}//采集PD5电压值 AIN5
u16 ReadVol_CH5( void )
{u16 voltage = 0;ADC_CH_Init( 4 );if( ADC_flag ){ADC_flag = 0;voltage = ( DATAH << 2 ) + DATAL ; //得到十位精度的数据 0--1024//ADC_CR1 = ADC_CR1 | 0x01; //再次将CR1寄存器的最低位置1 启动下一次转换};return voltage;
}//采集PD6电压值 AIN6
u16 ReadVol_CH6( void )
{u16 voltage = 0;ADC_CH_Init( 5 );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
}
主函数代码如下:
#include "iostm8s103F3.h"
#include "main.h"
#include "led.h"
#include "adc.h"
#include "delay.h"u16 val_ch2 = 0, val_ch3 = 0, val_ch4 = 0, val_ch5 = 0, val_ch6 = 0;void SysClkInit( void )
{CLK_SWR = 0xe1; //HSI为主时钟源 16MHz CPU时钟频率CLK_CKDIVR = 0x00; //CPU时钟0分频,系统时钟0分频
}void main( void )
{u8 i=0;__asm( "sim" ); //禁止中断SysClkInit();delay_init( 16 );LED_GPIO_Init();ADC_GPIO_Init();__asm( "rim" ); //开启中断while( 1 ){LED = ~LED; //通道切换后,采样的第一笔数据仍然为上一通道的数据for(i=0;i<10;i++)val_ch2 = ReadVol_CH2();delay_ms( 100 );for(i=0;i<10;i++)val_ch3 = ReadVol_CH3();delay_ms( 100 );for(i=0;i<10;i++)val_ch4 = ReadVol_CH4();delay_ms( 100 );for(i=0;i<10;i++)val_ch5 = ReadVol_CH5();delay_ms( 100 );for(i=0;i<10;i++)val_ch6 = ReadVol_CH6();delay_ms( 100 ); }
}
STM8学习笔记---ADC多通道采样相关推荐
- STM8学习笔记---ADC平均值采样和有效值采样算法分析
目录 平均值采样: 采样数据分析: 采样时间分析: 有效值采样: 采样数据分析: 采样时间分析: 结论: 在开关电源中,电流采样是非常重要的.常用的电流采样计算方法有平均值采样法和有效值采样法.现将这 ...
- 嵌入式学习笔记——ADC模数转换器
ADC模数转换器 前言 ADC介绍 ADC概述 ADC的数量 ADC的特性 ADC框图 芯片外部框图 芯片内部框图 转换部分框图 状态输出部分 条件触发框图 寄存器介绍 编程思路 模式选择 规则通道的 ...
- 新唐芯片学习笔记——ADC
新唐芯片学习笔记--ADC 概述 NuMicro®NUC029xAN 包含一个12位逐次逼近型模数转换器(SAR A/D转换器) ,包含8个输入通道:NuMicro®NUC029FAE 包含一个10位 ...
- STM8学习笔记----普通IO口模拟串口功能
串口在产品应用中很常见,但是单片机的默认带的串口往往比较少,有时候就会出现串口不够用,所以就想着能不能用普通IO口模拟串口来实现串口的功能. 要模拟串口首先要清楚串口数据传输过程中的原理. 常用的串口 ...
- STM32自学笔记ADC多通道扫描
STM cubemx STM32F1 ADC多通道采集(非DMA) ADC模式介绍: 扫描模式: 多通道采集必须开启,这一项CUBE已经默认设置好了.这个模式就是自动扫描你开启的所有通道进行转换,直至 ...
- 电机学习笔记 ADC dma 电流电压采集
分析 在电机驱动电路中串入一个 0.02Ω.2W 的采样电阻,将电流信号 转换成电压信号,再经过隔离运放放大 8 倍后差分输出,使用普通运放将差分输出转换成单端输 出给 STM32 的 ADC 采样通 ...
- HAL库学习笔记ADC篇----ADC多通道连续转换+DMA方式
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.Cube配置(F407VET6) 二.使用步骤 1. 代码总览 2.代码注意事项以及解析 总结 前言 第一次写,无 ...
- stm32学习笔记---ADC电压采集
1. ①电压输入范围 ADC 输入范围为:VREF- ≤ VIN ≤ VREF+.由 VREF-.VREF+ .VDDA .VSSA.这四个外部 引脚决定. 我们在设计原理图的时候一般把 VSSA ...
- STM8学习笔记---NTC热敏电阻的使用
温度采集是产品开发过程中必不可少的,读取温度的方法有很多种,有专用温度采集芯片,温度传感器,热敏电阻等,各种方法来获取温度.今天总结一下使用热敏电阻来采集温度. 先看看热敏电阻的概念 也就是将温度变化 ...
最新文章
- MySQL5.7配置日志
- [bzoj3673/3674可持久化并查集加强版]
- CouldNOTfindQt4 install qt4-dev-tools qt4-doc qt4-qtconfig qt4-demos qt4-designer
- pyrealsense2 sensor.get_supported_options()(获取当前sensor支持的参数)
- 阿里、美团、拼多多、网易大厂面试之Redis+多线程+JVM+微服务...
- Centos7.x Hadoop 3.x HDFS 写入文件
- jwt 私钥_三分钟带你了解JWT认证
- 融合智能将成时代方舟?中科创达技术大会向未来答疑
- linux5.8下oracle10g安装和配置详解
- AD18安装教程 附软件安装包和汉化包
- Python | GUI | Tkinter - 1. 基本控件
- C语言实现2048游戏(分文件编译)
- 大数据需要学习什么?
- Java 图片加水印
- 【转】PHP网站(nginx、php-fpm、mysql) 用户权限解析
- 小米3c路由器拆机_路由器也智能,小米路由器3C使用心得 - IT168试客
- 音频均衡器 matlab code,急求高手 设计声音均衡器 滤波器
- HP D380 G9 改IP地址
- 2020icpc上海(重温经典)
- 推荐一些必看的计算机书籍。