【蓝桥杯嵌入式】定时器的PWM输出与输入捕获(测量频率与占空比)

本文主要是介绍【蓝桥杯嵌入式】定时器的PWM输出与输入捕获(测量频率与占空比),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【蓝桥杯嵌入式】定时器的PWM输出与脉冲输 入捕获(测量频率与占空比)

  • PWM输出
    • cubemx配置
    • 程序设计
  • 输入捕获
    • cubemx配置
    • 程序设计
  • 真题典例分析

PWM输出

cubemx配置

  PWM输出引脚配置,这里使用PA6和PA7引脚输出两路PWM信号,分别对应的是由TIM16和TIM17的通道1产生的PWM信号,同时配置定时器的预分频系数PSC和自动重装载值CCR,PWM信号频率即为:
frq = 80000000 / (PSC+1)/ (ARR+1)
这里预分频系数为800-1,自动重装载值为100,则频率 frq = 80000000 / 800 / 100 = 1K Hz,占空比预设置为20%

同理 对TIM17通道1进行相关配置,使得输出频率为2KHz,占空比初始化为20%的PWM信号

程序设计

通过cubemx配置后,初始化信号的参数如下所示

//PA6 1KHz 20%
TIM16->PSC = 800-1;
TIM16->ARR = 100-1;
TIM16->CCR1 = 20;//PA7 2KHz 20%
TIM17->PSC = 400-1;
TIM17->ARR = 100-1;
TIM17->CCR1 = 20;

启动PWM输出: 启动TIM16与TIM17的通道1输出PWM信号

HAL_TIM_PWM_Start(&htim16,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim17,TIM_CHANNEL_1);

修改PWM信号占空比: 通过改变TIM16与TIM17通道1的自动重装载值来改变PWM信号的占空比

TIM16->CCR1 = 50;
TIM17->CCR1 = 25;

修改PWM信号的频率:,可以通过改变预分频系数PSC,或者改变自动重装值,但通过修改自动重装载值修改频率的同时会修改占空比。

TIM16->PSC = 400-1;	//将PA6引脚的频率改为2000 Hz 占空比保持不变
TIM17->ARR = 50-1;	//将PA7的频率改为4000 Hz 但占空比变为原来的2倍

输入捕获

  • 输入捕获可以用来测量PWM波的频率与占空比
  • 输入捕获模式下,当通道输入引脚出现指定高电平跳变时,当前CNT的值将被锁存到CCR中

cubemx配置

  通过查看原理图发现,开发板自带2路555信号发生器,分别通过接口J9和J10接到开发板的PB4和PA15端口,这里取下跳线帽,通过杜邦线将PA6、PA7的PWM信号接入到PA15、PB4引脚,用于检测PWM信号的频率与占空比。

  通过配置PB4引脚为TIM3_CH1,开启定时器3,设置预分频系数,配置从模式、触发源及其时钟源,分别设置通道1和通道2为直接模式与间接模式,同时设置为上升沿触发和下降沿触发。

同理对TIM2进行同样的配置

程序设计

初始化开启定时器的通道捕获

HAL_TIM_IC_Start(&htim2,TIM_CHANNEL_1);
HAL_TIM_IC_Start(&htim3,TIM_CHANNEL_1);
HAL_TIM_IC_Start(&htim2,TIM_CHANNEL_2);
HAL_TIM_IC_Start(&htim3,TIM_CHANNEL_2);

频率和占空比的测量

void pwm_process(void)
{//测量频率frq1 = 1000000.0f / (HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1)+1);frq2 = 1000000.0f / (HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_1)+1);//测量占空比duty1 = (HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_2)+1) * 100.0f / (HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1)+1);duty2 = (HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_2)+1) * 100.0f / (HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_1)+1);
}

真题典例分析

  • PA6输出信号占空比通过电位器R37进行调节如图调节
  • 通过B2按键切换高低频模式,并通过LCD进行实时显示

adc数据采集功能函数:

double getAdcVal(ADC_HandleTypeDef *pin)
{double dat;HAL_ADC_Start(pin);dat = HAL_ADC_GetValue(pin);return dat * 3.3 / 4096;	
}

adc业务逻辑程序进程函数: 首先确定adc数据采集周期为200ms采集一次,并进行数字滤波,最后通过电压与占空比的关系,来确定PA6引脚的占空比。

u32 adc_tick = 0;
double adc_sum = 0;
void adc_process(void)
{//adc采集周期 200msif(uwTick - adc_tick < 200)return;adc_tick = uwTick;//adc数字滤波for(uchar i = 0; i < 10; i++)adc_sum += getAdcVal(&hadc2);vr37 = adc_sum / 10.0f;adc_sum = 0;//通过电压改变PWM占空比if(vr37 <= 1.0f)TIM16->CCR1 = 10;else if(vr37 >= 3.0f)TIM16->CCR1 = 85;elseTIM16->CCR1 = (uchar)(37.5 * (vr37 - 1.0f) + 10);
}

按键二: 启动5秒定时,并确定是从高频到低频,还是从低频到高频

if(key[1].single_flag == 1)
{//按键2短按业务逻辑程序//shake_flag = !shake_flag;up_flag = !up_flag;					//从低频到高频标志sec5_flag = !sec5_flag;			//5秒定时标志HAL_TIM_Base_Start_IT(&htim7);	//启动定时器 改变分频系数key[1].single_flag = 0;
}

