如何实现STM32F407单片机的ADC转换

发布者:RadiantBreeze最新更新时间:2023-09-18 来源: elecfans关键字:STM32F407  单片机  ADC转换 手机看文章 扫描二维码
随时随地手机看文章

用到的引脚是PA3也就是ADC1的通道3

1、ADC的主要参数

a、分辨率----stm32f407的分辨率有6位、8位、10位、12位,参考电压如果是3.3 那么最小分辨率就是3.3/4095。

b、转换时间----stm32f407的最高允许频率是36M,最快转换时间 = 3+12个周期 =0.71us。

c、参考电压----2.4至3.3v。

2、工作过程分析

ADC转换是把外面输入到引脚的电压值转换成数字信号,单片机里面有一个模拟至数字的转换模块,我们可以控制它采集引脚的电压,stm32F407可以利用void ADC_SoftwareStartConv(ADC_TypeDef* ADCx)这个函数来控制转换。

3、详细的步骤

一、开启时钟 设置端口IO

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//使能GPIOA时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//使能ADC1时钟

/*端口设置为模拟输入*/

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;/*模拟输入*/

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;/*通道3*/

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;/*-不带上下拉*/

GPIO_Init(GPIOA,&GPIO_InitStructure);/*初始化*/

上面主要是设置了GPIOA 和ADC1的时钟,并且把PA3设置为模拟输入。

如何实现STM32F407单片机的ADC转换

二、设置通用控制寄存器

ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;/*DMA失能*/

ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;/*独立模式*/

ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;/*设置ADC的频率为APB2/4 即84/4=21M*/

ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;/*采样间隔时间*/

ADC_CommonInit(&ADC_CommonInitStructure);/*初始化*/

三、ADC的初始化

ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;/*12位模式*/

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

ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;/*关闭连续转换*/

ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;/*禁止触发检测 使用软件触发*/

ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;/*右对齐*/

ADC_InitStructure.ADC_NbrOfConversion = 1;/*只使用1通道 规则通为1*/

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

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

到这里ADC的设置基本完成现在就可以读取ADC的值。

四、读取ADC的值

uint16_t bsp_GetAdc(void)

{

ADC_RegularChannelConfig(ADC1,ADC_Channel_3,1,ADC_SampleTime_480Cycles);/*设置规则通道3 一个序列 采样时间 */

ADC_SoftwareStartConv(ADC1);/*启动软件转换*/

while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));/*等待转换结束*/

return ADC_GetConversionValue(ADC1);/*读取转换结果*/

}

这样我们就可以读取ADC的值了,其中我们每次读取的时候都要重新启动ADC的转换,转换完成就可以读取。

下面是完整的程序

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

*函 数 名:bsp_InitAdc

*函数功能:ADC1的初始化

*形 参:无

*返 回 值:无

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

void bsp_InitAdc(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

ADC_CommonInitTypeDef ADC_CommonInitStructure;

ADC_InitTypeDef ADC_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//使能GPIOA时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//使能ADC时钟

/*初始化ADC1通道3 的IO口*/

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;/*模拟输入*/

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;/*通道5*/

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;/*不带上下拉*/

GPIO_Init(GPIOA,&GPIO_InitStructure);/*初始化*/

/*通用控制寄存器的配置*/

ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;/*DMA失能*/

ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;/*独立模式*/

ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;/*APB2的4分频 即84/4=21M*/

ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;/*两个采样阶段的延时5个时钟*/

ADC_CommonInit(&ADC_CommonInitStructure);/*初始化*/

/*初始化ADC1*/

ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;/*12位模式*/

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

ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;/*关闭连续转换*/

ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;/*禁止触发检测 使用软件触发*/

ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;/*右对齐*/

ADC_InitStructure.ADC_NbrOfConversion = 1;/*只使用1通道 规则通为1*/

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

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

}

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

*函 数 名:bsp_GetAdc

*函数功能:读取通道3的值

*形 参:无

*返 回 值:ADC的数字值

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

uint16_t bsp_GetAdc(void)

{

ADC_RegularChannelConfig(ADC1,ADC_Channel_3,1,ADC_SampleTime_480Cycles);/*设置规则通道3 一个序列 采样时间 */

ADC_SoftwareStartConv(ADC1);/*启动软件转换*/

while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));/*等待转换结束*/

