历史上的今天
返回首页

历史上的今天

今天是:2025年03月28日(星期五)

正在发生

2020年03月28日 | stm32---ADC

2020-03-28 来源:eefocus

adc.c


#include "adc.h"

 

void ADCx_Init()

{

    

    GPIO_InitTypeDef GPIO_InitStructure;

    ADC_InitTypeDef ADC_InitStructure;

    

    //1*时钟开启并配置ADC分频系数

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_GPIOA,ENABLE);

    RCC_ADCCLKConfig(RCC_PCLK2_Div6);//6分频,72/6=12Mhz,函数在rcc.h中

    

    //2*GPIO配置

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模式是模拟输入

    GPIO_Init(GPIOA,&GPIO_InitStructure);

    

    //3*ADC初始化并使能

    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC模式:单通道模式

    ADC_InitStructure.ADC_ScanConvMode = DISABLE; //非扫描模式

    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //关闭连续转换,变单次转换

    ADC_InitStructure.ADC_NbrOfChannel = 1; //通道数是1

    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //禁止外部触发检测,使用软件触发

    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //采样数据在寄存器中右对齐

    ADC_Init(ADC1,&ADC_InitStructure); //初始化    

    ADC_Cmd(ADC1,ENABLE); //开启ADC

    

    //4*重置校验寄存器并开始校验**

    ADC_ResetCalibration(ADC1); //重置校验寄存器

    while(ADC_GetResetCalibrationStatus(ADC1)); //等待重置完成,重置完返回0

    ADC_StartCalibration(ADC1); //开始校验

    while(ADC_GetCalibrationStatus(ADC1));//等待校验完成,校验完返回0

    

    //5*开始AD转换

    ADC_SoftwareStartConvCmd(ADC1,ENABLE);

    

}

 

/*******************************************************************************

* 函 数 名         : Get_ADC_Value

* 函数功能         : 获取通道ch的转换值,取times次,然后平均,以提高数据的可靠性  

* 输    入         : ch:通道编号

                     times:获取次数

* 输    出         : 通道ch的times次转换结果平均值

*******************************************************************************/

 

//6*获得转换后数字

u16 Get_ADC_Value(u8 ch,u8 times)

{

    u8 t=0;

    u32 temp_val=0;

    ADC_RegularChannelConfig(ADC1,ch,1,ADC_SampleTime_239Cycles5); //ADC1,ADC 通道,239.5 个周期,提高采样时间 可以提高精确度

    

    for(t=0;t    {

        ADC_SoftwareStartConvCmd(ADC1,ENABLE); //开始转换

        while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)); //等待转换完成,转换完成返回1

        temp_val += ADC_GetConversionValue(ADC1);  //times次值累加

        

    }

    

    return temp_val/times; //返回转换后数字,ADC1 最大为 12 位精度, 所以返回值类型为 u16 即可

}

 

adc.h


#ifndef _adc_H

#define _adc_H

 

#include "system.h"

 

void ADCx_Init(void);

u16 Get_ADC_Value(u8 ch,u8 times);

 

 

#endif

 

 

main.c


#include "systick.h"

#include "led.h"

#include "system.h"

#include "key.h"

#include "usart.h"

#include "adc.h"

 

int main()

{

    u8 i=0;

    u16 Value; //得到的AD的值

    float Vol; //滑动百变阻器点压

    SysTick_Init(72);  //系统时钟初始

    LED_INIT(); 

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 

    USART1_Init(9600);

    ADCx_Init();

    while(1)

    { 

        i++;

        if(i%20==0) //200ms变换一次

        {

            led1=!led1;

        }

        

        if(i%50==0) //500ms采集一次

        {

            Value = Get_ADC_Value(ADC_Channel_1,10);

            printf("检测到的AD值为%drn",Value);

            Vol = (float)Value*(3.3/4096);/*我们使用的 ADC1 为 12 位转换精度,最大值为 2^12 即 4096, 

                                而 ADC 的参考电压 VREF+为 3.3V,所以知道 AD 转换值就可以计算对应的电压值*/

            printf("变阻器电压值为%.2frn",Vol);

        }

        

        delay_ms(10);

    }

}


推荐阅读

史海拾趣

Bedford Opto公司的发展小趣事

Bedford Opto公司在成立初期,面临着激烈的市场竞争和技术瓶颈。然而,公司的研发团队通过不懈努力,成功开发出一款具有革命性的光电传感器。这款产品不仅提高了信号传输的效率,还降低了能耗,迅速在市场上获得了认可。Bedford Opto公司因此逐渐在电子行业中崭露头角。

EDDING公司的发展小趣事

