STM32——PWM波形输出

news2024/12/27 2:01:08

一、IC和OC

可以看到:定时器除了基本的定时中断功能,输入捕获、输出比较均是STM32定时器的功能

输入捕获IC(Input Capture)

输入捕获是一种用于测量外部信号脉冲宽度或频率的技术。它通过定时器模块捕获外部信号的特定事件(如脉冲的上升沿或下降沿),以便测量脉冲宽度、频率或其他相关参数。在STM32中,除了基本定时器TIM6和TIM7外,其他定时器通常都具有输入捕获功能。输入捕获常用于测量传感器输出、编码器信号、PWM输入信号等。

输出比较OC(Output Compare)

输出比较是通过比较定时器的计数器值与捕获/比较寄存器(CCR)的值,来操作输出电平的一种技术。它可以用来生成一定频率和占空比的PWM波形,实现对外部电路的控制。每个高级定时器和通用定时器在STM32中都拥有多个输出比较通道,这些通道可以独立配置,以生成不同的PWM波形。

捕获/比较寄存器,这个寄存器是输出比较和输入捕获共用的,两种功能在同一时刻只能选择一种执行。先将其用作输出比较来看,输出比较最重要的一个功能就是产生PWM波。也可以看到,通用计时器有四个输出比较通道:OC1~4

其中OC1的内部输出部分如下:

在判断计数器CNT和捕获/比较寄存器CCR(capture /compare  register)的值并确认输出模式后输出一个OC1REF(OC1 Reference),它指的是与输出比较通道1(OC1)相关联的参考信号或电平状态。经过一个选择器,可以看到当oc1ref置0(无效电平)时,原封不动输出;反之,当oc1ref置1(有效电平)时,经过非门,取反。所以,oc1ref的电平状态不仅取决与CNT和CCR的比较,还取决于我们选取怎么样的输出模式

其中输出模式总共有以下几种:

这里细心一点就会发现:PWM模式1和模式2是完全相反的,也就是说,在两种不同模式下,oc1ref在经过选择器时,一个模式ref照常输出,一个模式ref取反。模式1和模式2正好互补,互为相反,所以在运用起来差别也并不太大。这里用的最多的就是PWM模式1。

而从计数模式上来看,PWM也和TIMx在作定时器时一样,也有向上计数模式、向下计数模式和中心对齐模式,关于3种模式的具体资料,可以查看《STM32参考手册》的“14.3.9 PWM模式”一节。

二、PWM输出

脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制。一般用来控制步进电机的速度等等。

STM32的定时器除了基本定时器TIM6和TIM7之外,其他的定时器都可以用来产生PWM输出,其中高级定时器TIM1和TIM8可以同时产生7路的PWM输出,而通用定时器也能同时产生4路的PWM输出。

PWM输出管脚

PWM的输出管脚是确定好的,具体的引脚功能可以查看《STM32参考手册》的“8.3.7 定时器复用功能重映射”一节。比如说TIM3的第2个通道,在没有重映射的时候,指定的管脚是PA.7,如果设置部分重映射之后,TIM3_CH2的输出就被映射到PB.5上了,如果设置了完全重映射的话,TIM3_CH2的输出就被映射到PC7上了。

在此需要强调的是,不同的TIMx有分配不同的引脚,但是考虑到管脚复用功能,STM32提出了一个重映射的概念,就是说通过设置某一些相关的寄存器,来使得在其他非原始指定的管脚上也能输出PWM。但是这些重映像的管脚也是由参考手册给出的。

复用和重映射的区别:

(1)可以看到PA9引脚、PA10引脚都有三种功能。其中第一项PA9和PA10是其默认功能,默认功能为GPIO功能,也即是作为通用的输入输出端口使用。这样我们就知道,当PA9引脚和PA10引脚不在作为默认的GPIO功能使用,而是作为USART1_TX/USART1_RX或者作TIM1_CH2/TIM1_CH3功能使用时,就是对PA9引脚和PA10引脚的复用。简单来说就是:一个引脚有多种用法就叫复用

(2)重映射就是把原本属于这个引脚的复用映射到另外一个引脚上去,但是能不能够映射就要看上图引脚定义的重定义功能有没有原本引脚的复用功能存在。简单来说:赋予另外一个引脚他没有的复用功能

 PWM输出信号

PWM输出的是一个方波信号,信号的频率是由TIMx的时钟频率和TIMx_ARR预分频器所决定的,而输出信号的占空比则是由TIMx_CRRx寄存器确定的。

因此,可以通过向CRR中填入适当的数来输出自己所需的频率和占空比的方波信号。

