历史上的今天

今天是:2024年09月15日(星期日)

2021年09月15日 | STM8学习笔记---ADC多通道采样

发布者:东土大唐88 来源: 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  多通道采样 引用地址:STM8学习笔记---ADC多通道采样

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

推荐阅读

   手机市场向来是竞争激烈的战场,而在各家的旗舰机市场更是硝烟味十足。在这里,不仅仅是充斥着外观,性能的碰撞,更是高新黑科技一决雌雄的地方。一方主打性价比的小米8,一方是怀揣着黑科技,满血归来的努比亚Z18,究竟谁家旗舰更胜一筹,更值得消费者购买,这还需要从多个维度来进行考量。Round 1:屏占比为王 小小机身超大屏幕“醉翁之意不在刘...
这个 3 米高的庞然大物诞生于 80 年代,比波士顿动力机器狗还早 20 多年。 前段时间,波士顿动力机器狗 Spot 正式开售,而且已经有买家晒出了首个开箱。波士顿动力机器狗项目由美国国防高等研究计划局(DARPA)资助,初衷是研制一种能够负重的机械骡,和士兵一起在传统机械车辆无法行驶的粗糙地形上作战。2005 年,Spot 的前辈——「Big Dog...
无刷电机的工作原理依旧可以想象一个圆柱体,不过这次不是小圆棒在中间转,而是一个块儿吸铁石在中间转,柱壁不在是吸铁石的两个磁极,而是刚才通了电的“扇叶”。这样只要一通电,柱壁因为电磁有了磁极,和中间的吸铁石产生互斥力,然后吸铁石疯狂转,电能就此转化为动能。它与有刷电机最大的区别就是,就不用那俩电刷通电了,因为我们可以直接给柱壁通电...

史海拾趣

问答坊 | AI 解惑

PLC资料

大家好!!我是刚来的.我这里有些PLC资料怎么传到网络上?想和大家分享…

查看全部问答∨

如何选择数字万用表

仔细阅读DMM说明书 从资料上看, 数字多用表 (DMM) 的模式有几百种之多。为了挑选出合用的 DMM 是一件很伤脑筋的事。问题是如何找到价钱适当而性能符合需要的 DMM。在选择之前, 先要确定需要测量的量值是什么。 你做精密的计量工作吗 ? 真的是用 ...…

查看全部问答∨

稳压电源

智能车比赛…

查看全部问答∨

djyos含example的0.2.0版本发布了!!!内含example的教程。

大家可以到 www.djyos.com 下载,有问题,可以加QQ群:62419319 讨论。…

查看全部问答∨

【VxWorks5.x -->VxWorks6.x 移植问题】

大家好,谁有没有做过 PPC的BSP 从 5.X ---> 6.X 的移植啊? 我所知道的是,从6.x对5.X的支持是兼容的,那么我就先把 5.X 的BSP文件夹 如 ppc_myself_XXX 放到 h/config/ 下,然后新建立 BSP 工程,进行编译,可是编译的时候,发现ERROR超多啊 ...…

查看全部问答∨

并口驱动开发求助!!!很急.

#include <linux/init.h> #include <linux/config.h> #include <linux/module.h> #include <linux/kernel.h> #include <linux/slab.h> #include <linux/fs.h> #include <linux/errno.h> #include <linux/type ...…

查看全部问答∨

香帅:在哪可以找到STM32的USB在PC端的驱动

想看看STM32的USB,没找到驱动,不过在ST的网上找到的固件包,ST-Dfuse里好像也没驱动,找到模拟串口和stick鼠标的就OK了,谢谢.…

查看全部问答∨

【重要更新】最新版STM32技术参考手册的中文译文全文已经发

                                 这个中文译文版本是根据2008年12月的英文最新版本—第7版校对,请在ST&nbsp;MCU的中文官方网站下载,同时更新的 ...…

查看全部问答∨

cmd文件怎么写啊

c语言写源程序,可不知道写cmd文件, 求高手赐教啊…

查看全部问答∨

基于flash的dsp的tms320c6414自启动

我用的dsp是tms320c6414,flash采用的是SST39vf160x,按8bit存储方式把程序代码下载到flash中,然后编写了boot.asm,boot.asm中二次启动的代码也是按8bit从dsp的emifb(dsp的emifb与flash相连)搬移到sram中,可以实现dsp自启动功能。但是由于SST39v ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved