STM32定时器触发ADC怎么配置?

2019-12-20 21:30发布

现在想用定时器来触发ADC转换,每隔一段时间(20ms)触发一次AD,手册上讲有很多的外部触发方式,但是除了在ADC初始化时设置一下T1_CC1作为触发源之外,我就不知道定时器的程序应该怎样设置了:

ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;//T1_CC1作为AD触发源

以下是我的定时器设置,是参照网上的,实时仿真没有反应,没有看到ADC在工作。。。
void ADC_TIM1_Set(void)
{
  TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;
  TIM_OCInitTypeDef         TIM_OCInitStructure;
   //******************Time BASE configutation
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
   TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);        //初始化结构体成员的值  
   
   TIM_TimeBaseStructure.TIM_Period = 2000;                     //1us*2000=2ms
   TIM_TimeBaseStructure.TIM_Prescaler = 71;                  //72M/(71+1)=1M
   TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;         //TIM_CKD_DIV1  
   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;         //递增计数模式         
   TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
   //******************TIM1_Channel1 PWM mode
   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                 //比较输出模式为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);  
         
   //TIM_Cmd(TIM1, ENABLE);                         /* TIM1 counter enable */}

红 {MOD}部分放在主函数里面了,代替// ADC_SoftwareStartConvCmd(ADC1, ENABLE);//ADC1转换开始,这样行吗?

除了时基配置之外,我还配置了输出模式为PWM1模式,这样行吗??

谢谢各位啦!!!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
16条回答
niyapeace
1楼-- · 2019-12-20 23:34
 精彩回答 2  元偷偷看……
Kidult
2楼-- · 2019-12-21 05:29
niyapeace 发表于 2013-4-26 12:25
正好这两天也在你研究定时器触发adc,除了配置tim之外,还要配置adc由外部触发使能,如ADC_ExternalTrigCon ...

TIM_SelectOutputTrigger(TIM3,TIM_TRGOSource_Update); //选择TRGO触发源为计时器更新时间
为何还要加上这一句呢?而且我不太理解您给的注释。

您这个能触发AD采样吗?我看官方给的固件库中ADC的例程——TIMTrigger_AutoInjection里面对于定时器的设置,除了时基设置外,还有一步设置,如下:

/* 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);

我不太理解,为什么要设置成PWM1模式的?我配置成PWM2或者其他的几种模式都能工作,您能帮我解释一下吗?谢谢啦!
另外,您的定时器只有时基设置,能够成功触发AD转换吗?我如果把上面这段删掉而只有时基设置的话,AD是不能触发的。是不是您在定时器的中断程序里面里面触发手动AD了?
niyapeace
3楼-- · 2019-12-21 07:05
额,别您啊您的==。受不起,我也是初学者,正好最近对这块有点感悟。。。。
具体看看stm32中文参考手册第156页和162页的图,adc的触发源事件是固定的,所以只要配置定时器产生特定的事件就行了,当然ADC也要配置成由外部触发的。
拿TIM1举例的话,有TIM1_CC1,TIM1_CC2,TIM1_CC3事件可以触发ADC规则组的转换,所以只需要配置TIM1产生CC事件就行了,PWM1和PWM2都能产生CC事件,CC事件是指compare & capture 比较捕获事件。
而TIM3的话就只有TRGO事件可以用来触发,因为我觉得拿TIM1配置成PWM有点浪费,就选择了TIM3的TRGO事件作为触发源了。
Kidult
4楼-- · 2019-12-21 11:36
niyapeace 发表于 2013-4-27 20:24
额,别您啊您的==。受不起,我也是初学者,正好最近对这块有点感悟。。。。
具体看看stm32中文参考手册第15 ...

好的,谢谢~再问几个问题吧:

多通道规则组的EOC在什么时候产生?是该组里的每个通道转换完之后都会产生EOC吗,还是该组的最后一个通道转换完之后才产生EOC?
DMA请求是在每个通道转换之后就发生的吧?
jj632856828
5楼-- · 2019-12-21 11:58
正在搞这个呢。。。还得继续啃手册
812832193
6楼-- · 2019-12-21 14:17
 精彩回答 2  元偷偷看……

一周热门 更多>