实验目标:使用STM32定时器来产生PWM输出,使用TIM1通道1产生PWM来控制DS0亮度

什么是PWM?脉冲宽度调制,Pulse Width Modulation的缩写,简称脉宽调制,利用微处理器数字输出来对模拟电路进行控制。

假设定时器工作在向上计数PWM模式,CNT小于CRRx时输出0,CNT>=CCRx时输出1,可以得到上面这样的示意图。改变CCRx的值就可以改变PWM输出的占空比,改变ARR的值就可以改变PWM输出的频率,这就是PWM输出原理。

32除了6、7其他的定时器都可以产生PWM,1,8可以产生多达7路同时PWM输出。所以我们的32能够同时产生30路PWM输出。

要让TIM1产生PWM输出,除了上一章的4个寄存器我们还需要另外4个:

1、捕获比较模式寄存器 TIMx_CCMR1/2

2、捕获比较使能寄存器 TIMx_CCER

3、捕获比较寄存器TIMx_CCR1~4

4、刹车和死区寄存器TIMx_BDTR

第一个:捕获比较模式寄存器

一共有两个,TIMx_CCMR1控制1和2,~2控制CH3和4.

模式设置为OCxM,三部分组成,总共可以组成7种模式。PWM模式使用110/111

第二个:捕获比较使能寄存器

想要PWM从IO口输出,这个位必须设置为1。

第三个:捕获/比较寄存器

对应4个通道CH1~4,这4个寄存器都差不多。输出模式下寄存器的值与CNT的值进行比较,根据比较结果产生相应的动作,通过更改这个寄存器的值就可以控制PWM的输出脉宽了。我们使用TIM1的通道1来实现脉宽控制DS0的亮度。

通用定时器配置上面三个就可以了,如果是高级定时器还需要配置:刹车和死区寄存器

第四个:刹车和死区寄存器

我们只关注最高位MOE位,想要高级定时器PWM正常输出必须设置MOE为1.

下面我们介绍配置TIM1CH1的步骤来输出PWm控制DS0的亮度

1)开启TIM1时钟,配置PA8复用输出

使能时钟:

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器3时

复用输出:

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出

2)设置TIM1的ARR和PSC

设置ARR 和PSC两个寄存器的追来控制输出PWM的周期,如果PWM太慢就会明显感觉到杉树了,所以需要合适。通过TIM_TimebaseInit来实现,调用格式:

TIM_TimeBaseStructure.TIM_Period = arr; //设置自动重装载值 TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割 :TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式 TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据指定的参数初始化

3)设置TIM1_CH1的PWM模式和通道方向,使能TIM1的CH1输出

接下来设置TIM1_CH1为PWM模式,默认是冻结的。因为我们的DS0时低电平亮,而我们希望CCR1小的时候DS0暗,所以我们要通过配置TIM1_CCMR1的相关位来控制TIM1Ch1的模式。库函数中PWM通道设置通过TIM_OC1Init()~4来设置,不同通道的设置函数不一样。

函数是:

void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);

结构体中我们要研究的参数有:

TIM_OutputState来设置呼出使能,也就是PWM输出到的端口

TIM_OCPolarity用来设置极性高低

所以最后的标准代码是:

TIM_OCInitTypeDef TIM_OCInitStructure;

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择 PWM模式 2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性高

TIM_OC1Init(TIM1, &TIM_OCInitStructure); //初始化 TIM1 OC1

4)使能TIM1

TIM_Cmd(TIM1, ENABLE); //使能 TIM1

5)设置MOE输出,使能PWM输出

TIM_CtrlPWMOutputs(TIM1,ENABLE); // MOE主输出使能

6)修改TIM1_CCR1来控制占空比

经过上面的设置以后PWM已经开始输出了,但是占空比和频率是固定的,所以我们可以通过修改CCR1来控制Ch1的输出占空比,进而控制DS0的亮度。

void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);

硬件部分:DS0,TIM3,使用到了TIM1CH1通道进行输出,他和PA8是相连的所以电路上没有变化。

软件部分

pwm.c文件

和我们上面说的5个步骤一样,最后看主函数

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);       
    } 
}

我们控制LED0_PWM_VAL从0变到300又变回0,整个软件设置完成

