10-HAL库之ADC电压采集

2019-08-16来源: eefocus关键字:HAL库  ADC  电压采集

1.简介


12位ADC是逐次趋近型模数转换器,有19个复用通道(可测量16个外部源,2个内部源和1个VBAT通道的信号)。A/D转换可在单次、连续、扫描或不连续采样模式下进行,采样结果存储在1个16位数据寄存器中(实际只有12位数据)。


规则通道:一般所使用的通道;


注入通道:在规则通道转换时强行插入转换的通道,类似于中断。


ADC支持外部事件触发,包括内部定时器和外部IO。ADC输入时钟ADC_CLK由PCKL2经过分频产生,最大值是二分频54MHz,ADC允许最大值36MHz,典型值30MHz。


ADC的总转换时间=采样时间+12个周期.


ADC转换后数据存放在ADC_DR寄存器(规则转换)或JDRx中(注入转换),双重或三次模式则放在规矩寄存器ADC_CDR中。


ADC_DR只有一个,为32位寄存器且低16位优秀,之用于独立模式存放转换完成的数据。由于规则通道有16个,多通道转换时,需要开启DMA传输,将通道转换完成的数据传输到内存,避免被覆盖。


电压转换:当设置ADC为12位时,12位满量程对应3.3V输入电压,而对应数字之为2^12。若转换后的数值为X,则转换前的模拟电压Y=(3.3*X)/2^12。

2.配置步骤及相关函数


配置步骤为:引脚配置,相关时钟使能,ADC初始化,ADC通道配置,DMA使能,启动ADC。


ADC初始化结构体:


typedef struct

{

  uint32_t ClockPrescaler;        //时钟分频系数

  uint32_t Resolution;            //分辨率

  uint32_t DataAlign;             //数据对齐模式

  uint32_t ScanConvMode;          //扫描模式

  uint32_t EOCSelection;          //转换结束标志选择

  uint32_t ContinuousConvMode;     //连续转换模式

  uint32_t NbrOfConversion;        //转换数量

  uint32_t DiscontinuousConvMode;  //由事件触发后,选择连续模式

  uint32_t NbrOfDiscConversion;    //连续模式转换通道的数量

  uint32_t ExternalTrigConv;       //外部触发事件选择

  uint32_t ExternalTrigConvEdge;

  uint32_t DMAContinuousRequests;

}ADC_InitTypeDef;

ADC通道配置结构体:


typedef struct 

{

  uint32_t Channel;       //通道选择

  uint32_t Rank;          //排序

  uint32_t SamplingTime;  //采样时间

  uint32_t Offset;        

}ADC_ChannelConfTypeDef;

此外还有众多输出控制函数:


3.配置代码


#include "adc.h"

 

ADC_HandleTypeDef adc1;

ADC_ChannelConfTypeDef adc1_chan1;

 

void ADC_Config(void){

HAL_ADC_MspInit(&adc1);

 

GPIO_InitTypeDef GPIO_InitStruct;

  __HAL_RCC_GPIOA_CLK_ENABLE();

  GPIO_InitStruct.Pin = GPIO_PIN_2;

  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

//GPIO Config

__HAL_RCC_ADC1_CLK_ENABLE();

adc1.Instance=ADC1;

adc1.Init.ClockPrescaler=ADC_CLOCK_SYNC_PCLK_DIV4;

adc1.Init.Resolution=ADC_RESOLUTION_12B;

adc1.Init.ScanConvMode=ADC_SCAN_DISABLE;

adc1.Init.ExternalTrigConv=ADC_SOFTWARE_START;

adc1.Init.ExternalTrigConvEdge=ADC_SOFTWARE_START;

adc1.Init.DataAlign=ADC_DATAALIGN_LEFT;

adc1.Init.EOCSelection=ADC_EOC_SEQ_CONV;

adc1.Init.EOCSelection=ADC_EOC_SINGLE_CONV;

HAL_ADC_Init(&adc1);

adc1_chan1.Channel=ADC_CHANNEL_0;

adc1_chan1.Rank=ADC_REGULAR_RANK_1;

adc1_chan1.SamplingTime=ADC_SAMPLETIME_144CYCLES;

adc1_chan1.Offset=0;

HAL_ADC_ConfigChannel(&adc1,&adc1_chan1);

 

HAL_NVIC_SetPriority(ADC_IRQn,1,1);

HAL_NVIC_EnableIRQ(ADC_IRQn);

HAL_ADC_Start_IT(&adc1);

}

