蓝桥杯嵌入式——PWM采集一路频率

CubeMX配置

PB4和PA15分别对应板子上的R39频率输出1,R40频率输出2

通过示波器测量J9,R39的频率范围为PWM1 output = 710hz-22.4khz

                                                          PWM2 output = 630hz-22.0khz

PWM的最小频率对应最大周期:Tmax = 0.001410437235543s

我们的系统时钟为80Mhz,通过80分频给到定时器时钟为1Mhz,因为定时器一般是16位的所以计数值最大为65535,1Mhz的频率计数到65535需要花费0.065535(s),

所以0.001410437235543(s) < 0.065535(s),不会溢出

如何求周期?

使用从模式控制器的复位Reset模式,当触发输入上升沿有效时,计数器复位到默认值0,并把值写入捕获寄存器,再次触发上升沿时,把计数值写入捕获寄存器,通过计数值就能求得周期

开始测量:

我们先测量R39的频率,基于基本定时器工程,打开CubeMX

Slave Mode: 配置从模式为的Reset模式,

Trigger Source: TI1FP1作为从模式寄存器的输入,触发CNT复位

Clock Source:内部时钟用来CNT的计数

Channel1 : 直接输入捕获模式

打开中断

更改NVIC中断优先级为3

生成代码

keil编写代码

为PWM创建.c和.h及其他初始化配置文件,打开源码,从源中copy定时器3和引脚PB4的初始化函数(注意!!引脚的初始化代码要放到基本定时器6里去

注意,这里的htim3需要外部拓展,因为在it.c里也需要调用他

从源代码的it.c中copy TIM3中断函数到主代码的it.c

所有中断的变量都需要这样操作!声明bsp_pwm.h文件,这样才能it.c才会访问到变量htim3

接下来当中断产生时就会跳到it.c的TIM3_IRQHandler(void)所以要在main.c中打开定时器中断

因为我们要用到定时器的捕获功能,所以还需要以中断的形式启动定时器输入捕获,

这两个函数需要背下来!!

当中断产生时进入it.c的定时器3中断服务函数,当捕获事件发生时会有回调函数

Go to他并将此函数写入main.c中

编写中断回调函数,读取通道1的周期值,背下这个函数

作用:当输入捕获中断发生时,就会蹦到这个回调函数里执行代码,在此函数里获取数值

因为我们配置了从模式的复位模式,所以在第一个上升沿时会自动清零,在第二个上升沿时自动计数

把读到的周期数值显示到LCD屏幕上

当旋钮旋到最大时周期显示为1400us,但实际周期为0.0014s

如果要显示频率则用1000000/PWM_T_Count

### 使用STM32G431进行频率测量的方法 对于嵌入式开发中的频率测量任务,尤其是针对STM32系列微控制器而言,可以采用输入捕获模式来完成这一目标。此方法适用于各种型号的STM32芯片,包括但不限于STM32G431,在这类应用中通常有两种主要的技术路线——测频法和测周法[^1]。 #### 测频法简介 当选用测频法时,系统会在固定的时间间隔内统计脉冲的数量,以此计算出信号的周期或频率。这种方法适合于高频信号的检测场景下使用。具体来说,可以通过设置定时器的工作方式为输入捕获模式,并指定相应的通道作为触发源来进行操作。例如: ```c TIM_HandleTypeDef htim; // 初始化定时器并配置成上升沿触发捕捉 htim.Instance = TIM2; htim.Init.Prescaler = 79; htim.Init.CounterMode = TIM_COUNTERMODE_UP; htim.Init.Period = 0xFFFF; htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_IC_Init(&htim); ``` 上述代码片段展示了如何初始化一个定时器实例`htim`以便后续调用其成员函数执行具体的计数逻辑。 #### 测周法概述 另一种常见的做法即为测周法,它是指定时间单位去记录一次完整的波形变化所需经历的时间长度从而推算出对应的频率值。这种方式更适合处理低频情况下的精准度需求较高的场合。同样地,这依赖于对特定外设单元(如定时器)的功能设定以达成目的;比如下面的例子就体现了怎样利用GPIO配合定时器实现对外部事件发生时刻的精确定位: ```c __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* 配置定时器 */ TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1); // 设置触发源为PA6上的TI1边沿信号 ``` 这里选取了PA口的一个引脚连接至外部设备产生的方波输出端子处,再经由内部连线映射到TIM3模块上去监听该线路上传来的电平跳变通知[^3]。 综上所述,无论是采取哪种策略都离不开底层硬件资源的有效调度以及软件层面合理的编程技巧相结合才能达到预期效果。考虑到比赛环境可能存在的不确定性因素影响最终成绩表现,建议参赛者提前做好充分测试验证工作确保方案稳定可靠运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值