[STM32F1] STM32能否用定时器输入捕获触发AD采样

[复制链接]
2848|5
 楼主| 陈永宾0 发表于 2015-12-29 10:25 | 显示全部楼层 |阅读模式
本帖最后由 陈永宾0 于 2015-12-29 10:29 编辑

条件:STM32F103C8
定时器1的通道2 配置为输入捕获 上升沿触发
AD1配置为定时器1通道2触发ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC2;

输入捕获事件可以产生(可产生中断) 但是无法触发AD转换

如果配置定时器1通道2配置为PWM输出比较模式 是可以触发AD转换的

问:STM32是不是不支持定时器输入捕获触发AD转换呢? 求解,,,,,,
lwsn 发表于 2015-12-29 22:35 | 显示全部楼层
应该支持吧,还是查看一下用户手册看看是怎么说的
天灵灵地灵灵 发表于 2015-12-29 23:17 | 显示全部楼层
MA采用:循环模式,在程序查询DMA完成标志即可判断一组数据有没有转换完成;

中断:定时器,DMA,ADC中断未使用;

参考程序:
main.rar (2.6 KB, 下载次数: 293)
稳稳の幸福 发表于 2015-12-30 00:02 | 显示全部楼层
  1. /**
  2.   ******************************************************************************
  3.   * [url=home.php?mod=space&uid=288409]@file[/url]    ADC/TIMTrigger_AutoInjection/main.c
  4.   * [url=home.php?mod=space&uid=187600]@author[/url]  MCD Application Team
  5.   * [url=home.php?mod=space&uid=895143]@version[/url] V3.5.0
  6.   * [url=home.php?mod=space&uid=212281]@date[/url]    08-April-2011
  7.   * [url=home.php?mod=space&uid=247401]@brief[/url]   Main program body
  8.   ******************************************************************************
  9.   * @attention
  10.   *
  11.   * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  12.   * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
  13.   * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
  14.   * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
  15.   * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
  16.   * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  17.   *
  18.   * <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
  19.   ******************************************************************************
  20.   */

  21. /* Includes ------------------------------------------------------------------*/
  22. #include "stm32f10x.h"

  23. /** @addtogroup STM32F10x_StdPeriph_Examples
  24.   * @{
  25.   */

  26. /** @addtogroup ADC_TIMTrigger_AutoInjection
  27.   * @{
  28.   */

  29. /* Private typedef -----------------------------------------------------------*/
  30. /* Private define ------------------------------------------------------------*/
  31. #define ADC1_DR_Address    ((uint32_t)0x4001244C)

  32. /* Private macro -------------------------------------------------------------*/
  33. /* Private variables ---------------------------------------------------------*/
  34. ADC_InitTypeDef           ADC_InitStructure;
  35. DMA_InitTypeDef           DMA_InitStructure;
  36. TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;
  37. TIM_OCInitTypeDef         TIM_OCInitStructure;
  38. __IO uint16_t ADC_RegularConvertedValueTab[32], ADC_InjectedConvertedValueTab[32];

  39. /* Private function prototypes -----------------------------------------------*/
  40. void RCC_Configuration(void);
  41. void GPIO_Configuration(void);
  42.   
  43. /* Private functions ---------------------------------------------------------*/

  44. /**
  45.   * @brief   Main program
  46.   * @param  None
  47.   * @retval None
  48.   */
  49. int main(void)
  50. {
  51.   /*!< At this stage the microcontroller clock setting is already configured,
  52.        this is done through SystemInit() function which is called from startup
  53.        file (startup_stm32f10x_xx.s) before to branch to application main.
  54.        To reconfigure the default setting of SystemInit() function, refer to
  55.        system_stm32f10x.c file
  56.      */     
  57.       
  58.   /* System clocks configuration ---------------------------------------------*/
  59.   RCC_Configuration();

  60.   /* NVIC configuration ------------------------------------------------------*/
  61. //  NVIC_Configuration();

  62.   /* GPIO configuration ------------------------------------------------------*/
  63.   GPIO_Configuration();

  64.   /* TIM1 configuration ------------------------------------------------------*/
  65.   /* Time Base configuration */
  66.   TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  67.   TIM_TimeBaseStructure.TIM_Period = 1000;         
  68.   TIM_TimeBaseStructure.TIM_Prescaler = 71;      
  69.   TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;   
  70.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
  71.   TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
  72.   /* TIM1 channel1 configuration in PWM mode */
  73.   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  74.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;               
  75.   TIM_OCInitStructure.TIM_Pulse = 500;
  76.   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;         
  77.   TIM_OC1Init(TIM1, &TIM_OCInitStructure);

  78.   /* DMA1 Channel1 Configuration ----------------------------------------------*/
  79.   DMA_DeInit(DMA1_Channel1);
  80.   DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
  81.   DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_RegularConvertedValueTab;
  82.   DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  83.   DMA_InitStructure.DMA_BufferSize = 16;
  84.   DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  85.   DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  86.   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  87.   DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  88.   DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  89.   DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  90.   DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  91.   DMA_Init(DMA1_Channel1, &DMA_InitStructure);
  92.   
  93.   /* Enable DMA1 channel1 */
  94.   DMA_Cmd(DMA1_Channel1, ENABLE);

  95.   /* ADC1 configuration ------------------------------------------------------*/
  96.   ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  97.   ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  98.   ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
  99.   ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
  100.   ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  101.   ADC_InitStructure.ADC_NbrOfChannel = 1;
  102.   ADC_Init(ADC1, &ADC_InitStructure);

  103.   /* ADC1 regular channel14 configuration */
  104.   ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_71Cycles5);
  105.   /* Set injected sequencer length */
  106.   ADC_InjectedSequencerLengthConfig(ADC1, 1);
  107.        
  108. ////  /* ADC1 injected channel Configuration */
  109. ////  ADC_InjectedChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_71Cycles5);
  110. ////  /* ADC1 injected external trigger configuration */
  111. ////  ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_None);

  112.   /* Enable automatic injected conversion start after regular one */
  113.   ADC_AutoInjectedConvCmd(ADC1, ENABLE);

  114.   /* Enable ADC1 DMA */
  115.   ADC_DMACmd(ADC1, ENABLE);

  116.   /* Enable ADC1 external trigger */
  117.   ADC_ExternalTrigConvCmd(ADC1, ENABLE);

  118. ////  /* Enable JEOC interrupt */
  119. ////  ADC_ITConfig(ADC1, ADC_IT_JEOC, ENABLE);

  120.   /* Enable ADC1 */
  121.   ADC_Cmd(ADC1, ENABLE);

  122.   /* Enable ADC1 reset calibration register */   
  123.   ADC_ResetCalibration(ADC1);
  124.   /* Check the end of ADC1 reset calibration register */
  125.   while(ADC_GetResetCalibrationStatus(ADC1));

  126.   /* Start ADC1 calibration */
  127.   ADC_StartCalibration(ADC1);
  128.   /* Check the end of ADC1 calibration */
  129.   while(ADC_GetCalibrationStatus(ADC1));

  130.   /* TIM1 main Output Enable */
  131.   TIM_CtrlPWMOutputs(TIM1, ENABLE);  
  132.   while (1)
  133.         {
  134.                 TIM_Cmd(TIM1, ENABLE);
  135.                 /* Test on channel1 transfer complete flag */
  136.                 while(!DMA_GetFlagStatus(DMA1_FLAG_TC1));
  137.                 /* Clear channel1 transfer complete flag */
  138.                 DMA_ClearFlag(DMA1_FLAG_TC1);
  139.                 /* TIM1 counter disable */
  140.                 TIM_Cmd(TIM1, DISABLE);
  141.         }
  142. }
  143. /**
  144.   * @brief  Configures the different system clocks.
  145.   * @param  None
  146.   * @retval None
  147.   */
  148. void RCC_Configuration(void)
  149. {

  150.   /* Enable peripheral clocks ------------------------------------------------*/
  151.   /* Enable DMA1 clock */
  152.   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

  153.   /* Enable GPIOA, GPIOC, ADC1 and TIM1 clock */
  154.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC |
  155.                          RCC_APB2Periph_ADC1 | RCC_APB2Periph_TIM1, ENABLE);
  156. }

  157. /**
  158.   * @brief  Configures the different GPIO ports.
  159.   * @param  None
  160.   * @retval None
  161.   */
  162. void GPIO_Configuration(void)
  163. {
  164.   GPIO_InitTypeDef GPIO_InitStructure;

  165.   /* Configure TIM1_CH1 (PA8) as alternate function push-pull */
  166.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  167.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  168.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  169.   GPIO_Init(GPIOA, &GPIO_InitStructure);

  170.   /* Configure PC.06 as output push-pull */
  171.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  172.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  173.   GPIO_Init(GPIOC, &GPIO_InitStructure);

  174.   /* Configure PC.01 and PC.04 (ADC Channel11 and Channel14) as analog input */
  175.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_4;
  176.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  177.   GPIO_Init(GPIOC, &GPIO_InitStructure);
  178. }
  179. #ifdef  USE_FULL_ASSERT

  180. /**
  181.   * @brief  Reports the name of the source file and the source line number
  182.   *         where the assert_param error has occurred.
  183.   * @param  file: pointer to the source file name
  184.   * @param  line: assert_param error line source number
  185.   * @retval None
  186.   */
  187. void assert_failed(uint8_t* file, uint32_t line)
  188. {
  189.   /* User can add his own implementation to report the file name and line number,
  190.      ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  191.   /* Infinite loop */
  192.   while (1)
  193.   {
  194.   }
  195. }

  196. #endif

  197. /**
  198.   * @}
  199.   */

  200. /**
  201.   * @}
  202.   */

  203. /******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/


sonicll 发表于 2020-9-28 18:04 | 显示全部楼层
手册上写的timer事件可以触发ADC,实际上只有比较模式的事件才能触发ADC,捕获事件不行
香水城 发表于 2020-9-29 14:00 | 显示全部楼层
本帖最后由 香水城 于 2020-9-29 14:02 编辑

这个骨灰级的帖子翻出来了。

整体上,定时器的捕获/比较事件是可以作为ADC的触发事件的,但在具体应用时要结合具体通道来看。
因为不是所有通道的输入捕获或比较输出事件都可以用来触发ADC。  

   /*!< ADC group regular conversion trigger from external peripheral: TIM1 channel 4 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */
这点要查看手册 或者 通过CUBEMX配置时即可得到确认。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

967

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部