蓝桥杯嵌入式之脉冲测量讲解

扩展板设有4个可调的波形产生器件TLC551。可以用PWM输入捕获查看它们的占空比和频率。

相关电路图

跳线帽连接图为

其中有两个是十倍的关系,两个是一样的关系。

PWM输入捕获(TIM3)初始化

PWM输入捕获的初始化代码为

void Tim3_Ch_Config(void)
{
  GPIO_InitTypeDef     GPIO_InitStructure;
  NVIC_InitTypeDef     NVIC_InitStructure;
  TIM_ICInitTypeDef      TIM_ICInitStructure;
  
  TIM_TimeBaseInitTypeDef  TIM_BaseInitStructure;

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

  NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  TIM_BaseInitStructure.TIM_Prescaler = 64;
  TIM_TimeBaseInit(TIM3, &TIM_BaseInitStructure);
  
  TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
  TIM_ICInitStructure.TIM_ICFilter = 0x0;

  TIM_PWMIConfig(TIM3, &TIM_ICInitStructure);
  TIM_SelectInputTrigger(TIM3, TIM_TS_TI2FP2);
  TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);
  TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);
  TIM_Cmd(TIM3, ENABLE);
  TIM_ITConfig(TIM3, TIM_IT_CC2, ENABLE);
}

利用TIM3做定时器。可以参考CT117E嵌入式竞赛板\STM32_MCU\stm32f10x_stdperiph_lib\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\TIM\PWM_Input中的main.c文件中的初始化,源代码为

void RCC_Configuration(void)
{
  /* TIM3 clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

  /* GPIOA clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
}
void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;

  /* Enable the TIM3 global Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}
void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  /* TIM3 channel 2 pin (PA.07) configuration */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOA, &GPIO_InitStructure);
}
TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0x0;

TIM_PWMIConfig(TIM3, &TIM_ICInitStructure);

 /* Select the TIM3 Input Trigger: TI2FP2 */
 TIM_SelectInputTrigger(TIM3, TIM_TS_TI2FP2);

  /* Select the slave Mode: Reset Mode */
  TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);

 /* Enable the Master/Slave Mode */
 TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);

 /* TIM enable counter */
 TIM_Cmd(TIM3, ENABLE);

 /* Enable the CC2 Interrupt Request */
 TIM_ITConfig(TIM3, TIM_IT_CC2, ENABLE);

其代码可以直接参考,无需修改。

接下来的Time初始化代码可以参考Time_base的代码。

TIM_BaseInitStructure.TIM_Prescaler = 64;
TIM_TimeBaseInit(TIM3, &TIM_BaseInitStructure);

TIM3中断处理函数

中断处理函数为

void TIM3_IRQHandler(void)
{
  
  if(TIM_GetITStatus(TIM3, TIM_IT_CC2) == SET)
  {
    
    TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);
    IC2Value = TIM_GetCapture2(TIM3);
    
    if (IC2Value != 0)
    {
      DutyCycle = (TIM_GetCapture1(TIM3) * 100) / IC2Value;
      Frequency = SystemCoreClock / 64 / IC2Value ; 
    }else
    {
      DutyCycle = 0;
      Frequency = 0;
    }
  }
}

其中变量IC2Value、DutyCycle 、Frequency 的定义为

__IO uint16_t IC2Value = 0;
__IO uint16_t DutyCycle = 0;
__IO uint32_t Frequency = 0;

可以参考同文件夹下的stm32f10x_it.c文件,源代码为

void TIM3_IRQHandler(void)
{
  /* Clear TIM3 Capture compare interrupt pending bit */
  TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);

  /* Get the Input Capture value */
  IC2Value = TIM_GetCapture2(TIM3);

  if (IC2Value != 0)
  {
    /* Duty cycle computation */
    DutyCycle = (TIM_GetCapture1(TIM3) * 100) / IC2Value;

    /* Frequency computation */
    Frequency = SystemCoreClock / IC2Value;
  }
  else
  {
    DutyCycle = 0;
    Frequency = 0;
  }
}

需要改变的是变量Frequency 再除以64。

PWM输入捕获显示

PWM输入捕获显示代码为

snprintf((char *)str, sizeof(str), " DTY:%d%%   ", DutyCycle);
LCD_DisplayStringLine(Line6, str);
    
snprintf((char *)str, sizeof(str), " FRQ:%.1fKHz  ",Frequency/1000.);
LCD_DisplayStringLine(Line7, str);
    
Delay_Ms(200);

需要注意的是变量Frequency需要继续除以1000。变量DutyCycle、Frequency的定义为

extern __IO uint16_t DutyCycle;
extern __IO uint32_t Frequency;

PWM的使用

因为跳线距离远,所以需要一根杜邦线的连接。

与PWM1的连接

可以通过RP1调节占空比,频率大约为9.4~11.4KHZ(部分占空比可以达到相应的频率)。

与PWM2的连接

可以通过RP2调节占空比,频率大约为1.1~1.2KHZ。

与PULS1的连接

可以通过RP3调节占空比,频率大约为0.4~3.7KHZ(部分占空比可以达到相应的频率)。

与PULS2的连接

可以通过RP4调节占空比,占空比范围为73%~96%频率大约为0.4~3.8KHZ(部分占空比可以达到相应的频率)。

以上的占空比和频率范围会因板子的不同而略有差别。

原文发布于微信公众号 - IT界的小白帽(l1084504793)

原文发表时间:2019-05-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券