STM8学习笔记---ADC多通道采样

最新更新时间:2021-09-15来源: eefocus关键字:STM8  ADC  多通道采样

STM8S003单片机ADC采样通道总共有5个,从AIN2---AIN6,多通道采样时需要将ADC转换设置为单次转换模式,每次切换采样通道后,需要重新初始化 ADC,采样结果在中断中读取。


IO口初始化代码


//AD通道引脚初始化

void ADC_GPIO_Init( void )

{

    PD_DDR &= ~( 1 << 2 );              //PD2 设置为输入     AIN3

    PD_CR1 &= ~( 1 << 2 );              //PD2 设置为悬空输入

    

    PD_DDR &= ~( 1 << 3 );              //PD3 设置为输入      AIN4

    PD_CR1 &= ~( 1 << 3 );              //PD3 设置为悬空输入

    

    PC_DDR &= ~( 1 << 4 );              //PC4 设置为输入      AIN2

    PC_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模块的上电完成 至少7us

    ADC_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 设置为输入     AIN3

    PD_CR1 &= ~( 1 << 2 );              //PD2 设置为悬空输入

    

    PD_DDR &= ~( 1 << 3 );              //PD3 设置为输入      AIN4

    PD_CR1 &= ~( 1 << 3 );              //PD3 设置为悬空输入

    

    PC_DDR &= ~( 1 << 4 );              //PC4 设置为输入      AIN2

    PC_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模块的上电完成 至少7us

    ADC_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位

[1] [2]
关键字:STM8  ADC  多通道采样 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic548017.html

上一篇:STM8学习笔记---Modbus通信协议简单移植
下一篇:STM8单片机ADC模拟看门狗功能实现

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM8 低功耗模式 STM8应用笔记
四种STM8低功耗模式的主要特性如表12。(表12:STM8S低功耗模式管理)1.如果外设时钟未被关闭2.包括通讯外设的中断(参见中断向量表)STM8等待(Wait)模式在运行模式下执行WFI(等待中断)指令,可进入等待模式。此时CPU停止运行,但外设与中断控制器仍保持运行,因此功耗会有所降低。等待模式可与PCG(外设时钟门控),降低CPU时钟频率,以及选择低功耗时钟源(LSI,HSI)相结合使用,以进一步降低系统功耗。参见时钟控制(CLK)的说明。在等待模式下,所有寄存器与RAM的内容保持不变,之前所定义的时钟配置也保持不变(主时钟状态寄存器CLK_CMSR)。当一个内部或外部中断请求产生时,CPU从等待模式唤醒并恢复工作
发表于 2021-09-03
<font color='red'>STM8</font> 低功耗模式 <font color='red'>STM8</font>应用笔记
一个STM8串口**程序教程
现在越来越多人用STM8了,我也跟上大众,一起凑热闹。刚开始以为STM8可以随便用串口**程序,于是从阿莫那买了个STM8S Mini Kit,买回来后发现不能串口**,郁闷之极。后来咬咬牙,再买一个三合一,用ST-Link**程序,真是冤大头。后来想想再试试如何用串口**程序,多一种方式备用也好。在网上搜索,发现几乎没有详细的相关教程,只好自己探索了。经过多次摸索,终于明白了如何用串口**程序到STM8了,而且不像网上流传那样是一次性的。不敢独享,做成教程,本文以三合一板为例,所有步骤均带电操作。正文第一步:打开STVP,选择Configure -> Configure ST Visual Programmer。第二步选择
发表于 2021-09-03
一个<font color='red'>STM8</font>串口**程序教程
stm8 pwm实现核心代码
;     TIM2_IER = 0x00;        TIM2_CR1 |= 0x01;        //TIM2_BKR = 0xc0;}STM8S103F3P6  输出 3路 PWM亲测可用。
发表于 2021-09-03
IAR+STM8_EXTI外部IO中断
MCU:STM8S207SB要操作的IO口:PD7 采用下降沿触发中断代码:123456789101112131415161718192021222324252627282930313233343536#include <iostm8s207sb.h> #define LED1_FLASH PD_ODR_ODR3 = !PD_ODR_ODR3 // 开发板上的LED1接在PD3上 void GPIO_init(void){PD_DDR = 0x08; // 配置PD端口的方向寄存器PD3输出PD_CR1 = 0x08; // 设置PD3为推挽输出PD_CR2 = 0x80; // 使能PD7外部中断
发表于 2021-09-03
STM8使用TIM1测量PWM波
一基本TIM1测量PWM波形原理根据上图所示测量PWM的基本思想如下:每个上升沿开始计数,监测到下降沿时记录下当前值为高电平时间,再检测到一个下降沿记录下当前值为周期,同时清零计数器开始测量下个周期。二TIM1 的硬件结构1 信号如何输入的打开手册 翻到  17.5.2 输入模块 如图61,输入部分对相应的TIx输入信号采样,并产生一个滤波后的信号TIxF。然后,一个带极性选择的边缘监测器产生一个信号(TIxFPx),它可以作为触发模式控制器的输入触发或者作为捕获控制。该信号通过预分频进入捕获寄存器(ICxPS)。根据该图和说明了解到和PWM测量相关的信息1) TIM1有四个外部IO引脚可以输入信号 TIM1_CHx2)&
发表于 2021-09-03
<font color='red'>STM8</font>使用TIM1测量PWM波
从头学STM8单片机之"Hello,world"
  最近做了一个数显电压表,电路上支持交流或直流电压显示,软件上支持七种不同的满量程档位,可以自由切换,有小数点自动移位,无效零消隐,超量程指示等功能,修改外部元件就可以做成不同量程的交流或直流电压表,不会编程的朋友也可以DIY出各种不同量程的交流或直流电压表。  主要元件有STM8S003F3单片机一片,自带ADC,0.56寸三位共阴数码管一个,再就是阻容稳压什么的,电路也很简单,爱好者自制很方便。本贴的程序都能在此硬件上测试通过。下面是电路原理图:  自从去年开始学了单片机以后,发现单片机没有想象中那么难,所以想做一个教程和大家一起共同学习。我的编译环境是IAR的EWSTM8-2102,本贴代码都在此环境下测试通过,其它编译
发表于 2021-09-02
从头学<font color='red'>STM8</font>单片机之
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2021 EEWORLD.com.cn, Inc. All rights reserved