int main(void)    

{

  HAL_Init();

  Sysclk_config();

USART1_UART_Init(19200);

printf("USART1 CONFIG!n");

Basic_Tim_Config();

printf("TIM6 CONFIG!n");

ADC_Config();

printf("ADC CONFIG!n");

HAL_TIM_Base_Start_IT(&Basic_Tim6);//开启定时器6和更新中断

while(1)

{

adc_data=(float)adc_value*(float)3.3/4096;

printf("The input volatage is: %fn",adc_data);

}

 

}

 

 

void ADC_IRQnHandler(void)

{

HAL_ADC_IRQHandler(&adc1);

}

 

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)

{

adc_value=HAL_ADC_GetValue(&adc1);

}



关键字:HAL库  ADC  电压采集

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic471323.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:9.STM32之两只看门狗
下一篇:11-STM32F746之存储总结

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

使用stm32的HAL库完成pwm输入模式测量频率和占空比的详细教程

。 然后使能TIM2的中断接下来添加代码:main.c 中开启捕获中断    /* USER CODE BEGIN 2 */    HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);    HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);//如果不需要占空比和频率数据就只开通道2即可。第一次的数据是不正确的,实际工作中要将第一次的数据丢弃    /* USER CODE END 2 */      
发表于 2019-08-21
使用stm32的HAL库完成pwm输入模式测量频率和占空比的详细教程

16.HAL库之SPI和QSPI

沿进行数据变化。DDR模式:在该模式下,指令阶段在SCLK下降沿发送数据,而在地址,交替字节,数据阶段在SCLK上升沿和下降沿均发送数据。双闪存模式:使用两个外部SPI四线,可将flash扩大一倍。QSPI配置:时钟使能,管脚定义,QSPI配置,flash初始化,QSPI读/写函数定义。void Qspi_Config(){ __HAL_RCC_QSPI_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOF_CLK_ENABLE(); Flash_GPIO.Pin=GPIO_PIN_2; Flash_GPIO.Mode=GPIO_MODE_AF_PP
发表于 2019-08-16
16.HAL库之SPI和QSPI

HAL库之485+DMA通信(STM32F746)

(uint32_t bound){  __HAL_RCC_GPIOD_CLK_ENABLE();  __HAL_RCC_USART2_CLK_ENABLE();   GPIO_InitTypeDef GPIO_Init2;   GPIO_Init2.Pin = GPIO_PIN_4;              //485_RTS  GPIO_Init2.Mode =GPIO_MODE_OUTPUT_PP;  GPIO_Init2.Pull = GPIO_NOPULL;  GPIO_Init2.Speed
发表于 2019-08-16
HAL库之485+DMA通信(STM32F746)

15-HAL库之定时器学习

RepetitionCounter;   //重复计数,高级控制定时器所用   uint32_t AutoReloadPreload;   //自动预装载值}TIM_Base_InitTypeDef;应用例子如下:#include "basic_tim.h"TIM_HandleTypeDef Basic_Tim6;void Basic_Tim_Config(void){ HAL_TIM_Base_MspInit(&Basic_Tim6); __HAL_RCC_TIM6_CLK_ENABLE(); Basic_Tim6.Instance=TIM6
发表于 2019-08-16
15-HAL库之定时器学习

14-HAL库之I2C通信

发送停止传输信号P。读数据时,主机向从机发应答信号,当主机希望停止接收数据时,发送非应答信号。起始信号和停止信号见上图。数据有效性见上图。2.基于HAL库的I2C配置步骤:时钟使能—GPIO管脚配置—I2C配置初始化:void MyI2C_Init(void){ __HAL_RCC_GPIOB_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Pin = GPIO_PIN_6;  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;  GPIO_InitStruct.Pull
发表于 2019-08-16
14-HAL库之I2C通信

13-HAL库DMA系统总结

。2.DMA相关函数解析关于DMA,ST官方提供了HAL库(封装函数)和LL库(直接操作寄存器)。和GPIO定义类似,需要先使能相关时钟,定义句柄结构体DMA_HandleTypeDef mydma2,随后进行DMA的各项配置,最后进行初始化。typedef struct __DMA_HandleTypeDef{    DMA_Stream_TypeDef          *Instance;                       
发表于 2019-08-16
13-HAL库DMA系统总结

小广播

何立民专栏

单片机及嵌入式宝典

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

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