14.PWM输出

news2024/9/17 8:22:43

1.通用定时器PWM概述:

2.PWM工作过程: 

 2.PWM模式1&PWM模式2:

 3.向上计数配置:

 4.PWM模式:

 5.自动重载的预装载寄存器:

 6.STM32定时器3输出通道引脚:

 7.PWM输出库函数:

  1. PWM输出参数初始化:void TIM_OCxInit(TIM_TypeDef* TIMx,TIM_OCInitTypeDef* TIM_OCInitStruct);
  2. 设置比较值函数:void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx,uint16_t TIM_OCPreload);
  3. 使能自动重装载的预装载寄存器允许位:void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx,FunctionalState NewState);

8.PWM输出配置步骤:

  1. 使能定时器3时钟:RCC_APB1PeriphClockCmd();
  2. 使能GPIO时钟:RCC_APB2PeriphClockCmd();
  3. 初始化IO口为复用功能输出:GPIO_Init();
  4. 使用PB5用作定时器的PWM输出引脚,因此需要开启AFIO复用时钟和设置重映射:      ①AFIO复用时钟:RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);            ②设置重映射:GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);
  5. 初始化定时器,ARR和PSC等:TIM_TimeBaseInit();
  6. 初始化输出比较参数:TIM_OC2Init();
  7. 使能预装载寄存器:TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);
  8. 使能定时器:TIM_Cmd();
  9. 不断改变比较值CCRx,达到不同的占空比效果:TIM_SetCompare2();

9.PWM输出总结:

  • 对于PWM输出,先进行比较,然后再控制输出;
  • 110:①向上计数->(计数器值>设定值,为0;计数器值<设定值,为1);                                           ②向下计数->(计数器值>设定值,为0;计数器值<设定值,为1);
  • 111:①向上计数->(计数器值>设定值,为1;计数器值<设定值,为0);                                             ②向下计数->(计数器值>设定值,为1;计数器值<设定值,为0);
  • CCER:CC1P->设置为0:高电平有效;设置为1:低电平有效;
  • CCER:CC1E->设置为0:关闭;设置为1:打开;
  • 除了基本定时器TIM6和TIM7之外的其他定时器都是可以用来产生PWM输出的,高级定时器TIM1和TIM8可以同时产生多达7路额PWM的输出,通用定时器可以同时产生多达4路的PWM输出;

10.PWM输出实验-呼吸灯:

使用定时器3的PWM功能,输出占空比可变的PWM波,用来驱动LED灯,从而达到LED(PB5)亮度由亮变暗,又由暗变亮,如此循环:

(1)主函数:

#include "delay.h"
#include "led.h"
#include "pwmout.h"


/*
   注意:
      定时器3挂载在APB总线上为72MHz;(72-1)是因为分频器会自动加一,则为72/72=1MHz,1MHz=1us;
      1*500=500us=0.5ms
*/
int main(){
    
    u8 flag=0;       //设置标志位
    u16 i=0;         //计数
    delay_init();                                        //延时初始化
    LED_Init();                                          //LED初始化
    TIM3_CH_PWM_Init(500,72-1);                         //定时器3通道2初始化
    while(1){
        if(flag==0)     
        {
           i++;
           if(i==200)
           {
              flag=1;   //设置标志
           }
        }
        else if(flag==1)
        {
           i--;
           if(i==0)
           {
              flag=0;   //设置标志
           } 
        }
        TIM_SetCompare2(TIM3,i);                      //修改占空比
        delay_ms(20);
    }       
}

(2)头文件:

#ifndef __PWMOUT_H
#define __PWMOUT_H

typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;

void TIM3_CH_PWM_Init(u16 arr,u16 psc);      //PWM输出初始化

#endif

(3)PWM输出功能初始化:

#include "stm32f10x.h"
#include "pwmout.h"



