STM32利用标准库的方式输出PWM(proteus仿真)

首先打开proteus仿真软件,绘制电路图:

其中示波器的添加很简单的,看图:

再来看看咱们最后程序的效果:

下面就是程序代码了,新建两个文件PWM.c和PWM.h文件,所属关系如图:

整个的编程思路就是:

第一步:RCC开启时钟,把我们要用 的TIM外设和GPIO外设的时钟打开

第二步:配置时基单元

第三步:配置输出比较单元

第四步:配置GPIO口,初始化为复 用推挽输出的配置

第五步:运行控制,启动计数器。

需要用到的引脚定义图,并不是每一引脚都能输出PWM的,要看引脚上有没有这个功能或是复用功能:

另外总结了一下PWM设置相关的函数,如图:

另外就是PWM的频率,占空比,分辨率的计算方法:

具体程序中的计算方法,如图:

好了PWM.c的程序:

#include "stm32f10x.h"                  // Device headervoid PWM_Init(void)
{//第一步:RCC开启时钟,把我们要用的TIM外设和GPIO外设的时钟打开RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//第二步:配置时基单元TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStruct.TIM_Period = 100-1;TIM_TimeBaseInitStruct.TIM_Prescaler = 720-1;TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);//第三步:配置输出比较单元TIM_OCInitTypeDef TIM_OCInitStruct;TIM_OCStructInit(&TIM_OCInitStruct);TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStruct.TIM_Pulse = 0;TIM_OC1Init(TIM2, &TIM_OCInitStruct);//第四步:配置GPIO口,初始化为复用推挽输出的配置GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStruct);//第五步:运行控制,启动计数器。TIM_Cmd(TIM2, ENABLE);}//这个函数就是设置比较器CCR的值,以达到实时控制占空比的目的
void SET_Compare(uint16_t num)
{TIM_SetCompare1(TIM2, num);
}

PWM.h的程序:

#ifndef __PWM_H
#define __PWM_Hvoid PWM_Init(void);void SET_Compare(uint16_t num);#endif

main.c的主程序:

#include "stm32f10x.h"                  // Device header
#include "OLED.h"
#include "Delay.h"
#include "PWM.h"uint16_t i=0;
int main(void)
{OLED_Init();       //oled  屏幕初始化PWM_Init();while(1){for(i=0; i<100; i++){SET_Compare(i);Delay_ms(10);}for(i=0; i<100; i++){SET_Compare(100-i);Delay_ms(10);}}
}

整个过程是用不到OLED的,我没有把初始化代码删掉,是为了如果想查看一些变量的值的话,用OLED显示出来,会很方便的。还有一个原因是这个工程代码是复制了OLED显示的工程而来,懒得删了,就留下了。程序中用到了延时两个延时文件要有,整个工程的代码文件我之前分享过,没有的可以去我之前的文章找下载链接,复制改名就ok了。

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

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

相关文章

LCR 120. 寻找文件副本(数组)

设备中存有 n 个文件&#xff0c;文件 id 记于数组 documents。若文件 id 相同&#xff0c;则定义为该文件存在副本。请返回任一存在副本的文件 id。 示例 1&#xff1a; 输入&#xff1a;documents [2, 5, 3, 0, 5, 0] 输出&#xff1a;0 或 5提示&#xff1a; 0 ≤ docum…

蓝桥杯刷题(三)

一、P8752 [蓝桥杯 2021 省 B2] 特殊年份&#xff08;洛谷&#xff09; 题目描述 今年是 2021 年&#xff0c;2021 这个数字非常特殊, 它的千位和十位相等, 个位比百位大 1&#xff0c;我们称满足这样条件的年份为特殊年份。 输入 5 个年份&#xff0c;请计算这里面有多少个…

VBA_NZ系列工具NZ02:VBA读取PDF使用说明

我的教程一共九套及VBA汉英手册一部&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到数据库&#xff0c;到字典&#xff0c;到高级的网抓及类的应用。大家在学习的过程中可能会存在困惑&#xff0c;这么多知识点该如何组织…

亚马逊店铺解决和预防订单下滑的技巧

1. 保持账号的良好表现。不要销售侵权产品&#xff0c;发货要及时&#xff0c;能有追踪号的就带可查询追踪号&#xff0c;能发FBA的就通过FBA发货。 2. 持续做好产品优化工作&#xff0c;及时留意大环境的变化和平台政策变动。遇到编辑权限受限&#xff0c;可开case咨询或申请…

LeetCode.2129. 将标题首字母大写

&#x1f354;题目 2129. 将标题首字母大写 &#x1f35f;分析 这道题目描述的很清晰&#xff0c;我们只需要将给定的字符串按照空格划分成字符串数组 str&#xff0c;然后判断 str[i] 的长度如果 <2 &#xff0c;则将 str[i] 转为小写&#xff0c;如果 str[i] 的长度 &g…

habitat中的坑(一):训练模型的时候找不到数据

在habitat中训练一个模型需要指定配置文件&#xff0c;&#xff08;根据目前的学习&#xff09;一般要指定两个yaml文件&#xff1a; 一个是训练的配置文件一个是任务的配置文件 举例如下&#xff1a; import random import numpy as np from habitat_baselines.common.base…

JVM 面试题

1、什么情况下会发生栈内存溢出。 栈内存溢出通常发生在以下几种情况中&#xff1a; 函数递归调用过深&#xff1a; 当函数递归调用自身且没有合适的退出条件时&#xff0c;每次递归调用都会在栈上分配一个新的栈帧来存储局部变量、返回地址等信息。如果递归层次过多&#xff…

JavaSpringBoot的@Value设置默认值,用冒号:

JavaSpringBoot的Value设置默认值,用冒号: JavaSpringBoot的Value设置默认值,用冒号: 如 Value("${property001:默认值} ABC abc &#x1f446;&#x1f447;&#x1f448;&#x1f449; Hello World 你好世界")private Object property001;public Object getPrope…

[数据集][图像分类]棉花叶子病害分类数据集2293张4类别

数据集类型&#xff1a;图像分类用&#xff0c;不可用于目标检测无标注文件 数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;2293 分类类别数&#xff1a;4 类别名称:["diseased_cotton_leaf"…

Pinia基本使用示例

1. 定义Store【src\stores\counter.ts】。 (1). 组合式API写法。 import { ref, computed } from vue import { defineStore } from pinia export const useCounterStore defineStore(counter, () > {const count ref(0)const doubleCount computed(() > count.value…

基于多源信息融合的巡飞弹对地目标识别与毁伤评估

源自&#xff1a;系统仿真学报 作者&#xff1a;徐艺博 于清华 王炎娟 郭策 冯世如 卢惠民 摘 要 面向利用多枚巡飞弹对地面高防御移动目标进行打击的任务场景&#xff0c;提出一种基于多源信息融合的巡飞弹对地移动目标识别与毁伤评估方法。基于IoU判定实现红外图像与可…

E2697A 安捷伦高阻抗适配器

181/2461/8938描述: E2697A高阻抗适配器允许将需要高阻抗输入的探头&#xff08;例如无源探头、电流探头&#xff09;连接到Infiniium 54850、80000和90000系列高性能示波器。E2697A高阻抗适配器扩展了Agilent Infiniium高性能示波器的功能&#xff0c;使其成为电源、逆变器、…

数据挖掘

一.数据仓库概述&#xff1a; 1.1数据仓库概述 1.1.1数据仓库定义 数据仓库是一个用于支持管理决策的、面向主题、集成、相对稳定且反映历史变化的数据集合。 1.1.2数据仓库四大特征 集成性&#xff08;Integration&#xff09;&#xff1a; 数据仓库集成了来自多个不同来源…

2403d,d解析c++符号

原文 这里有个简单的无需更改动态库或应该动态链接到它的DMD项目中源码的方法.当然,并不能解决潜在的C调用约定问题(C不存在),但可在有它们时再调查. 我做了个小小的概念证明,它有效.为了具体起见,假设动态库是libx.dll,使用安装了最新MSYS2的(mingw64)gcc构建它,因为这是我需…

闭包的理解和使用场景

文章目录 一、是什么二、使用场景柯里化函数使用闭包模拟私有方法其他 三、注意事项 一、是什么 一个函数和对其周围状态&#xff08;lexical environment&#xff0c;词法环境&#xff09;的引用捆绑在一起&#xff08;或者说函数被引用包围&#xff09;&#xff0c;这样的组…

2024-03-10 c++

&#x1f338; MFC下拉框控件 | Combo Box eg 计算器 1。新建MFC项目&#xff08;基于对话框、静态库&#xff09; 2。添加控件&#xff0c;删除初始的3个多余控件 加3个edit control 加1个combo box&#xff0c;属性sort改为false&#xff0c;data为 ;-;;;% 加1个static text…

数据可视化引领工业智能化时代的浪潮

随着工业数字化的迅速发展&#xff0c;数字孪生技术作为一项新兴技术&#xff0c;正日益受到工业界的关注和应用。数字孪生是将实际物理对象或过程与其数字化模型相连接的先进技术。通过数字孪生&#xff0c;工业企业可以在虚拟世界中模拟和测试现实世界的产品和生产过程&#…

C++ 指针和引用引用详解

C 指针和引用是两种非常重要的概念&#xff0c;它们在内存操作中起着至关重要的作用。在这篇文章中&#xff0c;我们将深入探讨C指针和引用的基本概念、分类、转换方法、应用场景以及相关的问题与陷阱。 1. 指针的基本概念和分类 1.1 指针的概念 指针是一个变量&#xff0c;…

「CISP考试1000题精讲」CISP练习题中的6道题精讲

第一题 Kerberos 协议是一种集中访问控制协议。它能在复杂的网络环境中,为用户提供安全的单点登录服务。单点登录是指用户在网络中进行一次身份认证,便可以访问其授权的所有网络资源,而不再需要其他的认证过程,实质是消息 M 在多个应用系统之间的传递或共享。其中消息 M 是…

js 添加、删除DOM元素

1. js添加、删除DOM元素 1.1. 添加DOM元素 1.1.1. appendChild()方法 该方法添加的元素位于父元素的末尾&#xff0c;使用方法&#xff1a; parentNode.appenChild(NewNode) // parentNode是需要添加元素的容器&#xff0c;NewNode是新添加的元素   创建一个li元素并添加到…