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多通道采样相关推荐

  1. STM8学习笔记---ADC平均值采样和有效值采样算法分析

    目录 平均值采样: 采样数据分析: 采样时间分析: 有效值采样: 采样数据分析: 采样时间分析: 结论: 在开关电源中,电流采样是非常重要的.常用的电流采样计算方法有平均值采样法和有效值采样法.现将这 ...

  2. 嵌入式学习笔记——ADC模数转换器

    ADC模数转换器 前言 ADC介绍 ADC概述 ADC的数量 ADC的特性 ADC框图 芯片外部框图 芯片内部框图 转换部分框图 状态输出部分 条件触发框图 寄存器介绍 编程思路 模式选择 规则通道的 ...

  3. 新唐芯片学习笔记——ADC

    新唐芯片学习笔记--ADC 概述 NuMicro®NUC029xAN 包含一个12位逐次逼近型模数转换器(SAR A/D转换器) ,包含8个输入通道:NuMicro®NUC029FAE 包含一个10位 ...

  4. STM8学习笔记----普通IO口模拟串口功能

    串口在产品应用中很常见,但是单片机的默认带的串口往往比较少,有时候就会出现串口不够用,所以就想着能不能用普通IO口模拟串口来实现串口的功能. 要模拟串口首先要清楚串口数据传输过程中的原理. 常用的串口 ...

  5. STM32自学笔记ADC多通道扫描

    STM cubemx STM32F1 ADC多通道采集(非DMA) ADC模式介绍: 扫描模式: 多通道采集必须开启,这一项CUBE已经默认设置好了.这个模式就是自动扫描你开启的所有通道进行转换,直至 ...

  6. 电机学习笔记 ADC dma 电流电压采集

    分析 在电机驱动电路中串入一个 0.02Ω.2W 的采样电阻,将电流信号 转换成电压信号,再经过隔离运放放大 8 倍后差分输出,使用普通运放将差分输出转换成单端输 出给 STM32 的 ADC 采样通 ...

  7. HAL库学习笔记ADC篇----ADC多通道连续转换+DMA方式

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.Cube配置(F407VET6) 二.使用步骤 1. 代码总览 2.代码注意事项以及解析 总结 前言 第一次写,无 ...

  8. stm32学习笔记---ADC电压采集

    1.  ①电压输入范围 ADC 输入范围为:VREF- ≤ VIN ≤ VREF+.由 VREF-.VREF+ .VDDA .VSSA.这四个外部 引脚决定. 我们在设计原理图的时候一般把 VSSA ...

  9. STM8学习笔记---NTC热敏电阻的使用

    温度采集是产品开发过程中必不可少的,读取温度的方法有很多种,有专用温度采集芯片,温度传感器,热敏电阻等,各种方法来获取温度.今天总结一下使用热敏电阻来采集温度. 先看看热敏电阻的概念 也就是将温度变化 ...

最新文章

  1. MySQL5.7配置日志
  2. [bzoj3673/3674可持久化并查集加强版]
  3. CouldNOTfindQt4 install qt4-dev-tools qt4-doc qt4-qtconfig qt4-demos qt4-designer
  4. pyrealsense2 sensor.get_supported_options()(获取当前sensor支持的参数)
  5. 阿里、美团、拼多多、网易大厂面试之Redis+多线程+JVM+微服务...
  6. Centos7.x Hadoop 3.x HDFS 写入文件
  7. jwt 私钥_三分钟带你了解JWT认证
  8. 融合智能将成时代方舟?中科创达技术大会向未来答疑
  9. linux5.8下oracle10g安装和配置详解
  10. AD18安装教程 附软件安装包和汉化包
  11. Python | GUI | Tkinter - 1. 基本控件
  12. C语言实现2048游戏(分文件编译)
  13. 大数据需要学习什么?
  14. Java 图片加水印
  15. 【转】PHP网站(nginx、php-fpm、mysql) 用户权限解析
  16. 小米3c路由器拆机_路由器也智能,小米路由器3C使用心得 - IT168试客
  17. 音频均衡器 matlab code,急求高手 设计声音均衡器 滤波器
  18. HP D380 G9 改IP地址
  19. 2020icpc上海(重温经典)
  20. 推荐一些必看的计算机书籍。

热门文章

  1. Ubuntu 系统使用 ESP32 作为蓝牙 adapter (适配器)
  2. Paddlehub创意赛---给人像增加背景
  3. 微信直播转链接或二维码方法,超级简单
  4. 海通策略研究所为高新企业融资搭台唱戏--陈雷丰
  5. tar 解压 跳过第一级目录
  6. 【转】php中的会话机制(2)
  7. 利用aspose添加水印,亲试可行
  8. “上新了!开发”系列直播课 #第六期# DAYU200技术公开课
  9. C# winform 实现PDF文件阅读
  10. python怎么应用在机械领域_7个步骤掌握使用python进行机器学习