ECLIPSE公司深知,要想在竞争激烈的电子行业中保持领先地位,必须不断创新和满足用户需求。因此,公司投入大量资源用于Eclipse的研发和更新,不断推出新版本和新功能。同时,ECLIPSE公司也非常重视社区建设,通过举办开发者大会、提供在线支持等方式,积极与全球开发者互动和交流。这些努力不仅增强了Eclipse的用户黏性,也为其带来了更多的创新思路和商业机会。

Alpha Semiconductor公司的发展小趣事

随着技术的不断积累和市场的变化,Alpha Semiconductor于1988年开始为OEM厂家设计定制产品。这一转型是公司发展历程中的重要一步,它使得Alpha Semiconductor能够更深入地了解客户需求,提供更加贴合市场需求的产品解决方案。通过不断的创新和改进,Alpha Semiconductor逐渐在半导体市场中树立了良好的口碑。

Global Mixed-Mode Technology Inc公司的发展小趣事
设计和实现一个简单的三相缺相报警灯电路,可以使用三个中间继电器分别接在三相电的L1、L2、L3相上,继电器的另一端接零线。继电器的常开触点与报警灯(如黄灯、绿灯、红灯)串联,形成指示灯电路。当三相电正常时,继电器均吸合,常开触点断开,报警灯不亮。当某一相缺相时,对应相的继电器失电,常开触点闭合,使对应的报警灯亮起。同时,可以加入声音警报电路,当任一相缺相时,触发声音警报。
宁波晨翔电子(CONNFLY)公司的发展小趣事

作为一家有社会责任感的企业,晨翔电子始终关注环保问题。公司在生产过程中积极采用环保材料和工艺,减少对环境的影响。同时,公司还积极参与社会公益活动,回馈社会。这些举措不仅体现了公司的环保意识和社会责任感,也为公司赢得了更多客户和社会的认可和支持。

Avel Lindberg公司的发展小趣事

随着技术的不断积累和创新,晨翔电子在智能仪表、LED照明、无线网络等领域取得了显著的技术突破。公司不仅成功研发出多款具有竞争力的产品,还积极拓展国内外市场,与多家知名企业建立了长期稳定的合作关系。这一时期的成功,为晨翔电子的后续发展奠定了坚实的基础。

问答坊 | AI 解惑

用定时中断扫描键盘和LED显示

用5ms的定时中断扫描键盘模块的LED现实模块, 键盘20ms一次  显示100ms一次  请高手指点下,最好有流程图 编程的话用汇编…

查看全部问答>

让你的软件飞起来

  ---------------------------------------     文章的确很不错, 尤其是《让你的软件飞起来》,作者的精益求精、奇思妙想,令人叫绝。读后深受启迪,受益匪浅。     不推荐对不起天下人,故写了这几句话。  ...…

查看全部问答>

急救警报手镯 随时保证你的安全

急救警报手镯        在人潮涌动的海边玩耍,如果遇到危险,呼救的声音往往会被人声和海浪声淹没。即便有救生员在高塔上时刻监控,危险依旧难以避免。设计师便根据这一情况,推出了这款急救手镯。 …

查看全部问答>

Windows CENET中断架构分析和高速AD驱动程序的开发.pdf

Windows CENET中断架构分析和高速AD驱动程序的开发.pdf…

查看全部问答>

s3c2410电池管理

怎么像手机一样提示电池电量? 接触过的朋友帮帮忙,谢谢!…

查看全部问答>

大家有什么好建议

想做一个让人看了有点神奇,迷惑不解,会发光之类的玩意,大家有什么好的建议或意见?电子钟,交通灯,流水灯,摇摇棒人家都做了。。。我改做什么呢?大家都玩过些啥玩意  给点建议好吗? 谢谢。。。。…

查看全部问答>

流明学习笔记之十六PWM点亮液晶

又好久没泡一下了哈,唉最近时下是忙唉,单位一堆事,回家也一堆事,搞搞东西时在是不容易啊!   唉!   有人说你忙得糊涂了,PWM怎么能点亮段显LCD,嘿嘿!我还真没糊涂清楚的很啊!!!   来真格地:   脉冲宽度调制 ...…

查看全部问答>

转让手中的2440开发板给需要的人(已出)

大学毕业了 工作和嵌入式不相关  所以转让手中的2440开发板给需要的人  版型是mini2440   板子买的时候就标配256M  nand flash  免除升级麻烦说句过来人的话给学习arm的人 现在很多新人都追求arm11  因为它可以跑And ...…

查看全部问答>

MSP-EXP430G2开发板导学资料及原理图

有关MSP430 LaunchPad的文件资料都是在TI官网上都可以下载。如果你手头有这个板子或者即将有这款板子,我先推荐这两个资料是你初步学习的最好资料。经管都是英文,大家还是要慢慢地适应,学电子这一行都是国外的东西,看英文文档是最习以为常的。我 ...…

查看全部问答>