三、TIMER输出PWM实现步骤

代码编写依托于以下:

定时器部分:

PWM配置部分:

定时器配置上篇文章讲过了,以下是PWM部分:

1.开启时钟;

RCC_APB1PeriphClockCmd (RCC_APB1Periph_TIM2,ENABLE );

RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA,ENABLE );

2.配置GPIO

    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Mode =GPIO_Mode_AF_PP;
    GPIO_InitStruct.GPIO_Pin =GPIO_Pin_15 ;
    GPIO_InitStruct.GPIO_Speed =GPIO_Speed_50MHz ;
    GPIO_Init (GPIOA,&GPIO_InitStruct);

3.设置TIMx定时器的相关寄存器

    TIM_InternalClockConfig(TIM2);//开启内部时钟
    
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
    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_TimeBaseInitStruct.TIM_RepetitionCounter =0;//重复计数器是高级定时器才会用到,这里给0即可
    TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);//初始化定义

4.设置TIMx定时器的PWM相关寄存器

    TIM_OCInitTypeDef TIM_OCInitStruct;
    //  TIM_OCStructInit(&TIM_OCInitStruct);  ——>>PWM结构体内部成员有些是高级定时器才会进行配置,所以我们只需要保持默认值即可,该函数的作用就是设置默认值,如果有子成员需要修改,再在下面进行修改即可;
    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 =90;//CCR
    TIM_OC1Init(TIM2,&TIM_OCInitStruct);

第1步需要注意的是通用定时器TIMx是由APB1提供时钟,而GPIO则是由APB2提供时钟。注意,如果需要对PWM的输出进行重映像的话,还需要开启引脚复用时钟AFIO。

第2步设置GPIO时钟时,GPIO模式应该设置为复用推挽输出GPIO_Mode_AF_PP,如果需要引脚重映像的话,则需要用GPIO_PinRemapConfig()函数进行设置。

第3步设置TIMx定时器的相关寄存器。

第4步设置PWM相关寄存器,首先要设置PWM模式(默认情况下PWM是冻结的),然后设置占空比(根据前面所述公式进行计算),再设置输出比较极性:当设置为High时,输出信号不反相,当设置为Low时,输出信号反相之后再输出。最重要是是要使能TIMx的输出状态和使能TIMx的PWM输出使能。

相关设置完成之后,就可以通过TIM_Cmd()来打开TIMx定时器,从而得到PWM输出了。

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

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

相关文章

创客匠人对话标杆(上)|央视嘉宾揭秘心理抑郁赛道爆款的六大逻辑

今天是我们对话标杆栏目第61期内容,本期我们邀请到【钧岚心理平台】创始人杨钧岚老师,为我们分享了心理学领域如何精准定位垂直赛道,并详细阐述了她如何打造爆品,以高质量课程交付,高效实现高客单转化,实现…

centos8以上系统安装docker环境

由于docker官方更新了相关镜像路由,导致国内用户无法正常手段安装使用docker,本人推荐使用下面操作进行安装。 1.docker-ce安装 # 添加docker-ce仓库,本次使用的是阿里云的仓库 dnf config-manager --add-repo https://mirrors.aliyun.com/do…

c#实现数据导出为PDF的方式

PdfSharp vs iTextSharp: C#中PDF导出功能比较 PdfSharp 优点 轻量级:适合简单的PDF生成任务易于学习:API相对简单,学习曲线较缓开源:提供开源版本,可自由使用和修改纯C#实现:不依赖外部库或COM组件支持…

江协科技STM32学习笔记(第11章 RTC实时时钟)

第11章 RTC实时时钟 实时时钟本质上是一个定时器,但是这个定时器是专门用来产生年月日时分秒,这种日期和时间信息的。学会了RTC实时时钟,就可以在STM32内部拥有一个独立运行的钟表。想要记录或读取日期和时间,就可以通过操作RTC来…

【机械原理学习】——《机械原理》(第二版)机构部分

机械原理 绪论: 机械机器机构 第一章:平面机构的结构分析 构件与零件 每个独立运动的单元体称为构件机构总是由一些零件组成的‌过盈配合是指两个配合零件之间存在一定的过盈量,即一个零件的孔径比另一个零件的轴径小,装配时…

算法:排序(下)

六、快速排序 快速排序用到了分治思想,同样的还有归并排序。乍看起来快速排序和归并排序非常相似,都是将问题变小,先排序子串,最后合并。不同的是快速排序在划分子问题的时候经过多一步处理,将划分的两组数据划分为一…

【IPD流程】产品开发V模型阶段介绍

