历史上的今天
返回首页

历史上的今天

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

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

2021-09-15 来源:eefocus

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位

推荐阅读

史海拾趣

安谱隆(Ampleon)公司的发展小趣事

在安谱隆的发展历程中,资本市场对其一直保持着高度的关注。然而,其“安家”之路却并不平坦。2017年,奥瑞德曾有意收购安谱隆,但由于资金问题,这桩收购最终未能成行。2018年,旋极信息也计划收购安谱隆,但同样未能成功。这些波折反映了资本市场对安谱隆价值的认可,但也暴露出安谱隆在寻找合适买家方面所面临的挑战。

Fibrefab Limited公司的发展小趣事

面对全球环境问题日益严峻的现状,Fibrefab积极响应环保号召,推动绿色生产和可持续发展。公司采用环保材料和生产工艺,降低产品生产和使用过程中的能耗和排放。同时,Fibrefab还积极参与环保公益活动和社会责任项目,为保护环境贡献自己的力量。这一举措不仅提升了Fibrefab的企业形象和社会责任感,也为其长期发展奠定了坚实基础。

Erocore Enterprise Co Ltd公司的发展小趣事

随着技术实力的提升,Erocore开始积极拓展市场。公司凭借优质的产品和服务,逐渐在电子行业中树立了良好的品牌形象。通过与国内外知名企业的合作,Erocore的产品逐渐进入更广泛的市场领域。同时,公司也加大了市场营销力度,通过参加展会、举办研讨会等方式,提升品牌知名度和影响力。

HARTING公司的发展小趣事

在快速发展的过程中,Erocore意识到供应链管理的重要性。公司开始优化供应链流程,降低采购成本,提高生产效率。通过与供应商建立长期稳定的合作关系,Erocore在保证产品质量的同时,实现了成本的有效控制。这一举措为公司在激烈的市场竞争中赢得了更多的优势。

Danube Enterprise Co Ltd公司的发展小趣事

在稳固了国内市场地位之后,Danube开始将目光投向了全球市场。他们通过设立海外办事处、与当地企业合作等方式,积极开拓国际市场。Danube的产品凭借其卓越的品质和创新的设计,逐渐在国际市场上崭露头角。同时,公司还根据不同国家和地区的市场需求,推出了定制化的产品和服务,进一步增强了其市场竞争力。这些努力让Danube在全球电子行业中逐渐崭露头角,成为了一家备受瞩目的企业。

上海如韵(CONSONANCE)公司的发展小趣事

在发展过程中,如韵始终关注社会责任和可持续发展问题。公司积极参与社会公益活动,为弱势群体提供帮助和支持。同时,如韵注重环保和节能减排工作,在产品设计和生产过程中严格遵守相关环保法规和标准。

为了推动行业的可持续发展,如韵还积极参与行业交流和合作活动,与同行分享经验和资源。通过与产业链上下游企业的紧密合作和协同创新,如韵为推动电子行业的绿色发展和技术进步做出了积极贡献。

问答坊 | AI 解惑

音频电路集锦下载

音频电路集锦 [ 本帖最后由 shuijian 于 2008-10-21 17:25 编辑 ]…

查看全部问答>

wince 可是识别网卡 但是从台式机不能ping到开发板

我的开发板是用cf卡的网卡,在wince中可以识别出是ne2000的网卡,并且也在网络设置那地方识别出了网卡,但是从台式机上ping开发板就是ping不通  是怎么回事啊…

查看全部问答>

PDA上可以做为网络通讯的server端吗??为什么我试过都不行

我想在PDA上开发一个程序用来跟PC机进行通讯,结果发现PDA上无法作为服务端,只能做为客户端?这是为什么? 我用的开发工具是VS.NET 2003,POCKET PC模拟器…

查看全部问答>

wince 启动卡住

下面是启动的信息: VIVI bootloader 0.1.4 (chris@yangchu.com) (gcc version 2.95.3 20010315 (release)                              & ...…

查看全部问答>

求助,有关MODBUS协议的问题,请路人指教

我预通过R485串口读取一个装置的数据,数据是以MODBUS的协议进行传输的,请问,我该如何去读取,麻烦高人给个详细的解答。小弟在此学习了,谢谢。…

查看全部问答>

有奖征集高人帮助在AMTEL单片机上开发发送彩信功能?

硬件资源:      CPU     :ATMEL AVR MEGA64      扩展存储:64kBYTE RAM      通信接口:GSM/GPRS模块,内嵌TCP/IP协议栈,与CPU通过RS232口连接 如有意承接, ...…

查看全部问答>

Freescale步进电机驱动参考设计

这是Freescaler提供的步进电机驱动代码,大家可以参考参考,有兴趣的也可以看看。…

查看全部问答>

stm32f101仿真器时停不下来

不知道是哪错了~ 我在用JLINK仿真stm32f101的时候,发现点问题~ 可以烧写程序~进入主程序后~可以单步执行,可以运行到断点处~ 但是只要没有断点,全速运行后,点stop 停下来的时候 程序就自动关掉了~就报下面的这个错误(如图)~ 知道什么 ...…

查看全部问答>

如何把八位二进制数转为十进制数并用七段显示译码器输出

如题,求高手指点,能给出所用器件或电路图的更佳,先在此言谢…

查看全部问答>