定时器中断服务函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{	if(htim->Instance == TIM7)		//50ms{if(up_flag)psc--;elsepsc++;}
}

PWM进程函数: 频率、占空比的修改与测量

void pwm_process(void)
{//通过修改预分频系数修改频率TIM16->PSC = psc;//检测PWM信号频率frq1 = 1000000.0f / (HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1)+1);frq2 = 1000000.0f / (HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_1)+1);//检测PWM信号占空比duty1 = (HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_2)+1) * 100.0f / (HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1)+1);duty2 = (HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_2)+1) * 100.0f / (HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_1)+1);
}

最后将实时的频率与占空比显示在LCD屏幕

void lcd_process(void)
{if(ui == 0)					//第一个界面显示的内容{sprintf(text,"     Title1 ");LCD_DisplayStringLine(Line1, (unsigned char *)text);	//LCD显示函数sprintf(text,"    frq1:%dHz  ",frq1);LCD_DisplayStringLine(Line3, (unsigned char *)text);	//LCD显示函数sprintf(text,"    duty1:%d%% ",duty1);LCD_DisplayStringLine(Line4, (unsigned char *)text);	//LCD显示函数sprintf(text,"    frq2:%dHz  ",frq2);LCD_DisplayStringLine(Line5, (unsigned char *)text);	//LCD显示函数sprintf(text,"    duty2:%d%% ",duty2);LCD_DisplayStringLine(Line6, (unsigned char *)text);	//LCD显示函数}
}

这篇关于【蓝桥杯嵌入式】定时器的PWM输出与输入捕获(测量频率与占空比)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/889599

相关文章

SpringBoot实现基于URL和IP的访问频率限制

《SpringBoot实现基于URL和IP的访问频率限制》在现代Web应用中,接口被恶意刷新或暴力请求是一种常见的攻击手段,为了保护系统资源,需要对接口的访问频率进行限制,下面我们就来看看如何使用... 目录1. 引言2. 项目依赖3. 配置 Redis4. 创建拦截器5. 注册拦截器6. 创建控制器8.

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

荣耀嵌入式面试题及参考答案

在项目中是否有使用过实时操作系统? 在我参与的项目中,有使用过实时操作系统。实时操作系统(RTOS)在对时间要求严格的应用场景中具有重要作用。我曾参与的一个工业自动化控制项目就采用了实时操作系统。在这个项目中,需要对多个传感器的数据进行实时采集和处理,并根据采集到的数据及时控制执行机构的动作。实时操作系统能够提供确定性的响应时间,确保关键任务在规定的时间内完成。 使用实时操作系统的

顺序表之创建,判满,插入,输出

文章目录 🍊自我介绍🍊创建一个空的顺序表,为结构体在堆区分配空间🍊插入数据🍊输出数据🍊判断顺序表是否满了,满了返回值1,否则返回0🍊main函数 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~ 🍊自我介绍   Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾”

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出 在数字化时代,文本到语音(Text-to-Speech, TTS)技术已成为人机交互的关键桥梁,无论是为视障人士提供辅助阅读,还是为智能助手注入声音的灵魂,TTS 技术都扮演着至关重要的角色。从最初的拼接式方法到参数化技术,再到现今的深度学习解决方案,TTS 技术经历了一段长足的进步。这篇文章将带您穿越时

嵌入式Openharmony系统构建与启动详解

大家好,今天主要给大家分享一下,如何构建Openharmony子系统以及系统的启动过程分解。 第一:OpenHarmony系统构建      首先熟悉一下,构建系统是一种自动化处理工具的集合,通过将源代码文件进行一系列处理,最终生成和用户可以使用的目标文件。这里的目标文件包括静态链接库文件、动态链接库文件、可执行文件、脚本文件、配置文件等。      我们在编写hellowor

嵌入式方向的毕业生,找工作很迷茫

一个应届硕士生的问题: 虽然我明白想成为技术大牛需要日积月累的磨练,但我总感觉自己学习方法或者哪些方面有问题,时间一天天过去,自己也每天不停学习,但总感觉自己没有想象中那样进步,总感觉找不到一个很清晰的学习规划……眼看 9 月份就要参加秋招了,我想毕业了去大城市磨练几年,涨涨见识,拓开眼界多学点东西。但是感觉自己的实力还是很不够,内心慌得不行,总怕浪费了这人生唯一的校招机会,当然我也明白,毕业

解决Office Word不能切换中文输入

我们在使用WORD的时可能会经常碰到WORD中无法输入中文的情况。因为,虽然我们安装了搜狗输入法,但是到我们在WORD中使用搜狗的输入法的切换中英文的按键的时候会发现根本没有效果,无法将输入法切换成中文的。下面我就介绍一下如何在WORD中把搜狗输入法切换到中文。

深入探索嵌入式 Linux

摘要:本文深入探究嵌入式 Linux。首先回顾其发展历程,从早期尝试到克服诸多困难逐渐成熟。接着阐述其体系结构,涵盖硬件、内核、文件系统和应用层。开发环境方面包括交叉编译工具链、调试工具和集成开发环境。在应用领域,广泛应用于消费电子、工业控制、汽车电子和智能家居等领域。关键技术有内核裁剪与优化、设备驱动程序开发、实时性增强和电源管理等。最后展望其未来发展趋势,如与物联网融合、人工智能应用、安全性与