STM32实验六:PWM输出实验总结相关推荐

  1. 定时器中断实验和PWM输出实验(寄存器)

    定时器分为高级定时器(TIM1,TIM8),基本定时器(TIM6,TIM7),以及通用定时器(TIM2,TIM3,TIM4,TIM5). TIM2-5支持向上,向下以及向上/向下的自动装载计数,TIM ...

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

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

  3. STM32 PWM输出实验总结

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

  4. 【手拉手 带你准备电赛】PWM究竟是什么(附:PWM输出实验完整代码)

    目录 PWM简介 PWM原理 PWM实验内容 PWM实验步骤 PWM实验代码 PWM解惑时刻 1.向上计数 2.刹车.死区 附录 初始化函数的完整代码 主函数的完整代码 都知道BMW,那么你们知道PW ...

  5. 基于STM32F103ZET6库函数PWM输出实验

    基于STM32F103ZET6库函数PWM输出实验 PWM 简介 硬件设计 软件设计 使 用 TIM3 的通道 2,把通道 2 重映射到 PB5,产生 PWM 来控制 DS0 的亮度. PWM 简介 ...

  6. STM32L475裸机例程学习 定时器中断和PWM输出实验

    定时器中断和PWM输出实验 所以阿-笔记的重要性哇!之前看过的内容在做后面的内容涉及到了发现没有笔记,看的时间太久远,竟然全部忘记了,真是个悲伤的故事:( 那就重来吧.由于这两个实验都跟TIM定时器关 ...

  7. STM32实战六 PWM加移相正交

    这一章编写PWM程序,使用TIM3以两个通道,完全映射到PC6和PC7,除普通PWM输出外,增加移相正交PWM功能,为后面的编码器计数模式提供信号源. PWM.h #ifndef __PWM__ #d ...

  8. STM32笔记之PWM输出,调节频率及占空比

    以STM32F103C8T6使用TIM1的CH1,CH4同时输出两路PWM为例: 引脚 定时器 通道 PA8 TIM1 CH1 PA11 TIM1 CH4 步骤: GPIO_InitTypeDef G ...

  9. STM32学习笔记(五 定时器及应用 3 PWM输出实验 )

    一.PWM 简介 脉冲宽度调制(PWM) Pulse Width Modulation (调制) 简单来说就是对脉冲宽度的控制. 高级定时器 TIM1 和 TIM8: 可以同时产生多达 7 路的 PW ...

最新文章

  1. 从无到有算法养成篇-双向链表与双向循环链表
  2. .net ajax批量删除,asp.net 全部选中与取消操作,选中后的删除(ajax)实现无刷新效果...
  3. android 开发书签大全,一站式的导航分享!
  4. 信息学奥赛C++语言:奖励钢笔
  5. 信息学奥赛一本通C++语言——1030: 计算球的体积
  6. 常用网站URL规划分析
  7. 万物皆可爬系列使用python爬阴阳师图片
  8. 在Eclipse中使用CVS的实践建议
  9. PyTorch 1.0 中文文档:torch.autograd
  10. shell命令xargs
  11. 中英文对照 —— 医学与医院
  12. 使用jquery为table动态添加行的实现代码
  13. 187.重复的DNA序列
  14. word 宏相关代码集合
  15. 好系统重装助手教你win10系统连接XP系统共享打印机的方法
  16. php css下划线,css怎么去掉下划线
  17. 未能联接game center服务器,game center连接不成功怎么办 有哪些修复步骤 - 驱动管家...
  18. 一对一、一对多、多对多(实操)
  19. Java后端开发工程师简历加分项:个人在线简历的搭建
  20. 如何检查电脑端安装的Flash Activex 控件版本?

热门文章

  1. Rope --高效字符串处理数据结构
  2. 登记成绩之小东助手v1
  3. 网易cetus数据库中间件安装-读写分离版本
  4. 阿里云服务器设置端口让外网访问
  5. CSS 层叠样式表书写位置
  6. 机器学习聚类——实验报告
  7. 2.1 探索性数据分析【斯坦福21秋季:实用机器学习中文版】
  8. 网络基础之一:网络体系结构详解
  9. 107页PPT,讲透MES与APS系统及其选型
  10. 拯救电脑硬盘的某个分区文件系统变成RAW的有效方式