脉冲宽度调制是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术

高级定时器可以同时产生多达7路的PWM输出

而通用定时器也能同时产生多达4路的PWM输出

脉冲宽度调制模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的信号

PWM边沿对齐模式

当TIMx_CNT小于TIMx_CCRx时PWM信号参考OCxREF为高,否则为低。如果TIMx_CCRx中的比较值大于自动重装载值(TIMx_ARR),则OCxREF保持为’1’。如果比较值为0,则OCxREF保持为’0’。 下图为TIMx_ARR=8时边沿对齐的PWM波形实例

3.PWM配置步骤

1.使能定时器时钟

2.使能GPIO外设时钟,并设置引脚复用

3.使能AFIO时钟,并设置引脚复用重映射

3.初始化定时器参数,预分频器的值、自动重装载的值等设定

4.初始化PWM输出参数,输出模式、输出极性等

5.开启定时器

6.使能捕获/比较模式寄存器(TIMx_CCMRx)

7.使能自动重装载寄存器(TIMx_ARR)

8.配置捕获/比较寄存器,修改占空比(TIMx_CCRx)

举例

typedef struct
{
uint16_t TIM_OCMode; //输出比较模式
uint16_t TIM_OutputState; //输入/捕获输出使能
uint16_t TIM_OutputNState; //比较互补输出使能
uint16_t TIM_Pulse; //配置捕获/比较寄存器值
uint16_t TIM_OCPolarity; //输入/捕获输出极性
uint16_t TIM_OCNPolarity; //互补比较输出极性
uint16_t TIM_OCIdleState; //空闲状态下比较输出状态
uint16_t TIM_OCNIdleState; //空闲状态下比较输出状态
} TIM_OCInitTypeDef; void TIM3_PWM_init(u16 prescaler, u16 period)
{
TIM_TimeBaseInitTypeDef tim_tb = {0};
TIM_OCInitTypeDef tim_oc = {0};
GPIO_InitTypeDef gpio =
{
GPIO_Pin_6, //PC6
GPIO_Speed_50MHz,
GPIO_Mode_AF_PP //复用推挽输出
}; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器时钟 GPIO_Init(GPIOC, &gpio); //使能GPIO外设时钟,并设置引脚复用 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //使能AFIO时钟 GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE); //设置引脚复用重映射 tim_tb.TIM_Prescaler = prescaler;
tim_tb.TIM_CounterMode = TIM_CounterMode_Up;
tim_tb.TIM_Period = period;
tim_tb.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM3, &tim_tb); //初始化定时器参数 tim_oc.TIM_OCMode = TIM_OCMode_PWM1; //PWM模式1
tim_oc.TIM_OCPolarity = TIM_OCPolarity_Low; //低电平有效
tim_oc.TIM_OutputState = TIM_OutputState_Enable;
TIM_OC1Init(TIM3, &tim_oc); //初始化PWM输出参数 TIM_Cmd(TIM3, ENABLE); //开启定时器 TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能捕获/比较模式寄存器 TIM_ARRPreloadConfig(TIM3, ENABLE); //使能自动重装载寄存器
} int main(void)
{
u16 i = 0;
u8 flag = 0; TIM3_PWM_init(500, 72 - 1); //2k while(1)
{
if(flag == 0)
{
i++;
if(i == 300)
{
flag = 1;
}
}
else
{
i--;
if(i == 0)
{
flag = 0;
}
} TIM_SetCompare1(TIM3, i); //配置捕获/比较寄存器,修改占空比 delay_ms(10);
}
}

