(5)ADC时钟与转换时间 ① ADC输入时钟ADC_CLK由APB2经过分频产生,最大值是14MHz,分频因子由RCC 时钟配置寄存器 RCC_CFGR的位15:14 ADCPRE[1:0]设置,可以是2/4/6/8分频,但没有1 分频。 我们知道APB2总线时钟为72M,而ADC最大工作频率为14M,所以一般设置分频因子为6,这样ADC的输入时钟ADC_CLK的频率为12M...
5、配置通道之后开启ADC转换 ADC_ChannelConfTypeDef ADC1_ChanConf; ADC1_ChanConf.Channel=ch;//通道ADC1_ChanConf.Rank=1;//第1个序列,序列1 ADC1_ChanConf.SamplingTime=ADC_SAMPLETIME_239CYCLES_5;//采样时间HAL_ADC_ConfigChannel(&ADC1_Handler,&ADC1_ChanConf);//通道配置HAL_ADC_Start(&ADC1_Ha...
adct=0;HAL_ADC_PollForConversion(&hadc1,50);//等待转换完成,50为最大等待时间,单位为msif(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC)) { adcval[0] =HAL_ADC_GetValue(&hadc1);//获取AD值printf("ADC1 Reading : %d \r\n",adcval[0]);printf("PA1 True Volt...
比如说,每隔0.1秒,需要连续采样100次。 通常的做法是,使用定时器做一个定时中断,在定时中断里,调用函数: HAL_ADC_Start_DMA(&hadc1,(uint32_t *)ad_value,1000); //启动,同时开启中断 方法和原理都比较简单,就不细说了。 5、连续转换+DMA+定时器触发 方法5是对方法4里面的需求的实现过程进行了优化。S...
在中断中进行处理,当AD转换次数达到1000次的时候,停止转换。 注意事项:函数HAL_ADC_Stop_IT(&hadc1) 需要在中断内调用,中断外调用不起作用。 3、连续转换+DMA+手动启动 在方法2的基础上,引入DMA这个东西。不得不说,DMA真的是很方便,省去了很多手动操作的麻烦。可以直接把指定数量的AD转换值存入数组里,可以单...
HAL_ADC_Start_DMA(&hadc1,(uint32_t *)ad_value,1000); //启动,同时开启中断。 方法和原理都比较简单,这里就不细说了。 5、连续转换+DMA+定时器触发 方法5是对方法4里面的需求的实现过程进行了优化。STM32的定时器可以自动触发AD转换,省去了手动启动的麻烦。例如STM32的TIM1,TIM2,TIM3和TIM4,以及外...
STM32的ADC,由于引入了DMA,以及多种触发源,功能自然强大,用法也多种多样。今天,我们简单说说在单通道情况下,AD采样的几种用法。1、AD单次转换+软件启动最基本的用法,通过程序启动AD,AD采集一次,我们就去读一次。这种情况,建议开启AD转换完成中断,在中断中读出AD值并做处理。这种方式的优点是配置简单,缺点么,太T...
在程序中,我们只需要保证在 ADC 开始使用前(ADC 转换函数调用前),ADC 初始化后,进行校准即可。 2.3 ADC 采样每次都需要校准吗? 这个问题并不能直接回答,我们先来了解一下 调用了 HAL 校准函数以后,STM32 是怎么处理的。 调用STM32 校准函数以后, 校准的结果会被保存在相应的寄存器中,以供后续的ADC测量使用。
六、程序完善 1、完善main函数 添加变量 初始化ADC 启动ADC校正和HAL_ADC_Start——DMA启动 ...
adc_value = HAL_ADC_GetValue(&hadc1); 1. 2. 3. 4. 如图所示为ADC转换结果: 2.2 多通道 1、同2.1进行系统配置 2、设置ADC参数(以双通道为例) 3、加入你的代码 //声明一个全局变量用于存放ADC转换数据 u32 ad_value[2]; 1. 2. //主函数中使用下列代码得到两个通道的单次转换结果 ...