【嵌入式-定时器】通过呼吸灯案例使用逻辑分析仪分析PWM波形

目的:通过实现呼吸灯分析PWM波形

代码:

PWM.c

#include "stm32f10x.h"                  // Device header/*** @brief	PWM初始化* @param	无* @retval	无
*/
void PWM_Init(void)
{// 使能IO和TIM2RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// 初始化GPIOAGPIO_InitTypeDef GPIO_InitStructure;// 必须使用GPIO_Mode_AF_PP, 使用片上外设的输出替代输出数据寄存器的输出. 因此使用复用推挽输出代替普通推挽输出GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);// 初始化时基单元TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;		// ARRTIM_TimeBaseInitStructure.TIM_Prescaler = 720 - 1;	// PSCTIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);// 初始化输出比较寄存器TIM_OCInitTypeDef TIM_OCInitStructure;TIM_OCStructInit(&TIM_OCInitStructure);TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulse = 0;TIM_OC1Init(TIM2, &TIM_OCInitStructure);// 运行控制TIM_Cmd(TIM2, ENABLE);
}/*** @brief	设置脉冲宽度. 占空比=Compare1/TIM_TimeBaseInitStructure.TIM_Period* @param	* @retval	
*/
void PWM_SetCompare1(uint16_t Compare1)
{TIM_SetCompare1(TIM2, Compare1);
}

main.c

#include "stm32f10x.h"                  // Device header
#include "OLED.h"
#include "Delay.h"
#include "PWM.h"uint16_t Compare1;int main(void)
{OLED_Init();PWM_Init();while(1){PWM_SetCompare1(Compare1);if(Compare1 >= 100){Compare1 = 0;}Compare1 += 20;Delay_ms(10);}
}

逻辑分析仪结果

在这里插入图片描述
可以看到呼吸灯的占空比从20%到100%,且周期T=1ms。
下面用C1代表Compare1,CCR代表捕获/比较寄存器值,下图是使用代码逻辑分析的各变量值及变化关系

C1	CCR		C1		占空比	持续时间
0	0		20		0%		10ms
20	20		40		20%		10ms
40	40		60		40%		10ms
60	60		80		60%		10ms
80	80		100		80%		10ms
100	100		0		100%	10ms
0	0		20		0%		10ms
...

分析

在这里插入图片描述

这里设置了ARR自动重装寄存器值为100,预分频系数为720,即由TIMx定时器输出的频率f=72MHz/100/720=1000Hz,因此周期T=1/f=1ms。所以我们看到的每个周期都是t(高电平)+t(低电平)=1ms。
占空比=t(高电平)/T,这里TIMx定时器使用上升沿模式,计数器值从0到ARR后重装载再次变为0,那么这个ARR值相当于周期(的缩放),那么占空比=TIM_Pulse/TIM_Period 。TIM_Period =100。

main.c中,Compare1 从0递增到100再次变为0,也就是,CCR的值从0递增到100再次变为0,通过控制这个CCR实现对有效电平和无效电平控制。我认为这个电平应该是从最开始的无效电平开始的,但是我采集出来的是20%占空比开始的,因此尝试复位后,终于看到完整波形如下。
在这里插入图片描述

main.c呼吸灯代码如下. 分析同上.

#include "stm32f10x.h"                  // Device header
#include "OLED.h"
#include "Delay.h"
#include "PWM.h"uint8_t i;int main(void)
{OLED_Init();PWM_Init();while(1){for(i = 0; i<=100; i++){PWM_SetCompare1(i);Delay_ms(10);}for(i = 0; i<=100; i++){PWM_SetCompare1(100 - i);Delay_ms(10);}}
}

参考:

PWM驱动LED呼吸灯、舵机、直流电机

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/679794.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于python和matlab的复杂函数拟合的方法、工具以及学习资料

复杂函数拟合是指对具有复杂形式的函数进行拟合,例如积分函数、微分方程、偏微分函数、隐函数、方程组的拟合,通常涉及到非线性、多变量、高维度、高阶、多参数等情况。在实际应用中,复杂函数拟合常常需要结合不同的拟合方法和工具来实现。下面我们将列举常见的复杂函数拟合…

错误的集合(力扣刷题)

个人主页&#xff08;找往期文章包括但不限于本期文章中不懂的知识点&#xff09;&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 由于作者比较菜&#xff0c;还没学malloc这个函数&#xff0c;因此这个题目只写一些与原题大致的思路。 题目链接&#xff1a;645. 错误的集合 - 力扣…

【Django】Django文件上传

文件上传 1 定义&场景 定义&#xff1a;用户可以通过浏览器将图片等文件上传至网站。 场景&#xff1a; 用户上传头像。 上传流程性的文档[pdf&#xff0c;txt等] 2 上传规范-前端[html] 文件上传必须为POST提交方式 表单 <form> 中文件上传时必须带有 enctype…

Java中==和equals的区别

在Java中&#xff0c;运算符和equals()方法是用于比较对象的两种不同方式&#xff0c;它们有不同的作用和用法&#xff1a; 1、 运算符 运算符用于比较两个对象的引用是否指向同一个内存地址&#xff0c;即它们是否是同一个对象的引用。如果两个引用指向相同的对象&#xff0c…

2024年华为OD机试真题-内存冷热标记-Java-OD统一考试(C卷)

题目描述: 现代计算机系统中通常存在多级的存储设备,针对海量workload的优化的一种思路是将热点内存页优先放到快速存储层级,这就需要对内存页进行冷热标记。 一种典型的方案是基于内存页的访问频次进行标记,如果统计窗口内访问次数大于等于设定阈值,则认为是热内存页,否…

day38 面向对象编程、构造函数等(纯概念)

