文章目录

  • main.c
  • pwm.c
  • pwm.h

STM32 的定时器除了 TIM6 和 7,其他的定时器都可以用来产生 PWM 输出。

高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4 路的 PWM 输出,这样,STM32 最多可以同时产生 30 路 PWM 输出!

除了上一章的几个寄存器外,我们还会用到 4 个寄存器:

  1. 捕获/比较模式寄存器(TIMx_CCMR1/2)
  2. 捕获/比较使能寄存器(TIMx_CCER)
  3. 捕获/比较寄存器(TIMx_CCR1~4)
  4. 刹车和死区寄存器(TIMx_BDTR)
功能 函数
1)开启 TIM1 时钟,配置 PA8 为复用输出。 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器 3 时钟
2)设置 TIM1 的 ARR 和 PSC。
3)设置 TIM1_CH1 的 PWM 模式及通道方向, 使能 TIM1 的 CH1 输出。 void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
4)使能 TIM1。 TIM_Cmd(TIM1, ENABLE); //使能 TIM1
5)设置 MOE 输出,使能 PWM 输出。 TIM_CtrlPWMOutputs(TIM1,ENABLE); // MOE 主输出使能
6)修改 TIM1_CCR1 来控制占空比。 void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);

main.c

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "pwm.h"int main(void){   u16 led0pwmval=0;    u8 dir=1;    delay_init();               //延时函数初始化     LED_Init();                   //初始化与LED连接的硬件接口TIM1_PWM_Init(899,0);       //不分频。PWM频率=72000/(899+1)=80Khz while(1){delay_ms(10);    if(dir)led0pwmval++;else led0pwmval--;    if(led0pwmval>300)dir=0;if(led0pwmval==0)dir=1;                      TIM_SetCompare1(TIM1,led0pwmval);     }
}

pwm.c

#include "pwm.h"
#include "led.h"//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM1_PWM_Init(u16 arr,u16 psc)
{  GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;TIM_OCInitTypeDef  TIM_OCInitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);           // RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);       //使能GPIO外设时钟使能//设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;                       //TIM_CH1GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;               //复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);TIM_TimeBaseStructure.TIM_Period = arr;                        //设置在下一个更新事件装入活动的自动重装载寄存器周期的值    80KTIM_TimeBaseStructure.TIM_Prescaler =psc;                      //设置用来作为TIMx时钟频率除数的预分频值  不分频TIM_TimeBaseStructure.TIM_ClockDivision = 0;                   //设置时钟分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;        //TIM向上计数模式TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);              //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;                //选择定时器模式:TIM脉冲宽度调制模式2TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;    //比较输出使能TIM_OCInitStructure.TIM_Pulse = 0;                             //设置待装入捕获比较寄存器的脉冲值TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;        //输出极性:TIM输出比较极性高TIM_OC1Init(TIM1, &TIM_OCInitStructure);                       //根据TIM_OCInitStruct中指定的参数初始化外设TIMxTIM_CtrlPWMOutputs(TIM1,ENABLE);                             //MOE 主输出使能 TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);               //CH1预装载使能   TIM_ARRPreloadConfig(TIM1, ENABLE);                            //使能TIMx在ARR上的预装载寄存器TIM_Cmd(TIM1, ENABLE);                                          //使能TIM1
}

pwm.h

#ifndef __PWM_H
#define __PWM_H
#include "sys.h"void TIM1_PWM_Init(u16 arr,u16 psc);#endif

【STM32】PWM 输出实验代码详解相关推荐

  1. 【STM32】SPI 实验代码详解

    友情链接:[小项目关键技术]硬件通信三种方式.串口.IIC.SPI 文章目录 main.c spi.c spi.h SPI 是英语 Serial Peripheral interface 的缩写,顾名 ...

  2. 【STM32】无线通信实验代码详解

    文章目录 main.c 24l01.c 24l01.h main.c #include "led.h" #include "delay.h" #include ...

  3. 【学习记录】 STM32 PWM输出实验

    STM32 PWM工作过程 以通道1为例: CCR1:捕获比较(值)寄存器(x=1,2,3,4):设置比较值. CCMR1: OC1M[2:0]位: 对于PWM方式下,用于设置PWM模式1[110]或 ...

  4. STM32 PWM输出实验总结

    本实验是基于STM32 407的板子,使用的是通用定时器TIM14,相关的博文其实有很多,本文主要是基于他们结合个人学习理解总结整理,并非完全原创,只希望能帮助更好理解PWM输出的过程尤其是TIM_A ...

  5. 【STM32】输入捕获实验代码详解

    文章目录 main.c timer.c timer.h main.c #include "led.h" #include "delay.h" #include ...

  6. STM32 PWM输出实验

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

  7. 【STM32】定时器中断实验代码详解

    文章目录 main.c timer.c timer.h STM32 的通用定时器是一个通过可编程预分频器(PSC)驱动的 16 位自动装载计数器(CNT)构成. STM32 的通用定时器可以被用于:测 ...

  8. 【STM32】OLED 显示实验代码详解

    文章目录 main.c oled.c oled.h main.c #include "led.h" #include "delay.h" #include &q ...

  9. 【STM32】外部中断实验代码详解

    文章目录 main.c exit.c exit.h STM32 的每个 IO 都可以作为外部 中断的中断输入口,这点也是 STM32 的强大之处. STM32F103 的 19 个外部中断为: 线 0 ...

最新文章

  1. CUDA Samples: ripple
  2. 初识Tcl(十一):Tcl 命名空间
  3. python需要音语基础_英语基础一般,如何才能学习C语言编程和Python
  4. 浅析 Dapr 里的云计算设计模式
  5. Makefile之变量(10)
  6. 破解Navicat for MySql
  7. 金融数据分析之财务分析表要填数据怎么办?(学习理财课程后开发的助手工具)
  8. 理科本科,无考试,读诗《宣州谢脁楼饯别校书叔云》李白
  9. 了解SQL INSERT INTO SELECT语句
  10. Error Could not open client transport with JDBC Uri jdbchive2hadoop10210000 Failed to open new sessi
  11. 抖音矩阵系统源码搭建,抖音矩阵系统开发原理,抖音矩阵系统搭建
  12. PLC控制系统怎么抗干扰
  13. excel取消工作表保护 获取原始密码
  14. 输入若干个字符串,查找其中的最大字母,在该字母后面插入字符串“(max)”
  15. 卡特兰数 默慈金数 默慈金三角形 反射原理
  16. 软件工程--总体设计过程详解
  17. DockerK8s---通过kubeadm快速部署K8s
  18. ios真机调试,iTunes检测得到,hbuilder未检测到手机和模拟器的解决办法
  19. 图片读取器和皮肤库设计
  20. 顶级图片管理加工软件Picasa免费中文版

热门文章

  1. 在vue项目中引入高德地图及其UI组件的方法
  2. 在mac上配置cocos2d-x开发环境
  3. 【python】基础知识
  4. XML和实体类之间相互转换(序列化和反序列化)
  5. vue.js几行实现的简单的todo list
  6. MyEclipse + Maven开发Web工程的详细配置过程
  7. tinyxml使用指导
  8. UA MATH523A 实分析3 积分理论例题 证明函数列L1收敛的一个题目
  9. UA MATH565C 随机微分方程V 算子半群理论简介
  10. UA MATH571A 一元线性回归IV 模型诊断