Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >蓝桥杯嵌入式之脉冲测量讲解

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

作者头像
用户5935416
发布于 2019-08-01 02:12:24
发布于 2019-08-01 02:12:24
90100
代码可运行
举报
文章被收录于专栏:IT界的小白帽IT界的小白帽
运行总次数:0
代码可运行

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

相关电路图

跳线帽连接图为

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

PWM输入捕获(TIM3)初始化

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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文件中的初始化,源代码为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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的代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
TIM_BaseInitStructure.TIM_Prescaler = 64;
TIM_TimeBaseInit(TIM3, &TIM_BaseInitStructure);

TIM3中断处理函数

中断处理函数为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 的定义为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
__IO uint16_t IC2Value = 0;
__IO uint16_t DutyCycle = 0;
__IO uint32_t Frequency = 0;

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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输入捕获显示代码为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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的定义为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
蓝桥杯嵌入式之Time和PWM输出讲解
开发板内置有四个16位可同步运行定时器(TIM1、TIM2、TIM3和TIM4)。不过在比赛时一般可以使用SysTick滴答定时器代替Time定时器,所以Time定时器可以简单了解。接下来以TIM3为例讲解Time定时器,其它的使用方法相似。
用户5935416
2019/08/01
1.4K0
stm32电机控制之控制两路直流电机!看完你会了吗
小车使用的电机是12v供电的直流电机,带编码器反馈,这样就可以采用闭环速度控制,这里电机使用PWM驱动,速度控制框图如下:
用户6754675
2019/12/12
3.5K0
蓝桥杯嵌入式之按键中断、蜂鸣器讲解
蓝桥杯嵌入式开发板有多个外部中断,可以通过按键打开中断,执行中断处理函数。但是在往届比赛中很少使用。可以简单了解。
用户5935416
2019/08/01
1.4K0
蓝桥杯嵌入式之按键中断、蜂鸣器讲解
PWM输入输出
输出PWM波的原理是,利用TIM定时器和输出比较,TIM定时器会周期性地线性增长,当计数器的值低于设定的比较值时输出高电平,大于等于比较值时输出低电平。由于是线性增长,高电平时长占整个周期信号时长的比例是固定的,这个比例被称为“占空比”,英文“Duty Cycle”。 在嵌入式系统中,特别是使用定时器来生成PWM信号时,经常使用的是定时器的比较寄存器(Capture/Compare Register,CCR)和自动重载寄存器(Auto-Reload Register,ARR)来控制PWM的占空比。 给定:
WuShF
2024/02/10
9530
PWM输入输出
蓝桥杯嵌入式之USART讲解
USART是通用同步/异步串行接收/发送器。大多数通过USB与电脑进行通信,也是比较好的调试方法。当程序出现长时间找不出错误时,可以在相应的变量后面通过串口将数值发送到电脑端,方便对变量的值进行跟踪查看,快速定位出现错误的地方。
用户5935416
2019/08/01
1.3K0
蓝桥杯嵌入式之USART讲解
(十九)STM32——输入捕获
目录 学习目标 成果展示 内容 获取 配置 代码 总结  ---- 学习目标         本节内容我们要介绍的是输入捕获,其实也和定时器那部分知识是有关系的,所谓输入捕获,通俗一点来讲,其实就是通过检测上升沿和下降沿来计算你的输入持续时间。具体怎么去检测和捕获呢?我们来慢慢介绍。 成果展示 https://live.csdn.net/v/embed/231933 输入捕获实验 内容         关于输入捕获呢,我们主要分成4个部分来介绍,先拆分来理解,再综合在一起理解。      
小点点
2022/12/12
9410
(十九)STM32——输入捕获
【STM32】PWM输出
PWM是“Pulse Width Modulation”的缩写,即脉冲宽度调制,简称脉宽调制。是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单来说,就是对脉冲宽度的控制。
DevFrank
2024/07/24
1790
【STM32】PWM输出
平衡车不用编码器可以吗_编码器结构及工作原理
编码器是一种将角位移或者角速度转换成一连串电数字脉冲的旋转式传感器,我们可以通过编码器测量到底位移或者速度信息。编码器从输出数据类型上分,可以分为增量式编码器和绝对式编码器。
全栈程序员站长
2022/11/10
9560
平衡车不用编码器可以吗_编码器结构及工作原理
蓝桥杯嵌入式之RTC讲解
RTC是实时时钟的简称,可以产生秒、分、时等信息。在蓝桥杯嵌入式比赛中也是比较常考的一个知识点。
用户5935416
2019/08/01
1.5K0
OLED显示红外遥控键码
本遥控器的编码是NEC编码,为PWM(脉冲宽度调制)。 发射红外载波的时间固定,通过改变不发射载波的时间来改变占空比。
WuShF
2024/02/17
2000
OLED显示红外遥控键码
阿克曼运动控制
本节先介绍阿克曼小车模型,小车仿真设计包括SolidWorks和gazebo三维建模。
3D视觉工坊
2023/04/29
9780
阿克曼运动控制
基于STM32F4单片机对步进电机的控制(有代码)「建议收藏」
步进电机是将电脉冲控制信号转变为角位移或线位移的一种常用的数字控制执行元件,又称为脉冲电机。在驱动电源的作用下,步进电机受到脉冲的控制,其转子的角位移量和速度严格地与输入脉冲的数量和脉冲频率成正比。步进电机每接收一个电脉冲,转子就转过一个相应的角度(步距角)。**改变通电顺序可改变步进电动机的旋转方向;改变通电频率可改变步进电动机的转速。**因此,通过控制输入电脉冲的数目、频率及电动机绕组的通电顺序就可以获得所需要的转角、转速及转向,利用单片机就可以很容易实现步进电机的开环数字控制。 传统的步进电机控制方法是由触发器产生控制脉冲来进行控制的,但此种控制方法工作方式单一而且难于实现人机交互,当步进电机的参数发生变化时,需要重新进行控制器的设计。因此适合于单片机控制,单片机通过向步进电机驱动电路发送控制信号就能实现对步进电机的控制。
全栈程序员站长
2022/08/23
8.8K2
基于STM32F4单片机对步进电机的控制(有代码)「建议收藏」
STM32F4 SPI DMA
张贴的代码显示如何配置我的GPIO,定时器,SPI, DMA和NVIC模块,以及一些系统如何工作的解释。 注意,我使用的是STM32F4标准外设库。
小锋学长生活大爆炸
2020/09/24
2.2K0
STM32F4 SPI DMA
基于stm32的智能小车(远程控制、避障、循迹)
学完stm32,总是想做点东西“大显身手”一下,智能小车就成了首选项目,其核心只是就是PWM输出,I/O口引脚电平判断。
全栈程序员站长
2022/11/02
3.4K1
战舰V3 USART1、USART2、UASRT3、UART4、UART5串口配置
在STM32中UART和USART是不相同的,在官方的文档中,大部分配置的都是USART2和UASRT3,对于UART4和UART5却很少有人配置,由于最近在集成项目,所以要用到多种串口,所以索性就配置了UART4和UART5
緣來
2020/01/02
2.1K0
战舰V3 USART1、USART2、UASRT3、UART4、UART5串口配置
STM32F103定时器输出PWM
        IM_TimeBaseInitTypeDef结构体里面有5个成员,TIM6和TIM7的寄存器里面只TIM_Prescaler和TIM_Period,所以使用TIM6和TIM7的时候只需初始化这两个成员即可,另外三个成员是通用定时器和高级定时器才有。
