STM32PWM配置详解笔记

发布者:真诚友谊最新更新时间:2019-08-21 来源: eefocus关键字:STM32  PWM  配置 手机看文章 扫描二维码
随时随地手机看文章

关于STM32的PWM模式配置 ,核心代码如下,以原子的mini板STM32F103RCT6为例子


void TIM1_PWM_Init(u16 arr,u16 psc)//定时器1的PWM初始化

{

/*结构体变量定义*/

GPIO_InitTypeDef GPIO_Initstrue;

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitstrue;

TIM_OCInitTypeDef TIM_OCInitstrue;

/*-------------*/

/*开启TIM1时钟,配置对应管脚(PA8)为复用输出*/

RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 | RCC_APB2Periph_GPIOA,ENABLE);//使能TIM1和GPIOA时钟

GPIO_Initstrue.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽

GPIO_Initstrue.GPIO_Pin = GPIO_Pin_8;

GPIO_Initstrue.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA,&GPIO_Initstrue);//初始化IO口为复用推挽

/*---------------------------------------*/

/*设置TIM1的ARR和PSC*/

TIM_TimeBaseInitstrue.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式

TIM_TimeBaseInitstrue.TIM_Period = arr;//设置自动重装载值,决定周期

TIM_TimeBaseInitstrue.TIM_Prescaler = psc;//设置预分频值,决定周期

TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitstrue);//定时器初始化

/*设置TIM1_CH1的PWM模式,通道,使能TIM1的CH1输出*/

TIM_OCInitstrue.TIM_OutputState = TIM_OutputState_Enable;//比较输出使能

TIM_OCInitstrue.TIM_OCMode = TIM_OCMode_PWM2;//PWM模式2:向上计数,CNT电平

TIM_OCInitstrue.TIM_OCPolarity = TIM_OCPolarity_High;//输出极性高

TIM_OC1Init(TIM1,&TIM_OCInitstrue);//通道1输出PWM

TIM_CtrlPWMOutputs(TIM1,ENABLE);//TIM1,8需要该函数MOE主输出使能

TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);//CH1的CCR1预装载寄存器使能

TIM_ARRPreloadConfig(TIM1,ENABLE);//使能TIM1在ARR上的预装载寄存器

TIM_Cmd(TIM1,ENABLE);//使能TIM1定时器

}


步骤(相关寄存器与函数)


首先,应当使能对应的定时器与IO口时钟。因为PWM是从定时器的一个通道输出而来的。


第二步,通过ARR,PSC寄存器的值来控制PWM波的周期。如该代码,频率为72000K/(899+1)=80KHz


TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitstrue);//定时器初始化


第三步,设置TIM1-CH1的PWM模式,通道


因为min板的LED接PA8,且为低电平亮,所以PWM模式2,CNT

TIM_OC1Init(TIM1,&TIM_OCInitstrue);//通道1输出PWM

第四步,使能CH1通道(也是使能CCR1比较寄存器),使能ARR预装载寄存器。


TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);//CH1的CCR1预装载寄存器使能

TIM_ARRPreloadConfig(TIM1,ENABLE);//使能TIM1在ARR上的预装载寄存器

第五步,使能TIM1定时器


TIM_Cmd(TIM1,ENABLE);//使能TIM1定时器

第五步,仅对于高级定时器才需要此步。F103RCT6的高级定时器为TIM1和8,所以需要。使能刹车和死区寄存器(TIM1_BDTR)的MOE位,以使能整个OCx输出。库函数为


TIM_CtrlPWMOutputs(TIM1,ENABLE);//TIM1,8需要该函数MOE主输出使能

第六步,占空比的修改。TIM_SetCompare1(TIM1,a);这个值当然就是CCR1里装载的值   ,但不能大于arr的值!


哦,对了,也有端口重映射的PWM输出。粘上代码如下


这里我们是假设一下,要把PB5用作定时器的PWM输出引脚,所以要重映射配置,        所以需要开启AFIO时钟。同时设置重映射。        


RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);         

GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);


注意与总结

ARR寄存器的值即自动重装载值,和预分频值共同决定PWM周期。CCRx寄存器的值则是决定着占空比。根据原理,CCRx寄存器的值必须不能大于ARR寄存器的值。。。还有的朋友会疑惑,为啥一个定时器可以同时输出四个通道的PWM,却只有一个CNT计数寄存器,这个嘛,他有一个CNT计数器,却每个通道对应一个CCRx寄存器,这样一来计数归计数,他和四个CCRx寄存器接连比较输出各自的PWM并不矛盾。。。


关键字:STM32  PWM  配置 引用地址:STM32PWM配置详解笔记

上一篇:STM32 TIM1输入捕获配置
下一篇:STM32 多个定时器PWM波输出频率不同。

推荐阅读最新更新时间:2024-11-11 15:41

