stm32定时器触发adc
什么是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
- 如何设计一套简单、准确调光汽车照明系统(04-26)
- LED未来前景分析,基于555定时器设计的LED控制电路分析(04-18)
- 半导体巨星陨落,555定时器发明者Hans Camenzind逝世(07-16)
- 基于FPGA的洗衣机控制系统的设计与实现(07-27)
- 详解基于555定时器的电容测试仪设计(09-09)
- 振荡电路的工作原理及其特性,附设计集锦(11-28)