目录 阶段简介 配图 阶段详解 作者简介 阶段简介 V模型大体可以划分为以下几个不同的阶段步骤: 需求分析、软件需求分析、概要设计、详细设计、软件编码、单元测试、集成测试、系统测试、验收测试。配图 refer:https://t.zsxq.com/NS41O 阶段详解 客户需求定义: 此阶段…

C/C++圣诞树代码

目录 系列文章 写在前面 圣诞节 C语言 圣诞树 写在后面 系列文章 序号目录直达链接1爱心代码https://want595.blog.csdn.net/article/details/1363606842李峋同款跳动的爱心https://want595.blog.csdn.net/article/details/1397222493满屏飘字代码https://want595.blog.…

247.2k star! 超强大的私有化ChatGPT,支持图像识别/文生图/语音输入/文本朗读,个人电脑即可运行!试试吧

今天作者带大家实现一个普通配置电脑即可运行的私有化ChatGPT,支持以下功能: 1.界面体验与ChatGPT官方几乎一样。 2.支持多种开源模型,可以聊天、写代码、识别图片内容等。 3.支持文生图。 4.支持麦克风语音输入聊天。 5.支持自动朗读回…

如何在wordpress当中使用插件WP Coder(将html、css、javascript应用到wordpress上)

了解认识阶段 安装并运行好WP Coder之后如下图: 设置全局PHP 禁用gutenberg 输入代码 add_filter(gutenberg_can_edit_post, __return_false, 10); add_filter(use_block_editor_for_post, __return_false, 10); 记得点击save并勾选enable PHP code 禁用之后打…

从0开始Vue3数据交互之promise详解

目录 前言 1. 预先须知-普通函数和回调函数 1.1 普通函数: 1.2 回调函数: 2. Promise 简介 2.1 简介 2.2 特点 3. Promise 基本用法 3.1 Promise then 1. 没有传参 3.1.1 没有调用resolve 函数和reject 函数时 3.1.2 调用resolve()函数 3.1.3 调用 reject()函数 2…

【Linux详解】进度条实现 Linux下git 的远程上传

📃个人主页:island1314 🔥个人专栏:Linux—登神长阶 ⛺️ 欢迎关注:👍点赞 👂🏽留言 😍收藏 💞 💞 💞 🚀前言 &#x…

张飞硬件1~9电阻篇笔记

电阻有标定值和实际值,关于误差的问题: 精密的电流、电压采样可能会用到1%的精度。如果只是做限流用途的话,用5%就足够。 电阻功率:标定值、额定值、瞬态值: 标定值由封装所决定,例如5W额定值由电路中平…

结构开发笔记(三):solidworks软件(二):小试牛刀,绘制一个立方体

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/141122350 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…

如果忘记了 Apple ID 密码,如何重设

“我忘记了我的 Apple ID 密码,如何恢复我的帐户?”为了方便用户,Apple 允许每个人使用唯一的 Apple ID 和密码激活设备并访问所有 Apple 服务。然而,实际上,手动选择某项并忘记它似乎很容易。例如,许多 Ap…

AI大模型零基础入门学习路线(非常详细)从入门到精通,看这篇就 够了

学习AI大模型从零基础入门到精通是一个循序渐进的过程,涉及到理论知识、编程技能和实践经验。下面是一份详细的指南,帮助你从头开始学习并逐步掌握AI大模型的构建与应用。 第一阶段(10天):初阶应用 该阶段让大家对大…

北斗导航系统:助力保护生态环境的利器

近年来,随着科技的迅猛发展和生态危机的加剧,环保问题成了全球热点话题。而北斗导航系统,作为中国自主研发的全球卫星导航系统,不仅在军事和民用领域显示出了巨大潜力,也在应对生态保护挑战中发挥了重要作用。本篇文章…

ue5正确导入资源 content(内容),content只能有一个

把资源content下的东西,全部拷贝,放在项目的content下 content只能有一个

除毛除臭不够彻底?宠物空气净化器帮你解决

之前养猫的时候就想买一个空气净化器吸一吸空气的浮毛,尤其是夏天,因为夏天天气热流汗也会多,每次外出回家之后全身都是汗的时候想坐下来吹一下空调,但是一坐下去就会发现,沙发上全都是猫咪浮毛,而且还没开…

了解Android

Android 系统架构 从图中可以看出,整个Android操作系统分为五层。它们分别是: 内核层 Android系统是基于Linux内核的,这一层为Android设备的各种硬件提供了底层的驱动。硬件抽象层 该层为硬件厂商定义了一套标准的接口。这样可以在不影响上层…