STM32 USB HID 键盘
USB的HID键盘 报告 0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x09, 0x06, // USAGE (Keyboard) 0xa1, 0x01, // COLLECTION (Application) 0x05, 0x07, //USAGE_PAGE (Keyboard) 0x19, 0x29, //USAGE_MINIMUM (Keyboard ESCAPE) 0x29, 0xe7, //USAGE_MAXIMUM (Keyboard RightAlt) 0x15, 0x00, //LOGICAL_MINIMUM (0) 0x25, 0x01, //L
[单片机]
关于keil uvision5 Debug调试和调试STM32HAL库出现的问题
在使用Keil5调试时,发现点击Debug session调试按钮后, **调试箭头发现不是指在main函数体而是指向disassembly汇编代码区**, 这就导致我们无法调试我们的代码。以下是我的解决方法: 1.点击options for target魔法棒配置目标,选择Debug- 再如下图所示勾选红框部分。 2.再选择Output- 勾选Debug information- 点击ok. 这就可以点击Debug session完成从main函数体进行调试代码了。 当我在使用STM32HAL库进行编写程序完成后,使用keil5进行调试代码时,点击RUN后,突然弹出cannot access target
[单片机]
关于keil uvision5 Debug调试和调试STM32HAL库出现的问题
基于51 单片机之PWM(LED渐变)实验测试
************************** Copyright(C) CaKe ****************************========================== ==============**版权信息 : CaKen工作室 ============== ==============**文件名 : main.c ============== ==============**作者 : CaKen ============== ==============**版本号 : V1.0 ============== ==
[单片机]
在Mac OS X中使用VIM开发STM32(3)
在上一篇文章中,我们安装了ctags插件,ctags能对我们的源代码文件中的元素建立索引表,但是只有索引表是不够的,我们希望以一种更直观的方式显示出当前文件中定义的变量、函数等信息,所以我们需要一个新的插件taglist。 (三)安装代码浏览插件taglist 3.1 下载taglist 首先我们要前往网站 http://vim-taglist.sourceforge.net/ 下载taglist,这个项目已经很久没有更新了,你下载到的应该是taglist_46.zip这个文件,我们把它解压到任意目录,会看到它的文件目录如下: 3.2 安装taglist taglist作为vim插件,安装非常简单,我们只需要将doc和
[单片机]
在Mac OS X中使用VIM开发<font color='red'>STM32</font>(3)
STM32基础之串口通信
串口通讯协议简介: 串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。 在计算机科学里,大部分复杂的问题都可以通过分层来简化。如芯片被分为内核层和片上外设;STM32 标准库则是在寄存器与用户代码之间的软件层。对于通讯协议,我们也以分层的方式来理解,最基本的是把它分为物理层和协议层。物理层规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输。协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准。 串行通信的分类 1、按照数据传送方向,分为: **单工:**
[单片机]
<font color='red'>STM32</font>基础之串口通信
STM32之窗口看门狗(WWDG)
前几天学习STM32的两条狗,先学习了宠物狗(IWDG),和其它MCU差不多,不多说了。学到警犬(WWDG)的时候,问题来了,没有IWDG那么好理解了,看了半天没有搞懂是怎么回事,计数器值、窗口值、在什么时候喂狗、什么时候产生中断等等,一头雾水。 经过两天的推敲,个人理解如下: 1、有个7位递减计数器(WWDG- CR),就这个计数器和窗口计数器(WWDG- CFR)决定什么时候喂狗。 狗喂早了,复位 早 体现在计数器值(tr) 窗口值(wr),也就是计数器值还没有减到窗口值以下; 2、当 0x40 计数器值(tr) 窗口值(wr) 时,这时候最适合喂狗了,也只有在这时候喂狗才合适; 3、当计数器的值从0x4
[单片机]
51单片机 小车 L298N pwm调速 串口控制 按键控制
难点:1、串口定时器T1,和T0定时器优先级 2、pwm频率与占空比的设置 按键控制 按键1——前进 按键2——后退 按键3——加速 按键4——减速 (板子上只有四个按键) 串口控制 ‘1’——前进 ‘2’——后退 ‘3’——加速 ‘4’——减速 ‘5’——左转 ‘6’——右转 源码: #include reg52.h typedef unsigned char u8; typedef unsigned int u16; //L298N引脚定义 sbit ena = P0^0; sbit in1 = P0^1; sbit in2 = P0^2; sbit in3 = P0^3; sbit in4 = P0^4; sb
[单片机]
STM32之六独立看门狗
单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路就是为了避免这种情况的发生,在一定的时间内(通过计数器)没有喂狗信号输入给看门狗则表示MCU出现问题,自动会给处理器发送复位信号,是MCU重新启动,是系统正常运转。 STM32的独立看门狗有内部的专门40KHz低速时钟驱动,即使主时钟发生故障,它仍然有效。看门狗时钟十一个内部RC时钟,并不是准确的40KHz,而是在30~60KHz之间的变化时钟,估算时间的时候以40KHz来计算。 第一步,首先取消寄存器写保护,我们利用库函数的IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);来实现,
[单片机]
<font color='red'>STM32</font>之六独立看门狗
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved