微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32学习记录19 定时器触发ADC

STM32学习记录19 定时器触发ADC

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

TIM1 main Output Enable */

TIM_CtrlPWMOutputs(TIM1, ENABLE);

/* Test on channel1 transfer complete flag */

while(!DMA_GetFlagStatus(DMA1_FLAG_TC1));

/* Clear channel1 transfer complete flag */

DMA_ClearFlag(DMA1_FLAG_TC1);

/* TIM1 counter disable */

TIM_Cmd(TIM1, DISABLE);

while (1)

{

}

}

2:关于AD的DMA暂时不介绍,主要介绍定时器和ADC的关联,下面是例程中两者的关键函数

/* TIM1 configuration ------------------------------------------------------*/

/* Time Base configuration */

TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);

TIM_TimeBaseStructure.TIM_Period = 0xFF;

TIM_TimeBaseStructure.TIM_Prescaler = 0x4;

TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

/* TIM1 channel1 configuration in PWM mode */

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

TIM_OCInitStructure.TIM_Pulse = 0x7F;

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;

TIM_OC1Init(TIM1, &TIM_OCInitStructure);

/* Enable ADC1 */

ADC_Cmd(ADC1, ENABLE);

/* TIM1 counter enable */

TIM_Cmd(TIM1, ENABLE);

/* TIM1 main Output Enable */

TIM_CtrlPWMOutputs(TIM1, ENABLE);

/* TIM1 counter disable */

TIM_Cmd(TIM1, DISABLE);


下面分条解释,解释之前需要了解一下ADC外部触发的相关知识:

2.1首先ADC的外部触发必须是上升沿才可以启动转换。

那么如何得到上升沿呢?需要看一下定时器的内容

2.2定时器中有这么一段话:输出部分产生一个中间波形OCxRef(高有效)作为基准,链的末端决定最终输出信号的极性。 也就是说OCxREF只是一个中间信号,我们关心的是最终的信号。

那么最后一句话中最终信号的极性如何确定呢?继续往下看:

2.3末端最终信号的极性确定

从图中可以看到中中间参看信号OC1REF经过TIM1_CCER_CCIE TIM1_CCER_CCIP最终决定OC1的输出极性。看一下数据手册,输出模式中貌似只有PWM模式可以满足2.1中提到的,可以产生一个上升沿来触发AD转换。

现在可以解释代码了,结合官网的源文件和寄存器来说明一下会更加的深刻吧!

3 代码解释

3.1 定时器设定为PWM模式

/* TIM1 configuration ------------------------------------------------------*/

/* Time Base configuration */

TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);

TIM_TimeBaseStructure.TIM_Period = 0xFF;

TIM_TimeBaseStructure.TIM_Prescaler = 0x4;

TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);//上面的代码就不需要解释了,主要就是设置定时器的周期,需要注意的是定时器设置为向上计数模式。下面的代码逐条解释

/* TIM1 channel1 configuration in PWM mode */

①TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //TIM1 脉冲宽度调制模式 1

②TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //使能输出比较状态

TIM_OCInitStructure.TIM_Pulse = 0x7F;

③TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //TIM1 输出比较极性低

TIM_OC1Init(TIM1, &TIM_OCInitStructure);

①头文件中

#defineTIM_OCMode_PWM1((uint16_t)0x0060) 赋值给TIMx->CCMR1,对比下面的文档,可以看出是设置为PWM模式1


②头文件中定义

#defineTIM_OutputState_Enable((uint16_t)0x0001)赋值给TIMx->CCER寄存器
,对照文档看出是使能OC1的输出。

③头文件中定义

#defineTIM_OCPolarity_Low((uint16_t)0x0002)赋值给TIMx->CCER,对照文档看出
OC1是低电平有效,这一点非常重要,说明在最后的输出端口是低电平有效的,

TIMx_ARR:自动装载寄存器, 确定PWM的频率,

TIM_CCRx:捕获/比较寄存器,确定只占空比

TIMx_CNT:计数器寄存器。

也就是说当CNT

3.2 定时器和PWM打开

/* TIM1 counter enable */

TIM_Cmd(TIM1, ENABLE);

/* TIM1 main Output Enable */

TIM_CtrlPWMOutputs(TIM1, ENABLE);

/* TIM1 counter disable */

TIM_Cmd(TIM1, DISABLE);

上面代码相对简单,就是打开定时器,使能PW

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

网站地图

Top