STM32LxxADC单通道多次转换代码分析(非DMA)
2017-01-13 10:09
316 查看
stm32l0c8xADC特性如下:
有多达16 个通道和3个内部通道(温度传感器、参考电压),PA0、PA4、PA5为高速通道,其他为标准通道。
有单次转换模式和扫描模式,扫描模式下对选定的通道自动进行扫描转换。
ADC频率独立于CPU频率外,即使CPU速度低,ADC也可以达到允许最大采样速率1.14 MSPS。
能耗很低频率(10kSPS,25μA;1MSPS,200μA)。
自动关闭功能保证ADC在有效转换阶段期间外能够关闭。
可由DMA控制器控制,工作电压可低至1.65v
模拟看门狗功能
等等。。。
以下是基于上述mcu的ADC单通道多次转换(非DMA)代码,代码已经通过调试,欢迎指正交流。
1、声明相关变量
2、ADC初始化,需要初始化ADC配置及ADC所用的GPIO通道
本文选用PA1引脚作为采样输入引脚:
3、GPIOA与ADC初始化后,即可在main中调用函数获得转化后的值void get_ADC_value()
{ int i;
float dat[6], ad_ch1;
/* ### Start conversion ################################# */
HAL_ADC_Start_IT(&hadc);
for(i=0;i<4;i++)
{
dat[i] =(float)ADC_ConvertedValue*3.3/4096;
}
ad_ch1=(dat[0]+dat[1]+dat[2]+dat[3])/4 ;
ADC_ConvertedValueLocal=ad_ch1;
}
/** * AD转换结束回调函数 */
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
ADC_ConvertedValue=HAL_ADC_GetValue(hadc);
}
有多达16 个通道和3个内部通道(温度传感器、参考电压),PA0、PA4、PA5为高速通道,其他为标准通道。
有单次转换模式和扫描模式,扫描模式下对选定的通道自动进行扫描转换。
ADC频率独立于CPU频率外,即使CPU速度低,ADC也可以达到允许最大采样速率1.14 MSPS。
能耗很低频率(10kSPS,25μA;1MSPS,200μA)。
自动关闭功能保证ADC在有效转换阶段期间外能够关闭。
可由DMA控制器控制,工作电压可低至1.65v
模拟看门狗功能
等等。。。
以下是基于上述mcu的ADC单通道多次转换(非DMA)代码,代码已经通过调试,欢迎指正交流。
1、声明相关变量
float ADC_ConvertedValueLocal; uint32_t ADC_ConvertedValue; uint32_t DMA_Transfer_Complete_Count=0; ADC_HandleTypeDef hadc; IWDG_HandleTypeDef hiwdg;
2、ADC初始化,需要初始化ADC配置及ADC所用的GPIO通道
本文选用PA1引脚作为采样输入引脚:
/* * Instance = ADC1. * OversamplingMode = Disabled * ClockPrescaler = PCLK clock with no division. * LowPowerAutoPowerOff = Disabled (For this exemple continuous mode is enabled with software start) * LowPowerFrequencyMode = Enabled (To be enabled only if ADC clock is lower than 2.8MHz) * LowPowerAutoWait = Disabled (New conversion starts only when the previous conversion is completed) * Resolution = 12 bit (increased to 16 bit with oversampler) * SamplingTime = 7.5 cycles od ADC clock. * ScanConvMode = Forward * DataAlign = Right * ContinuousConvMode = Enabled * DiscontinuousConvMode = Enabled * ExternalTrigConvEdge = None (Software start) * EOCSelection = End Of Conversion event * DMAContinuousRequests = ENABLE */ static void MX_ADC_Init(void) { ADC_ChannelConfTypeDef sConfig; /**Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion) */ hadc.Instance = ADC1; hadc.Init.OversamplingMode = DISABLE; hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV1; hadc.Init.Resolution = ADC_RESOLUTION_12B; hadc.Init.SamplingTime = ADC_SAMPLETIME_1CYCLE_5; hadc.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD; hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc.Init.ContinuousConvMode = ENABLE; hadc.Init.DiscontinuousConvMode = DISABLE; hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc.Init.DMAContinuousRequests = ENABLE; hadc.Init.EOCSelection = ADC_EOC_SINGLE_SEQ_CONV; hadc.Init.Overrun = ADC_OVR_DATA_PRESERVED; hadc.Init.LowPowerAutoWait = DISABLE; hadc.Init.LowPowerFrequencyMode = DISABLE; hadc.Init.LowPowerAutoPowerOff = DISABLE; if (HAL_ADC_Init(&hadc) != HAL_OK) { Error_Handler(); } /**Configure for the selected ADC regular channel to be converted. */ sConfig.Channel = ADC_CHANNEL_1; sConfig.Rank = ADC_RANK_CHANNEL_NUMBER; if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK) { Error_Handler(); } }
3、GPIOA与ADC初始化后,即可在main中调用函数获得转化后的值void get_ADC_value()
{ int i;
float dat[6], ad_ch1;
/* ### Start conversion ################################# */
HAL_ADC_Start_IT(&hadc);
for(i=0;i<4;i++)
{
dat[i] =(float)ADC_ConvertedValue*3.3/4096;
}
ad_ch1=(dat[0]+dat[1]+dat[2]+dat[3])/4 ;
ADC_ConvertedValueLocal=ad_ch1;
}
/** * AD转换结束回调函数 */
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
ADC_ConvertedValue=HAL_ADC_GetValue(hadc);
}
相关文章推荐
- SQLite 锁机制学习总结 锁状态转换及锁机制实现代码分析
- SQLite 锁机制学习总结 锁状态转换及锁机制实现代码分析
- 代码转换工具(as3 - cocos2dx) (四) 表达式分析
- RGB彩色图像与灰度图像转换 opencv实现 代码及分析
- 区块链教程Fabric1.0源代码分析configupdate处理通道配置更新
- SQLite 锁机制学习总结 锁状态转换及锁机制实现代码分析
- 基于visual c++之windows核心编程代码分析(20) 纤程与线程的互相转换
- OpenRisc-31-关于在设计具有DMA功能的ipcore时的虚实地址转换问题的分析与解决
- stm32AD单通道与多通道转换(DMA)
- DMA+ADC单通道转换、多通道转换
- 触摸屏代码分析——实现ADC转换完成中断
- ADC多通道逐次转换(不用DMA)
- 《linux 内核完全剖析》 由逻辑地址转换成线性地址代码分析 get_base get_limit 代码分析笔记
- 基于visual c++之windows核心编程代码分析(20) 纤程与线程的互相转换
- STM32F10x_ADC三通道DMA连续转换(3通道、软件单次触发)
- DMA分析之2 代码编写
- 分析工具代码&转换跟踪代码
- 代码分析将double类型的浮点数转换成二进制-实例
- SpringMVC数据绑定与转换代码分析
- STM32F10x_ADC三通道DMA连续转换(3通道、软件单次触发)