首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >蓝桥杯嵌入式之脉冲测量讲解

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

作者头像
用户5935416
发布2019-08-01 10:12:24
7540
发布2019-08-01 10:12:24
举报
文章被收录于专栏:IT界的小白帽IT界的小白帽

扩展板设有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(部分占空比可以达到相应的频率)。

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT界的小白帽 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档