目录 深入对象构造函数实例成员静态成员内置构造函数ObjectArray包装类型StringNumber 深入对象 了解面向对象的基础概念&#xff0c;能够利用构造函数创建对象。 构造函数 构造函数是专门用于创建对象的函数&#xff0c;如果一个函数使用 new 关键字调用&#xff0c;那么这…

创建你的第一个Vue项目(小白专享版本)

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

controlnet的模型下载

controlnet模型有sd15和基于sd15上的fp16版本 fp16版本的模型比较小&#xff0c;但功能效果跟sd15是一样的 controlnet的fp16模型下载地址 https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/tree/main controlnet的openpose里&#xff0c;有个dw_open…

使用Python+OpenCV2进行图片中的文字分割(支持竖版)

把图片中的文字&#xff0c;识别出来&#xff0c;并将每个字的图片抠出来&#xff1b; import cv2 import numpy as npHIOG 50 VIOG 3 Position []水平投影 def getHProjection(image):hProjection np.zeros(image.shape,np.uint8)# 获取图像大小(h,w)image.shape# 统计像素…

Structured Streaming

目录 一、概述 &#xff08;一&#xff09;基本概念 &#xff08;二&#xff09;两种处理模型 &#xff08;三&#xff09;Structured Streaming和Spark SQL、Spark Streaming关系 二、编写Structured Streaming程序的基本步骤 &#xff08;一&#xff09;实现步骤 &…

PaddleDetection学习5——使用Paddle-Lite在 Android 上实现实时的人脸检测(C++)

使用Paddle-Lite在 Android 上实现实时的人脸检测 1 环境准备2. 部署步骤2.1 下载Paddle-Lite-Demo2.2 运行face_detection_demo项目3 使用Opencv对后处理进行优化4 开启手机摄像头进行人脸检测1 环境准备 参考前一篇在 Android 上使用Paddle-Lite实现实时的目标检测功能 2. …

【GAMES101】Lecture 22 物理模拟与仿真

目录 单粒子模拟 显式欧拉方法 改进 中点法/修正的欧拉方法 自适应步长 隐式欧拉方法 非物理改变位置&#xff08;Position-Based / Verlet Integration&#xff09; 刚体模拟 流体模拟 单粒子模拟 先来研究粒子的运动&#xff0c;假设有一个速度矢量场&#xff0c;对…

Java:字符集、IO流 --黑马笔记

一、字符集 1.1 字符集的来历 我们知道计算机是美国人发明的&#xff0c;由于计算机能够处理的数据只能是0和1组成的二进制数据&#xff0c;为了让计算机能够处理字符&#xff0c;于是美国人就把他们会用到的每一个字符进行了编码&#xff08;所谓编码&#xff0c;就是为一个…

(已解决)将overleaf上的文章paper上传到arxiv上遇到的问题。

文章目录 前言初级问题后续问题 前言 首先说一点&#xff0c;将paper的pdf文件直接上传arxiv是不行的&#xff0c;arxiv要求我们要上传源文件&#xff0c;所以才这么麻烦。 初级问题 首先上传文件之后有可能会在下面这个界面出现问题&#xff0c;这里一般都比较常见的问题&a…

Latex排版遇到的常见问题及解决方法

这里写目录标题 1. 图片/ PDF 裁剪1.1 PPT 画图转PDF1.2 PPT裁剪 2. 表格内的文本换行问题2.1 表格跨行显示2.2 表格内文本换行&#xff0c;使用 ‘makecell’ 包 换行2.2 表格内文本添加 圆点 1. 图片/ PDF 裁剪 1.1 PPT 画图转PDF 1.2 PPT裁剪 将输出的PDF文件裁剪成合适尺…

最新酒桌小游戏喝酒小程序源码,带流量主,附带搭建教程

喝酒神器&#xff0c;增加了广告位&#xff0c;根据文档直接替换即可&#xff0c;原版本没有广告位 直接上传源码到开发者端即可 通过后改广告代码&#xff0c;然后关闭广告展示提交&#xff0c;通过后打开即可 搜索adunit-848e5f13d1ff237a替换为你的Banner 搜索adunit-597…

【Spring学习】Spring Data Redis:RedisTemplate、Repository、Cache注解

1&#xff0c;spring-data-redis官网 1&#xff09;特点 提供了对不同Redis客户端的整合&#xff08;Lettuce和Jedis&#xff09;提供了RedisTemplate统一API来操作Redis支持Redis的发布订阅模型支持Redis哨兵和Redis集群支持基于Lettuce的响应式编程支持基于JDK、JSON、字符…

MySQL之Windows下MySQL5.7x.与MySQL8.0.x版本共存安装

MySQL之Windows下多版本共存安装 文章目录 MySQL之Windows下多版本共存安装1. my.ini配置如下&#xff1a;2. 安装3. 修改注册表4. 登录5. 修改root用户密码 场景&#xff1a;老项目跑的MySQL5.7.x&#xff0c;而新项目中用到了MySQL8.0.x,为了开发或测试方便在同一台主机上同时…

2013-2022年上市公司迪博内部控制指数、内部控制分项指数数据

2013-2022年上市公司迪博内部控制指数、分项指数数据 1、时间&#xff1a;2013-2022年 2、范围&#xff1a;上市公司 3、指标&#xff1a;证券代码、证券简称、辖区、证监会行业、申万行业、内部控制指数、战略层级指数、经营层级指数、报告可靠指数、合法合规指数、资产安全…

学习记录691@spring面试之bean的作用域

Spring为Bean定义了5种作用域&#xff0c;分别为Singleton&#xff08;单例&#xff09;、Prototype&#xff08;原型&#xff09;、Request&#xff08;请求级别&#xff09;、Session&#xff08;会话级别&#xff09;和Global Session&#xff08;全局会话&#xff09;。 S…