微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > stm32定时器触发adc

stm32定时器触发adc

时间:09-13 来源:互联网 点击:

什么是ADC?

  ADC模块是一种12位的逐次逼近型模拟数字转换器。它有多达19个通道,可测量16个外部和3个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。 ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。
  ADC的任务就是:将连续变化的模拟信号转换为离散的数字信号,以便于我们的数字系统进行计算、处理、存储、控制、显示。

  ADC重要指标:ADC模块的位数和ADC模块的模拟通道

  ADC模块的位数:是指数字量的位数,其实和分辨率有着密切的联系。

  ADC模块的模拟通道:有几个模拟量采集路口,也就是说可以对多少个模拟量进行转换。

stm32的ADC特点

  STM32的ADC有单次转换和连续转换2种模式,这两种模式又可以选择是否结合扫描模式。

  CONT=0,SCAN=0 单次转换模式(Single conversion mode)单次扫描1通道

  CONT=1,SCAN=0 连续转换模式(ConTInuous conversion mode) 连续扫描1通道

  CONT=0,SCAN=1 扫描转换模式(Scan mode):所有ADC_SQR序列通道转换一次后停止。(单次扫描组)

  CONT=1,SCAN=1 扫描转换模式(Scan mode):所有ADC_SQR序列通道转换一次后,再从第一个通道循环。连续扫描一组

  需要注意的是,如果你的转换序列当中有超过一个通道需要转换的话,那么必须要开启扫描模式,否则的话,始终只转换第一通道。

  用ADC1,Regular通道的顺序为Ch0,Ch1,Ch2,Ch3,启动Scan模式

  在单次转换模式下: 启动ADC1,则

  1. 开始转换Ch0

  2. 转换完成后自动开始转换Ch1

  3. 转换完成后自动开始转换Ch2

  4. 转换完成后自动开始转换Ch3

  5. 转换完成后停止,等待ADC的下一次启动。下一次ADC启动从第一步开始

  在连续转换模式下: 启动ADC1,则

  1. 开始转换Ch0

  2. 转换完成后自动开始转换Ch1

  3. 转换完成后自动开始转换Ch2

  4. 转换完成后自动开始转换Ch3

  5. 转换完成后回到第一步

  如果没启动Sacn模式则上述过程中没有2、3、4这三个步骤 上述前提是DisconTInuous模式没有启用。

如何使stm32定时器触发adc

  

  STM32 ADC的常规通道可以由以上图6个信号触发任何一个,我们以使用TIM2_CH2触发ADC1,独立模式,每次仅测一条通道,则ADC的配置如下:(以下代码使用STM32固件库V3.5)

  void ADC_ConfiguraTIon(void)

  {

  ADC_InitTypeDef ADC_InitStructure;

  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;

  ADC_InitStructure.ADC_ScanConvMode = DISABLE; //关闭通道扫描模式

  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //注意不要使用持续转换模式,否则只要触发一次,//后续的转换就会永不停歇(除非CONT清0),这样第一次以后的ADC,就不是由TIM2_CC2来触发了

  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_CC2;//配置TIM2_CC2为触发源

  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;

  ADC_InitStructure.ADC_NbrOfChannel = 1;

  ADC_Init(ADC1, &ADC_InitStructure);

  RCC_ADCCLKConfig(RCC_PCLK2_Div6);//配置时钟(12MHz),在RCC里面还应配置APB2=AHB时钟72MHz,

  ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_1Cycles5);

  ADC_Cmd(ADC1,ENABLE);

  ADC_ResetCalibration(ADC1);

  while(ADC_GetResetCalibrationStatus(ADC1));

  ADC_StartCalibration(ADC1); //Start Calibration register

  while(ADC_GetCalibrationStatus(ADC1)); //waiting for finishing the calibration

  ADC_ExternalTrigConvCmd(ADC1, ENABLE); //设置外部触发模式使能(这个"外部"其实仅仅是相//对于ADC模块的外部,实际上还是在STM32内部)

  }

  这里再注意一点上面左图最顶上的那句话:当外部触发信号被选为ADC规则或注入转换时,只有它的上升沿可以启动转换。这跟下面的定时器2的正确配置关系很大。

  void TIM2_Configuration(void)

  {

  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

  TIM_OCInitTypeDef TIM_OCInitStructure;

  TIM_TimeBaseStructure.TIM_Period = 10000;//设置100ms一次TIM2比较的周期

  TIM_TimeBaseStructure.TIM_Prescaler = 719;//系统主频72M,这里分频720,相当于100K的定时器2时钟

  TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;

  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM2, & T

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top