/*
   功能:定时器3PWM(PB5)输出的初始化
   变量:arr:计数周期    psc:预分频值

*/
void TIM3_CH_PWM_Init(u16 arr,u16 psc)
{
   GPIO_InitTypeDef GPIO_InitStruct;
   TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
   TIM_OCInitTypeDef TIM_OCInitStruct;
   
   
   //1.使能GPIO时钟和定时器3时钟,复用时钟;
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);
   
   //2.初始化IO口;
   GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;   //复用推挽输出
   GPIO_InitStruct.GPIO_Pin=GPIO_Pin_5;         //PB5
   GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; //输出速度
   GPIO_Init(GPIOB,&GPIO_InitStruct);
   
   //3.使用定时器3通道2,需要使用到重映射到PB5->部分重映射;
   GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);
   
   //4.初始化定时器3参数;
   TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;         //1分频
   TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;     //计数模式->向上计数
   TIM_TimeBaseInitStruct.TIM_Period=arr;                         //计数周期值
   TIM_TimeBaseInitStruct.TIM_Prescaler=psc;                      //预分频系数
   TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
   
   //5.初始化输出比较参数:
   TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;                   //设置PWM输出模式->模式1(110)
   TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_Low;           //设置比较输出极性->这里是低电平有效
   TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;       //设置输出使能
   TIM_OC2Init(TIM3,&TIM_OCInitStruct);
   
   //6.使能TIMx在CCRx上的预装载寄存器;
   TIM_ARRPreloadConfig(TIM3,ENABLE);
   
   //7.开启定时器;
   TIM_Cmd(TIM3,ENABLE);
   
}  

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

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

相关文章

java 单元测试覆盖率调研

1、覆盖率工具对比 根据网上的资料搜索发现&#xff0c;现在常用的 java 单元测试覆盖率工具主要有&#xff1a; EmmaCoberturaJacocoClover(商用&#xff09; 工具JacocoEmmaCobertura原理使用 ASM 修改字节码修改 jar 文件&#xff0c;class 文件字节码文件基于 jcoverage,…

Squid代理服务器配置及CDN简介

Squid代理服务器配置及CDN简介 一、Squid介绍1、代理的工作机制2、代理服务器的概念3、代理服务器的作用4、Squid代理的类型 二、Squid搭建1、安装Squid服务2、构建传统代理服务器3、构建透明代理服务器4、ACL访问控制5、Squid日志分析6、Squid反向代理 三、CDN1、CDN简介2、CD…

vue项目打包后css js 加载不进来,路径不对的问题

问题描述&#xff1a;本地运行都是正常的&#xff0c;打包后出现css js 加载不进来&#xff0c;路径不对&#xff0c;接口调用地址不对出现undefined字段&#xff0c;如图&#xff1a; 网上差了很多资料&#xff0c;试了很多方法都不行&#xff0c;也有说是 publicPath: ./ 配置…

【Matlab】智能优化算法_正余弦优化算法SCA

【Matlab】智能优化算法_正余弦优化算法SCA 1.背景介绍2.数学模型3.文件结构4.详细代码及注释4.1 func_plot.m4.2 Get_Functions_details.m4.3 initialization.m4.4 main.m4.5 SCA.m 5.运行结果6.参考文献 1.背景介绍 尽管需要更多的函数评估&#xff0c;但文献表明&#xff0c…

【花雕】全国青少年机器人技术一级考试试卷(实操真题之三)

随着科技的不断进步&#xff0c;机器人技术已经成为了一个重要的领域。在这个领域中&#xff0c;机械结构是机器人设计中至关重要的一部分&#xff0c;它决定了机器人的形态、运动方式和工作效率。对于青少年机器人爱好者来说&#xff0c;了解机械结构的基础知识&#xff0c;掌…

MyBatis-Plus学习3 Wrapper条件构造器