用户11186929
2024/07/01
1780
2016TI杯——寻迹小车
B题:自动循迹小车 1.任务 设计制作一个自动循迹小车。小车采用一片 TI公司LDC1314或LDC1000电感数字转换器作为循迹传感器,在规定的平面跑道自动按顺时针方向循迹前进。跑道的标识为一根直径0.6~0.9mm的细铁丝,按照图1的示意尺寸,用透明胶带将其贴在跑道上。图中所有圆弧的半径均为为20cm±2cm。
全栈程序员站长
2022/06/26
6420
2016TI杯——寻迹小车
(29)STM32——PWM DAC实验笔记
目录 学习目标 成果展示  介绍 简介 硬件 代码 总结  ---- 学习目标         本节内容讲解的是有关PWM转DAC的知识点,其实这种做法我们已经不陌生了,因为在学习51单片机的时候,DA也是通过PWM来实现的。51单片机——AD/DA转换,好了,接下来就让我们开始吧! 成果展示  https://live.csdn.net/v/embed/233690 PWM DAC 介绍 简介         PWM 本质上其实就是是一种周期一定,而高低电平占空比可调的方波。      
小点点
2022/12/12
9480
(29)STM32——PWM DAC实验笔记
stm32f103波形发生器_示波器波形分析
摘要
全栈程序员站长
2022/11/04
1.6K2
104-CH32V307(WCH单片机)学习开发-串口
串口1 void uart_init(u32 bound1){ GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_USART1|RCC_APB
杨奉武
2022/05/25
1.4K1
104-CH32V307(WCH单片机)学习开发-串口
相关推荐
蓝桥杯嵌入式之Time和PWM输出讲解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验