return ADC_GetConversionValue(ADC1);/*读取转换结果*/

}

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

*函 数 名:bsp_GetAdcValue

*函数功能:读取通道3的值

*形 参:num转换次数

*返 回 值:ADC的数字值

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

uint16_t bsp_GetAdcValue(uint8_t num)

{

uint16_t temp = 0;

uint16_t t;

for(t = 0;t 《 num;t++)

{

temp +=bsp_GetAdc();/*求平均值*/

}

return temp/num;

}

/*

*********************************************************************************************************

* 函 数 名: main

* 功能说明: c程序入口

* 形 参:无

* 返 回 值: 错误代码(无需处理)

*********************************************************************************************************

*/

int main(void)

{

/*

ST固件库中的启动文件已经执行了 SystemInit() 函数,该函数在 system_stm32f4xx.c 文件,主要功能是

配置CPU系统的时钟,内部Flash访问时序,配置FSMC用于外部SRAM

*/

bsp_Init();//在这里对ADC1进行了初始化及其它相关的初始化

/* 进入主程序循环体 */

while (1)

{

printf(“%d ”, bsp_GetAdcValue(10));

bsp_DelayMS(1000);

}

}

通过串口我们可以看到数据的变化。


关键字:STM32F407  单片机  ADC转换 引用地址:如何实现STM32F407单片机的ADC转换

上一篇:STM32单片机通用定时器的编程设计
下一篇:一文了解STM32窗口看门狗的真正作用

推荐阅读最新更新时间:2024-11-10 13:05

51单片机RS485程序源码与proteus仿真图
单片机-485-PC串口通信.jpg (106.21 KB, 下载次数: 21) 下载附件 保存到相册 2018-3-26 01:45 上传 单片机源程序如下: #include reg51.h #include intrins.h #define uchar unsigned char #define uint unsigned int sbit P12=P1^2; char code str = you are the best! nr ; main() { uint j; TMOD=0x20; TL1=0xfd;TH1=0xfd; SCON=0x50; PCON &= 0xef; TR1=1; IE=
[单片机]
51<font color='red'>单片机</font>RS485程序源码与proteus仿真图
从易到难,国产MCU车规级替代如何解决痛点、难点?
引言:期待国产MCU能够逐渐从“易国产化”到“难国产化”,并最终突破“极难国产化”的范围,进军国际巨头的核心领域。 车规级MCU(汽车级 微控制器 )是一种专为汽车行业设计的高性能、高可靠性的微控制器。它们在汽车电子系统中扮演着至关重要的角色,例如动力总成控制、底盘控制、车身控制、信息娱乐系统以及先进 驾驶辅助系统 等领域。汽车级MCU需满足严格的汽车级标准,具有强大的性能、低功耗、高可靠性以及对恶劣环境的适应性。随着汽车产业进入“新四化”趋势,新兴应用的快速发展对于车规级MCU带来更多新的需求。而本轮全球 芯片 缺货潮中,车规级MCU更是绝对的主角。中国是全球车规级芯片需求最大的市场,而随着中国厂商成为全球新能源汽车的增长驱
[汽车电子]
从易到难,国产<font color='red'>MCU</font>车规级替代如何解决痛点、难点?
手把手教你学51单片机:硬件基础知识学习
一、电磁干扰 使用去耦电容来达到电磁兼容目的。 二、去耦电容的应用 类比电流和水流,可得到去耦电容的作用: (1)缓冲作用:防止电流不稳定时对电子元器件的冲击。 (2)稳定作用:稳定电压电流,使之不产生大的波动。 故该如何选取电容: (1)耐压值:一般选取系统电压的1.5倍到2倍。 (2)滤波电容:一般为0.1uf,滤除高频信号干扰,可加在电源处作为去耦高频电容。 (3)稳定电压:较大电流通过时会加大电容用来稳压。 三、三极管 3.1三极管分类 NPN、PNP 3.2三极管原理 3.2.1口诀 箭头指內PNP,导通电压顺箭头过,电压导通,电流控制。 3.2.2电流控制 三极
[单片机]
手把手教你学51<font color='red'>单片机</font>:硬件基础知识学习
单片机、PSOC、FPGA的主要区别
  现在的单片机一般是mcu+有限的固定的模拟或数字外围;FPGA是可编程数字外围电路;PSoC 相当于MCU+可编程模拟外围电路+可编程数字外围电路。   PSoC 的最大特点就是集成度高,设计灵活。可以看成是MCU,FPGA/CPLD,ispPAC集合。   1.它里面包含MCU(psoc1为m8c,psoc3为51,psoc5为arm Cortex-M3),这是和你讲的那几种是有区别的。它可以很方便的实现系统设计,虽然fpga可以通过设计实现软核,但增加了设计难度,性能也达不到硬核的程度。   2.PSoC还包含可编程数字模块(类似FPGA/CPLD),以及可编程模拟模块(类似ispPAC),即具有处理数字和模拟两种信号的能力