组装查询Wrapper Testpublic void test01() {// 查询用户名包含a&#xff0c;年龄在20-30之间&#xff0c;邮箱信息不为null的用户信息QueryWrapper<User> queryWrapper new QueryWrapper<>();queryWrapper.like("name", "a").between("…

Linux Shell脚本中的变量和流程控制

Linux Shell脚本中的变量和流程控制 Linux Shell脚本是一种方便的自动化工具&#xff0c;它可以帮助我们完成各种复杂任务。在本文中&#xff0c;我们将详细介绍Shell脚本中的变量和流程控制语句&#xff0c;以及如何使用它们编写高效、可读性强的脚本。 变量 在Shell脚本中&…

【LeetCode热题100】打卡第31天:买卖股票的最佳时机二叉树中的最大路径和

文章目录 【LeetCode热题100】打卡第31天&#xff1a;买卖股票的最佳时机&二叉树中的最大路径和⛅前言 买卖股票的最佳时机&#x1f512;题目&#x1f511;题解 二叉树中的最大路径和&#x1f512;题目&#x1f511;题解 【LeetCode热题100】打卡第31天&#xff1a;买卖股票…

Hello Vue3

一、为什么要学vue3 vue官网&#xff1a;https://cn.vuejs.org/api/ 这是vue官网的简介&#xff0c;说vue2在23年年底就停止维护了&#xff0c;将来会拥抱vue3,这是事务发展的一个必然趋势。 二、vue3相比于vue2做了哪些方面的改进和优化 以下是Vue3相比于Vue2的一些改进和…

DAY37:贪心算法(四)跳跃游戏+跳跃游戏Ⅱ

文章目录 55.跳跃游戏思路完整版总结 45.跳跃游戏Ⅱ思路完整版为什么next覆盖到了终点可以直接break&#xff0c;不用加上最后一步逻辑梳理 总结 55.跳跃游戏 给定一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃…

weui 密码二次检查校验

检验规则里rules[]增加: equalTo:需要匹配一致的字段名 我这第一个密码是&#xff1a;USR_PWD&#xff0c;第二个密码是&#xff1a;USR_PWD2,让第二个等于第一个就可以了&#xff1a; equalTo:USR_PWD 效果&#xff1a;

MIT 6.S081 教材第七章内容 -- 调度 --下

MIT 6.S081 教材第七章内容 -- 调度 -- 下 引言调度多路复用代码&#xff1a;上下文切换代码&#xff1a;调度代码&#xff1a;mycpu和myprocsleep与wakeup代码&#xff1a;sleep和wakeup代码&#xff1a;Pipes代码&#xff1a;wait, exit和kill真实世界练习 引言 MIT 6.S081 …

0基础学习VR全景平台篇 第54篇: 高级功能-皮肤

功能位置示意 一、本功能将用在哪里&#xff1f; 皮肤功能&#xff0c;摆脱传统VR全景展示样式&#xff0c;自行选择场景与全景分组的界面模板&#xff0c;从而与不同的应用行业风格相互适应&#xff0c;达到最贴切的展示效果。 是在各种风格的VR全景作品中&#xff0c;最快实…

C++ DAY5

1.全局变量&#xff0c;int monster 10000;定义英雄类hero&#xff0c;受保护的属性string name&#xff0c;int hp,int attck&#xff1b;公有的无参构造&#xff0c;有参构造&#xff0c;虚成员函数 void Atk(){monster-0;}&#xff0c;法师类继承自英雄类&#xff0c;私有属…

前端web入门-移动web-day09

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 空间转换 空间转换 – 平移 视距 perspective 空间 – 旋转 立体呈现 – transform-style 空间转换…

Docker学习笔记16

在生产环境中使用Docker&#xff0c;往往需要对数据进行持久化&#xff0c;或者需要在多个容器之间进行数据共享。 容器管理数据有两种方式&#xff1a; 1&#xff09;数据卷&#xff1a;容器内数据直接映射到本地主机环境&#xff1b; 2&#xff09;数据卷容器&#xff1a;…

服务器远程管理工具Xshell安装及使用,传输文件工具安装及使用

两个软件 Xshell 双击输入用户名和密码 也可以通过密钥的方式 怎么生成密钥还没做过 Xftp 一边主机一边服务器&#xff0c;相互拖动就行了

【C#】并行编程实战:实现数据并行(3)

本章继续学习实现数据并行&#xff0c;本文主要介绍取消循环。 本教程对应学习工程&#xff1a;魔术师Dix / HandsOnParallelProgramming GitCode 4、取消循环 在顺序循环中&#xff0c;可以使用 break 来跳出循环&#xff0c;而在并行循环的情况下&#xff0c;由于他…

Unity协程

unity提供了一种类似“多段代码并行执行”的功能&#xff0c;即协程。 我们在定义一个协程的时候&#xff0c;需要遵循类似这样的语法 IEnumerator&#xff08;枚举器接口&#xff09; namespace System.Collections {public interface IEnumerator{object Current { get; }/…

卷积神经网络--猫狗系列【VGG16】

数据集&#xff1a;【文末】 ​ 数据集预处理 定义读取数据辅助类&#xff08;继承torch.utils.data.Dataset&#xff09; import osimport PILimport torchimport torchvisionimport matplotlib.pyplot as pltimport torch.utils.dataimport PIL.Image # 数据集路径train_p…