做一件事情之前,我们首先肯定是要了解这个东西是什么。我们才能去对它进行开发。

一、pwm原理

PWM是Pulse Width Modulation的缩写,
中文名字是脉冲宽度调制,一种说法是它利用微处理器的数字输出来对模拟电路进行控制的一种有效的技术,其实就是使用数字信号达到一个模拟信号的效果
我们可以看一下下面这张图,就可以很好的去理解pwm,其实就是占空比。
占空比是指高电平的时间占整个周期的比例。
说白了,其实就是高电平所占的周期时间

理解了原理之后,我们要如何应用呢?
其实pwm哎我们生活中到处都是,比如风扇调速、手机充电呼吸灯等等。

二、基本控制

stm32的定时器除了TIM6和7。其他的定时器都可以用来产生PWM输出。其中高级定时器TIM1和TIM8可以同时产生7路的PWM输出。而通用定时器也能同时产生多达4路PWM输出,这样,stm32最多可以同时产生30路PWM输出;要使用STM32下的通用定时器TIMx产生PWM输出,我们会用到3个寄存器,来控制PWM的。这三个寄存器是:捕获/比较模式寄存器TIMx_CCMR1/2)、捕获/比较使能寄存器(TIMx_CCER)、捕获/比较寄存器(TIMx_CCR1~4)。注意,还有个TIMx的ARR寄存器是用来控制PWM输出频率的。

初始化设置:

void RCC_Config(void);
void GPIO_Config(void);
void TIM_Config(void);
void RCC_Config(void)
{//使能GPIOA,TIM2RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
}
void GPIO_Config(void)
{//GPIO的配置,官方库有给出需要配置的一些参数,如果忘记了,参照一下即可,我这里配置的是GPIOA_Pin_1GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);
}

void TIM_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TImeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;

//配置TIM2的时钟输出频率,以及其它相关参数初始化TIM_TImeBaseStructure.TIM_Prescaler=360-1;//设置PWM的频率TIM_TImeBaseStructure.TIM_CounterMode=0;TIM_TImeBaseStructure.TIM_Period=100;TIM_TimeBaseInit(TIM2,&TIM_TImeBaseStructure);//设置PWM的输出方式TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
//配置占空比TIM_OCInitStructure.TIM_Pulse=50;TIM_OC2Init(TIM2,&TIM_OCInitStructure);TIM_ForcedOC1Config(TIM2,TIM_ForcedAction_Active);TIM_Cmd(TIM2,ENABLE);TIM_CtrlPWMOutputs(TIM2,ENABLE);

}
整个mian函数:

int main()
{RCC_Config();GPIO_Config();TIM_Config();while(1){;}
}

pwm.c

#include "pwm.h"
#include "public.h"
/*******************************************************************************
* ? ? ?         : pwm_init
* ????         : IO???TIM3?????
* ?    ?         : ?
* ?    ?         : ?
*******************************************************************************/
void pwm_Init()
{GPIO_InitTypeDef GPIO_InitStructure;   //?????????,?????GPIOTIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//?????????,????????TIM_OCInitTypeDef TIM_OCInitStructure;//??TIM_OCInitStruct???????????TIMx/* ???? */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);/*  ??GPIO????IO? */GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;// PC6GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//??????GPIO_Init(GPIOC,&GPIO_InitStructure);//TIM3??????TIM_TimeBaseInitStructure.TIM_Period = 199; //PWM ??=72000/(199+1)=36Khz//??????????????TIM_TimeBaseInitStructure.TIM_Prescaler = 7199;//??????TIMx????????TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;//??????:TDTS = Tck_timTIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM??????TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);//?????????    //pC6//PWM???     //??TIM_OCInitStruct???????????TIMxTIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//PWM????TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;TIM_OC1Init(TIM3,&TIM_OCInitStructure);//????????TIM_OC1Init???TIM_OCInit,??????????????????TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);//??????TIMx?CCR1????????TIM_Cmd(TIM3,ENABLE);//??????TIMx??
}

pwm.h

#ifndef __PWM_H
#define __PWM_Hvoid pwm_Init(void);#endif

自此完成基本配置,下面我将再写一篇应用开发。更新有点慢,见谅。
参考链接