[单片机]
MSP430单片机中断嵌套机制简介
1、MSP430单片机默认是关闭中断嵌套的,除非你在一个中断程序中再次开启总中断EINT。 2、对于单源中断,只要响应中断,系统硬件自动清中断标志位,对于TA/TB定时器的比较/捕获中断,只要访问TAIV/TBIV,标志位将被自动清除;对于多源中断要手动清标志位,比如P1/P2口中断,要手工清除相应的标志,如果在这种中断用“EINT();”开中断,而在打开中断前没有清标志,就会有相同的中断不断嵌入,而导致堆栈溢出引起复位,所以这类中断必须先清中断标志再打开总中断开关。 3、当进入中断服务程序时,只要不在中断服务程序中再次开启中断,MSP430单片机总中断是关闭的,此时再来中断不管是比当前中断的优先级高还是低都不执行,至到当
[单片机]
为什么AVR单片机需要写1作为清0中断标志位
关于“为何AVR使用写1作为清0中断标志位的手段”这个问题我看过很多的相关资料。在AVR的手册中并没有给出为什么的解释,只是强调了“写1清0中断标志位”。同时我也看到很多新的芯片,如DSP等,也是采用写1清零标志位的。但没有找到更专业的,或从根源上的说明,如果那位有这方面的知识或资料,欢迎深入的讨论学习。 下面是我个人的分析和解释,供参考。 1、首先从硬件上的考虑,通常的读写处理单元是以8BIT字节为单位的,因为数据总线一般是8位的倍数。这样对位的操作就不方便,不能直接写1位(会改变其它的位),需要先读到寄存器,然后改动1位,最后回写,需要更多的时间。 2、对于RAM操作一般采用直接写的方式,所以对RAM基本上没有直接的位操作
[单片机]
为什么AVR<font color='red'>单片机</font>需要写1作为清0中断标志位
基于51单片机的等精度频率计设计
设计以51单片机为核心,显示采用1602液晶。频率测量方法采用等精度频率法测量,外部脉冲作为内部高速脉冲计数的启动信号,也是最后的计数的结束信号。保证外部脉冲计数的无误差,通过内部的高速计数保证测量精度。 等精度频率计ppt: 仿真原理图如下(proteus仿真工程文件可到本帖附件中下载): 单片机源程序如下: #include STC12C5A60S2.H #include Intrins.h #include 1602.h unsigned char t0_hh,t1_hh; unsigned char dis_buf ; //unsigned char code frequence ={ frequence:
[单片机]
基于51<font color='red'>单片机</font>的等精度频率计设计
介绍基于ATmega8单片机控制的正弦波逆变电源设计
  0引言   在风电行业中,经常需要在野外对风机进行维修,这时必须为各类维修工具和仪器进行供电。因此,设计一种便携式。低功耗。智能化的正弦逆变电源来为这些设备供电是十分必要的,可大大提高维修风机的效率。   本文正是基于这种情况下而设计的一种基于单片机的智能化正弦逆变电源。   1 正弦逆变电源的设计方案   本文所设计的逆变器是一种能够将DC 12V直流电转换成220V正弦交流电压,并可以提供给一般电器使用的便携式电源转换器。目前,低压小功率逆变电源已经被广泛应用于工业和民用领域。特别是在交通运输。野外测控作业。机电工程修理等无法直接使用市电之处,低压小功率逆变电源便成为必备的工具之一,它只需要具有一块功率足够的电池与
[单片机]
介绍基于ATmega8<font color='red'>单片机</font>控制的正弦波逆变电源设计
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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