STM32 ADC自我学习总结

发布者:HarmonySpirit最新更新时间:2021-10-14 来源: eefocus关键字:STM32  ADC  GPIO口 手机看文章 扫描二维码
随时随地手机看文章

记录一下STM32的ADC编程方法!


前面已经学习了DMA,知道如何使用DMA去减小CPU的负担,这里的ADC转换也来使用DMA---这个也是STM32的ADC转换最常见的方式。


---第一步是---了解STM32的ADC对应的GPIO口----如下图---不用记住,可以查询,我是将它剪下来粘贴到书本的相应章节----!

---第二步是---配置相应ADC转换的GPIO口----这里使用PC0--PC1


static void ADC1_GPIO_Config(void)

{

GPIO_InitTypeDef GPIO_InitStructure;


RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);  //打开DMA1的时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC, ENABLE);


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 |GPIO_Pin_1;

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

GPIO_Init(GPIOC, &GPIO_InitStructure); 

}


---第三步是---配置ADC的DMA----配置ADC通道等---


#define ADC1_DR_Address    ((u32)0x40012400+0x4c)  //外设地址

__IO uint16_t ADC_ConvertedValue[2];  //内存数组




static void ADC1_Mode_Config(void)

{

DMA_InitTypeDef DMA_InitStructure;

ADC_InitTypeDef ADC_InitStructure;


DMA_DeInit(DMA1_Channel1);  

//---------------ADC的DMA配置--------------------

DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;  //ADC1地址---代表ADC1保存转换值的寄存器

DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;  //内存地址---用来保存DMA传输过来的ADC转换值----后面直接使用的变量地址

DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  //外设为数据源

DMA_InitStructure.DMA_BufferSize = 2;  //传输总数据---2通道需要传输2个数据

DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  //外设地址固定

DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //内存地址自增---总体表示始终从外设ADC1地址处取值---依次保存到连续的两个内存变量中---

DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;   //外设传输数据单元---半字16位

DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;  //内存传输数据单元---半字16位

DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;  //循环模式---2个数据依次循环接收从外设ADC1传输过来的ADC值---

DMA_InitStructure.DMA_Priority = DMA_Priority_High;  //高优先级

DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  //禁止内存传内存

DMA_Init(DMA1_Channel1, &DMA_InitStructure);


DMA_Cmd(DMA1_Channel1, ENABLE);  //再次打开DMA1


        //------------ADC模式配置------------------------

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;  //独立模式----还有很多模式---这个比较常见

ADC_InitStructure.ADC_ScanConvMode = ENABLE ;   //扫描模式---采集多通道使用----本程序采集2通道---所以扫描模式

ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;  //连续转换模式---不难理解---就是不停地采集---一次接一次

ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;  //不使用外部触发转换---触发分为外部触发---比如中断与定时器。软件触发---后面有专用函数

ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;   //采集的数据右对齐---方便计算

ADC_InitStructure.ADC_NbrOfChannel = 2;  //总共需要转换的通道个数---这里2个

ADC_Init(ADC1, &ADC_InitStructure);


RCC_ADCCLKConfig(RCC_PCLK2_Div8);  //配置ADC转换时钟---PCLK2的8分频

        //下面这个函数比较重要----配置ADC的通道与采样周期---前面说的PC0与PC1对应的ADC通道分别是--10与11。采集周期也有几种。

ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_55Cycles5);

ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_55Cycles5);


ADC_DMACmd(ADC1, ENABLE);  //打开DMA1的ADC1 

ADC_Cmd(ADC1, ENABLE);  //打开ADC1


ADC_ResetCalibration(ADC1);  //复位校准寄存器

while(ADC_GetResetCalibrationStatus(ADC1));  //等待校准寄存器复位完成


ADC_StartCalibration(ADC1);  //ADC校准

while(ADC_GetCalibrationStatus(ADC1));  //校准完成