stm32 PWM的更多相关文章

  1. STM32 PWM的输出与Keil软件仿真

    导读:PWM(Pulse Width Modulation)控制——脉冲宽度调制技术,通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形(含形状和幅值). PWM控制技术在逆变电路中应用最广,应用 ...

  2. STM32 PWM波

    利用STM32产生占空比可以调节的PWM波 科普:pwm(Pulse Width Modulation)脉宽调制 关于pwm波的产生:1.首先来看一下代码: pwm波模式的相关配置(利用的是定时器TI ...

  3. stm32 pwm 电调 电机

    先上代码 python 树莓派版本,通俗表现原理.stm32 C语言版本在后面 import RPi.GPIO as GPIO import time mode=2 IN1=11 def setup( ...

  4. STM32 PWM输出(映射)

    STM32 的定时器除了 TIM6 和 7.其他的定时器都可以用来产生 PWM 输出.其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出.而通用定时器也能同时产生多达 4 ...

  5. stm32 PWM输出学习

    STM32 的定时器除了 TIM6 和 7,其他的定时器都可以用来产生 PWM 输出.其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出.通用定时器也能同时产生多达 4路 ...

  6. WS2812B彩灯详细讲解篇(STM32 PWM+DMA控制 STM32 HAL库编程 循环延时控制多种控制方式)

    一.效果展示 观看演示效果:https://www.bilibili.com/video/BV1JT4y1P72Q 二. 基础认识 (一)  小理论 WS2812B是一种智能控制LED光源,将控制电路 ...

  7. STM32 PWM功能在关闭时GPIO电平不确定的情况

    刚开始接触STM32,遇到一个项目中出现在产品调试中出现在关闭PWM输出时,GPIO电平有不确定的情况.在网上查阅资料发现大神们是这样解释的:PWM在一个脉冲没有结束时关闭输出,会导致GPIO电平不确 ...

  8. STM32——PWM基本知识及配置过程

    将通用定时器分为四个部分: 1,选择时钟 2,时基电路 3,输入捕获 4,输出比较 本节定时器PWM输出主要涉及到定时器框图右下方部分,即输出比较部分 和上一讲相同,时基时钟来源于内部默认时钟 对此有 ...

  9. STM32 PWM注意事项

    频率: f = 时钟周期 / Prescaler / Period: 占空比 = ( Pulse / Period )* 100 %: 需要注意的是,Pulse 不能大于 Period 

随机推荐

  1. pyecharts绘画优美图形

    常用图形:柱形图-折线图-饼图-散点图 from pyecharts import Line, Bar, Pie, EffectScatter # 数据 attr =["衬衫", ...

  2. linux上安装pycharm

    百度搜索pycharm 然后打开pycharm的官网 然后在官网首页点击down,下载linux版pycharm 上传到linux服务器.解压 然后再打开bin目录 执行:sh ./pycharm.s ...

  3. 在node.js中使用Set

    var set = new Set(); set.add(1); console.log("test1 : " + set.has(1) + " ; " + s ...

  4. html的css背景图的repeat

    HTML里background-image中,可以设置background-repeat实现平铺,前面博文中关于css样式换行的(相关博文:超文本css样式换行),其中有个三个div组合的,中间的di ...

  5. 【Leetcode_easy】747. Largest Number At Least Twice of Others

    problem 747. Largest Number At Least Twice of Others 题意: solution1: class Solution { public: int dom ...

  6. Django:django后台传递数据到js中

    #奇怪传递字典时前台接收不到???datalist= [{'site': '自强学堂', 'author': '涂伟忠'}]#只要列表能接收# datalist=[[93, 93, 0, 100.01 ...

  7. 从源码角度解析Netty的React模式是如何工作的

    Netty 支持多种实现方式,比如nio,epoll 等,本文以nio的实现方式进行讲解. 1.EventLoop : 事件循环看,简单来说就是一个死循环监听事件,如果事件来了,处理掉.通常做法就是开 ...

  8. 在C/C++中常用的符号

    C++中&和*的用法一直是非常让人头疼的难点,课本博客上讲这些知识点一般都是分开讲其用法的,没有详细的总结,导致我在这方面的知识结构格外混乱,在网上找到了一篇英文文章简单总结了这两个符号的一些 ...

  9. SourceTree使用图解

    看完这篇文档你能做到的是: 1.简单的用Git管理项目. 2.怎样既要开发又要处理发布出去的版本bug情况. SourceTree是一个免费的Git图形化管理工具,mac下也可以安装. 下载地址:ht ...

  10. 采用霍夫曼编码(Huffman)画出字符串各字符编码的过程并求出各字符编码 --多媒体技术与应用

    题目:有一个字符串:cabcedeacacdeddaaaba,问题: (1)采用霍夫曼编码画出编码的过程,并写出各字符的编码 (2)根据求得的编码,求得各编码需要的总位数 (3)求出整个字符串总编码长 ...