历史上的今天
今天是:2025年08月16日(星期六)
2019年08月16日 | 10-HAL库之ADC电压采集
2019-08-16 来源:eefocus
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);
}
上一篇:9.STM32之两只看门狗
史海拾趣
|
--8位10进制频率计 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity ftctrl3 is port(clkk:in std_logic; cnt_en:out std_log ...… 查看全部问答> |
|
6410下,通过IROM_Fusing_Tool.exe制做SD卡启动盘,烧东西进去,SD卡的容量怎么没变化?隐藏了? 6410下,通过IROM_Fusing_Tool.exe制做SD卡启动盘,烧东西进去,SD卡的容量怎么没变化?隐藏了?… 查看全部问答> |
|
高级嵌入式软件工程师Sr. Embedded Software Engineer 岗位描述: 1、负责嵌入式软件和产品设计。 2、负责嵌入式软件开发。 任职要求: 1、通信、电子或计算机类相关专业,本科以上学历; 2、五年以上相关工作经验; 3、需要熟悉WINDOWS CE. ...… 查看全部问答> |
|
高薪聘Windows Mobile 底层驱动开发工程师(深圳南山) 高薪聘Windows Mobile 底层驱动开发工程师 公司网址:www.bitland.com.cn ,偶QQ549503575 ;E-mail:yangsq@bitland.com.cn 有兴趣的可以加我细聊 待 ...… 查看全部问答> |
|
电赛‘一目了然’历年元器件清单对比(2003--2011)excel格式 历年元器件清单对比 对比看更清楚!!! [ 本帖最后由 GTao_12345 于 2011-8-25 17:08 编辑 ]… 查看全部问答> |
|
SGSTM8-III 开发板使用STMS105S4芯片 含全套 的视频教程,需要的可以联系我 STM8 开发板的1602 液晶屏的效果图 、 12864 液晶的效果图 ADC结合数码管的效果图 ...… 查看全部问答> |
|
什么是伺服控制系统,衡量伺服控制系统性能的主要指标系统精度、稳定性、响应特性、工作频率四大方面,特别在频带宽度和精度方面。频带宽度简称带宽,由系统频率响应特性来规定,反映伺服系统的跟踪的快速性。带宽越大,快速性越好。伺服系统 ...… 查看全部问答> |