ADC_SoftwareStartConvCmd(ADC1, ENABLE);  //软件触发转换

}


---第四部分是---在硬件上使用了一个通道切换芯片----CD4052----由PC2---PC3控制通道的选择CD4052切换控制GPIO配置----


void GPIO_Config(void)

{

GPIO_InitTypeDef GPIO_InitStructure;


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推完输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOC, &GPIO_InitStructure);

}


---第五部分是---主函数-----


extern __IO uint16_t ADC_ConvertedValue[2];  //声明外部变量

uint16_t My_ADC[2];  //求平均值


int main(void)

u8 i,led=0x01;


USART1_Config();



ADC1_GPIO_Config();

ADC1_Mode_Config();



while (1)

{

My_ADC[0]=0;

My_ADC[1]=0;



for(i=0;i<10;i++)  

{

                        My_ADC[0]+=ADC_ConvertedValue[0];

My_ADC[1]+=ADC_ConvertedValue[1];

               }

My_ADC[0]=My_ADC[0]/10;   //采集10次求平均值

My_ADC[1]=My_ADC[1]/10;


ADC_ConvertedValueLocal =(float) My_ADC[0]/4096*3.3;   //转换为电压值


printf("rn The current AD---0 value = 0x%04X n", My_ADC[0]); 

printf("The current AD---0 value = %f V n",ADC_ConvertedValueLocal); 


ADC_ConvertedValueLocal =(float) My_ADC[1]/4096*3.3; 


printf("The current AD---1 value = 0x%04X n", My_ADC[1]); 

printf("The current AD---1 value = %f V n",ADC_ConvertedValueLocal);  

}

}

关键字:STM32  ADC  GPIO口 引用地址:STM32 ADC自我学习总结

上一篇:STM32 中断配置 自我学习总结
下一篇:STM32 I2C总线 自我总结学习

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