pwm原理与stm32控制相关推荐

  1. MPU6050工作原理及STM32控制MPU6050

    一·简介: 1.要想知道MPU6050工作原理,得先了解下面俩个传感器: ①陀螺仪传感器: 陀螺仪的原理就是,一个旋转物体的旋转轴所指的方向在不受外力影响时,是不会改变的.人们根据这个道理,用它来保持 ...

  2. STM32 嵌入式学习入门(4)——PWM原理

    STM32 嵌入式学习入门(4)--PWM原理 本文先对STM32F103的通用定时器作一简单介绍,然后详细介绍通用定时器的一个应用--输出PWM波形的原理.整个文章以介绍"怎么用" ...

  3. STM32控制步进电机:工作原理及库函数(标准库) / HAL库控制程序(不定期更新)

    STM32控制步进电机:工作原理并附带库函数/HAL库程序 一.步进电机的基本工作原理 1.步进电机工作原理 2.混合式步进电机工作原理 二.步进电机参数解析(后续学习会继续补充此处内容

  4. 【电赛备考】基于STM32控制的可调PWM输出+LCD显示

    情况分析 大三老油条一枚,大一时赶上19年国赛申请留校一月自学(划水)开赛以后就和队友参观了一下其他队伍准备的情况就愉快的回家了.(材料都没买),因为疫情的原因大二的省赛推迟到了大三.趁着考研压力还不 ...

  5. PWM控制电机转速、PWM原理

    一.PWM原理 1.PWM(Pulse Width Modulation)即脉冲宽度调制,在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,常应用于电机控速.开关电 ...

  6. STM32控制步进电机:基于定时器中断的ULN2003驱动器/步进电机驱动程序

    STM32控制步进电机:基于定时器中断的ULN2003驱动器/步进电机驱动程序 一.ULN2003驱动器 1.工作原理 2.步距角以及一圈所需步数的计算 二.硬件连接 三.STM32F103定时器中断 ...

  7. pwm一个时间单位_详解PWM原理、频率与占空比

    来源:csdn,作者:Z小旋 链接:https://blog.csdn.net/as480133937 什么是PWM 脉冲宽度调制(PWM),是英文"Pulse Width Modulati ...

  8. HC-05蓝牙模块与STM32控制led灯亮详解

    HC-05蓝牙模块与STM32控制led灯亮 一.HC-05蓝牙模块解析 1.简介 2.HC-05原理 3.HC-05实物图 二.使用AT指令进行配置 1.进入命令响应工作模式 2.配置串口 3.进行 ...

  9. STM32控制电机简易教程

    STM32控制电机简易教程 包教包会 近期,电赛临近,来补习一下电机的使用方式,使用起来非常的方便 首先是在CUBEMX里面配置一些基本内容 然后是使用PWM去调速 其他的时钟和调试配置就不多说了. ...

最新文章

  1. springboot获取原生js请求_springboot跳转原生html
  2. UML精粹--标准对象建模语言简明教程
  3. 洛谷——P1540 机器翻译
  4. 各种编码范围总结以及linux下面的编码批量转化
  5. Chrome OS 云里雾里
  6. discuz安装_手动搭建 Discuz! 论坛
  7. 递归问题(代码、分析、汇编)
  8. java统计字符串中每个字符出现的次数_统计字符串出现的次数
  9. 活动事务日志以及事务的类型
  10. 用Heartbeat构建Web Ha
  11. hive on tez集成完整采坑指南(含tez-ui及安全环境)
  12. 2019年1月13日【回家】
  13. laravel插入数据时报 502 Bad Gateway
  14. mysql驱动5.1_mysql jdbc 驱动 5.1.26 官方最新版
  15. CSS3 文字边框 -webkit-text-stroke
  16. 第一单元 用python学习微积分(三) 求导四则运算及三角函数(下)- 三角函数
  17. java 兔子繁殖问题_兔子繁殖问题
  18. 用Python删除含有特定字符串的行
  19. LeetCode 714 买卖股票的最佳时机含手续费
  20. b站网页html,bilibili注册页面html简单分析

热门文章

  1. vue使用echarts是,动态获取数据,动态更新图表数据。
  2. 如何恢复自身的精力 [转]
  3. 社会要去温暖每一个打工人
  4. PAT 1046 划拳 (15分)
  5. 一个有趣的实验之OSPF中RID相同建邻
  6. 训练日志13 (8.7)
  7. UPC——2020年春混合个人训练第二十五场(FG)
  8. 京东第一位博士后出站 看看他研究的是什么“黑科技”
  9. 考研英语十附双语阅读:按点下班惹非议?一点小花招让你看起来超努力(纯阅读,有些方法不普适)
  10. DS8100更换PPS电源线