STM32精确延迟1us和1ms的函数
延迟1us: 1 /***************************************************** 2 * 函 数 名 : delay_us 3 * 函数功能 : 延时函数,延时us 4 * 输 入 : i 5 * 输 出 : 无 6 *******************************************************************************/ 7 void delay_us(u32 i) 8 { 9 u32 temp; 10 SysTick-LOAD=
[单片机]
STM32定时器输出PWM
一、PWM 1.定义 英文全称:PULSE WIDTH MODULATION,脉冲宽度调制。 脉冲:频率,方波 宽度:占空比(duty),高电平的宽度 2.用途 (1)控制输出的电压和电流 (2)灯光的亮度 (3)电机 二、编程细节 PWM输出是没有中断触发的,PWM由硬件输出波形,用了中断反而会影响系统定时的效率。 所以,记住以后使用定时器输出PWM都不需要使用到中断 1.如配置STM32F407的TIM14的通道1,10ms即100Hz. 1ms = 0.01s=100HZ 84000000 /8400 = 10000 10000/x = 100 x=100 得到周期8400-1,分频系数10-1 基本
[单片机]
<font color='red'>STM32</font>定时器输出PWM
STM32配置时钟时注意设置FLASH等待周期
兴致勃勃地把复位及时钟控制(RCC)的寄存器定义写完了,没得午觉睡倒算了,还累得满头大汗 看来这事有点吃力不讨好,真想用别人现成的头文件算了,最后还是咬咬牙自己写吧,至少可以让自己对寄存器结构熟悉一些。 傍晚回来再写个测试程序,满以为一次就OK的,可是调试时却发现,运行到选择PLL时钟后程序就跑飞 顿时就傻眼了 检查各个寄存器配置,似乎没什么问题啊:选择外部8M时钟,不分频输入到PLL,设置PLL为9倍频(注意实际写入到寄存器中为7),AHB、ABP2不分频,ABP1为2分频(注意设置为8才是2分频),都没有超过最大频率啊。看来想要搞个72M的主频遇到麻烦了 试着将倍频降下来,当主频为48M时,系统可以正常工作了,莫
[单片机]
寒假学习之stm32(17)----SPI通信协议
背景知识介绍: wiki : http://wiki.csie.ncku.edu.tw/embedded/SPI#introduction 百度: http://baike.baidu.com/item/SPI 一定要看啊!!! 小小的摘要: 1. 通信模式:SPI是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线(SDI,SDO,SCLK,CS) MISO(master in slaver out) 主设备数据输入,从设备数据输出。 MOSI(master out slaver in) 主设备数据输出,从设备数据输入。 SCLK时钟信号,由主设备产生。 CS从设备片选信号,由主设备控制 2. 内部结构
[单片机]
寒假学习之<font color='red'>stm32</font>(17)----SPI通信协议
我的STM32从菜鸟到牛人的学习步骤
1.首先我们先看看与STM32相关的文档 我们假定大家已经对STM32的书籍或者文档有一定的理解。如不理解,请立即阅读STM32的文档,以获取最基本的知识点。如果你手上拥有ST官方主推的STM32神舟系列的板子,那么光盘都会配好这些文档,STM32的学习与ARM9的学习有一个很大的区别。ARM9的学习一般是需要购买书籍的。比如三星的S3C2440,官方的文档都是英文的,大部分工程师只能去看国内出版的书籍。英文好的同学,请不要以为你很牛,可以只看英文文档。毕竟你是中国人,你最熟悉的,理解最好的还是中文。看英文的速度还是比看中文慢一些,我们要的是最短的时间,而不是追求短时间内记住所有细节。当然,如果是一篇论文,建议看英文原版还是有好处
[单片机]
STM32单片机学习笔记(5):ADC模数转换器
项目简介 利用CubMX生成基于32单片机的HAl库工程,然后编写程序在proteus上仿真验证。本项目最适合没有开发板的同学学习,零成本利用仿真软件率先入门STM32单片机。这是第五部分针对STM32单片机内置ADC模块的学习和理解。 硬件模块 STM32F103R4 LDR 串口模块 软件工具 CubMX Proteus KEIL 电路连接图 工作流程 首先创建一个CubMX工程,选择ADC模块 其余保持默认即可。 然后就是编写程序,程序代码在后面会列出来,这里简单说说自己遇到的一些问题。刚开始出来的结果全是0,但是网上有人说在实物开发板上是可以正常运行的。本来想放弃选用ADC0832模块的,不过不幸的事
[单片机]
<font color='red'>STM32</font>单片机学习笔记(5):<font color='red'>ADC</font><font color='red'>模数转换器</font>
STM32】HAL库-ADC
12位ADC是一种逐次逼近型模拟数字转换器。它有多达18个通道,可测量16个外部和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。 模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。 ADC的输入时钟不得超过14MHz ADC开关控制 通过设置ADC_CR2寄存器的ADON位可给ADC上电。当第一次设置ADON位时,它将ADC从断电状态下唤醒。 ADC上电延迟一段时间后(tSTAB),再次设置ADON位时开始进行转换。 tSTAB可查询数据手册 一般来说是1us 通过清除ADON位可以停止转换,并将ADC置
[单片机]
【<font color='red'>STM32</font>】HAL库-<font color='red'>ADC</font>
基于STM32的嵌入式以太网门禁系统设计
  引言   当前,有很多的企业是采用佩戴工作证来完成门禁管理,而且还是采用传统的人工方式完成,不仅容易被人混入,且没有记录,存在各种人为的失误。同时,市场上门禁系统存在传输距离受限制、性能不佳等问题。   随着嵌入式技术日新月异的发展,以及以太网技术的普及,使得基于以太网的嵌入式产品越来越多,发展也越来越快。本文研究的就是采用以太网传输数据和射频芯片识别智能卡相结合的门禁系统,相对于传统的门禁系统,以太网解决了传输距离上的问题。其次,采用了基于80C51内核的射频芯片PN532,使得性能更加稳定。其工作的基本原理是先将智能卡放在门禁系统上,系统读取数据并传送给主芯片STM32进行处理,主芯片处理后再通过以太网协议LwIP将数
[单片机]
基于<font color='red'>STM32</font>的嵌入式以太网门禁系统设计

推荐帖子

飞龙教程------51单片机
飞龙教程------51单片机51单片机=====单片机的学习http://v.ku6.com/show/2HAQ5tLXh4rUFyto.html51单片机=====跑马灯(LED)http://v.ku6.com/show/ki1nwsD0YCYnrQX7.html51单片机=====色环电阻识别方法http://v.ku6.com/show/9ZxwxSeT2WdxebAS.html51单片机=====蜂鸣器、http://v.ku6.com/show/xHdmQxBPAA
smartcool 嵌入式系统
空载保护电路具体的工作原理
空载保护电路具体的工作原理,比如输入正弦波幅值50V,峰峰值100VPP,频率1.7M,则有效值检测芯片输出的有效值电压是多少?空载保护电路具体的工作原理有效值是除以根号2吗~我猜的~问题与题目没有关联吧正弦波峰值为有效值的2倍。峰峰值为2倍的峰值AD637就是一个有效值检测芯片好好看看手册就知道了至于所谓的空载保护电路具体的工作原理楼主的截的一片图,人家论文作者已经说的很清楚 就是没看懂嘛
QWE4562009 电路观察室
无法找到ntifs.h 头文件,搞了两天了。都吐了高手帮忙啊
开发环境IFS2003+VS2008+DDKWIZARD开发普通的驱动都很好。可是有一天我想尝试一下文件驱动:我把sfilter里面的代码复制到我自己建的一个驱动项目里面,调好了编译环境,一编译找不到ntifs.h文件,于是我就把Include的路径改了一下,结果这下好了。找到了那个头文件,可是出了100多个错误,这怎么解决,高手有没有知道的,帮帮忙啊。无法找到ntifs.h头文件,搞了两天了。都吐了高手帮忙啊另外补充一下,我不用VS2008的话直接在CMD中用Build编译却是正确的
zhtwn 嵌入式系统
用g2553测量外部直流电压并LCD1602显示
捣鼓好几天了没有一点进展啊求大神给我发个能实现用g2553测量外部电压并LCD1602显示的程序,不胜感激用g2553测量外部直流电压并LCD1602显示程序是需要依赖硬件支持的,不懂原理图,就算别人发给你了程序,你能懂吗?在编写程序的时候,都是一步一步来的,你的困难在哪?是卡在了哪个地方,并且说出你的看法,这样解决问题才是最快速的。“捣鼓好几天了……”,把平台搭建好了没有?单片机可以运行了吗?首先做个IO口控制的,能运行后,看看1602(或下载一个程序再自己修改一下),把LC
不绝望的面对 微控制器 MCU
直播已结束| Littelfuse【如何提高智能楼宇电子设备的安全与可靠性】
直播详情:Littelfuse有奖直播:如何提高物联网时代智能楼宇电子设备的安全与可靠性直播主题:如何提高物联网时代智能楼宇电子设备的安全与可靠性直播时间:2019年8月15日(今天)上午10:00-11:30观看方式:点击我要观看,填写并提交报名表即可。观看直播或者直播中提问均有机会获赠下方精美礼物呦~直播内容:在技术快速发展的时代给我们生活带来更多的便利和舒适,同时新技术产品也会带来一些潜在的风险和瑕疵。本次
EEWORLD社区 安防电子
硕士论文
基于Lyapunov稳定性定理硕士论文
lorant FPGA/CPLD
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
502 Bad Gateway

502 Bad Gateway


openresty
随便看看
    502 Bad Gateway

    502 Bad Gateway


    openresty

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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