您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 23.-PWM呼吸灯实验
普中STM32开发板带您进入ARM世界PWM呼吸灯实验普中STM32开发板带您进入ARM世界本讲主要内容1.PWM简介2.STM32F1PWM介绍3.PWM输出配置步骤4.硬件电路5.编写PWM输出控制程序普中STM32开发板带您进入ARM世界1.PWM简介PWM是PulseWidthModulation的缩写,中文意思就是脉冲宽度调制,简称脉宽调制。它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,其控制简单、灵活和动态响应好等优点而成为电力电子技术最广泛应用的控制方式,其应用领域包括测量,通信,功率控制与变换,电动机控制、伺服控制、调光、开关电源,甚至某些音频放大器,因此学习PWM具有十分重要的现实意义。其实我们也可以这样理解,PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。普中STM32开发板带您进入ARM世界普中STM32开发板带您进入ARM世界2.STM32F1PWM介绍STM32F1除了基本定时器TIM6和TIM7,其他定时器都可以产生PWM输出。其中高级定时器TIM1和TIM8可以同时产生多达7路的PWM输出。而通用定时器也能同时产生多达4路的PWM输出,这些在定时器中断章节中已经介绍过。PWM的输出其实就是对外输出脉宽可调(即占空比调节)的方波信号,信号频率是由自动重装寄存器ARR的值决定,占空比由比较寄存器CCR的值决定。普中STM32开发板带您进入ARM世界PWM输出比较模式总共有8种,具体由寄存器CCMRx的位OCxM[2:0]配置。我们这里只讲解最常用的两种PWM输出模式:PWM1和PWM2,其他几种模式可以参考《STM32F10x中文参考手册》13、14、15定时器章节。PWM1和PWM2这两种模式用法差不多,区别之处就是输出电平的极性不同。PWM模式根据计数器CNT计数方式,可分为边沿对齐模式和中心对齐模式。普中STM32开发板带您进入ARM世界(1)PWM边沿对齐模式当TIMx_CR1寄存器中的DIR位为低时执行递增计数,计数器CNT从0计数到自动重载值(TIMx_ARR寄存器的内容),然后重新从0开始计数并生成计数器上溢事件。以PWM模式1为例。只要TIMx_CNTTIMx_CCRx,PWM参考信号OCxREF便为有效的高电平,否则为无效的低电平。如果TIMx_CCRx中的比较值大于自动重载值(TIMx_ARR中),则OCxREF保持为“1”。如果比较值为0,则OCxREF保持为“0”。普中STM32开发板带您进入ARM世界普中STM32开发板带您进入ARM世界当TIMx_CR1寄存器中的DIR位为高时执行递减计数,计数器CNT从自动重载值(TIMx_ARR寄存器的内容)递减计数到0,然后重新从TIMx_ARR值开始计数并生成计数器下溢事件。以PWM模式1为例。只要TIMx_CNTTIMx_CCRx,PWM参考信号OCxREF便为无效的低电平,否则为有效的高电平。如果TIMx_CCRx中的比较值大于自动重载值(TIMx_ARR中),则OCxREF保持为“1”。此模式下不能产生0%的PWM波形。普中STM32开发板带您进入ARM世界(2)PWM中心对齐模式在中心对齐模式下,计数器CNT是工作做递增/递减模式下。开始的时候,计数器CNT从0开始计数到自动重载值减1(ARR-1),生成计数器上溢事件;然后从自动重载值开始向下计数到1并生成计数器下溢事件。之后从0开始重新计数。普中STM32开发板带您进入ARM世界普中STM32开发板带您进入ARM世界我们以ARR=8,CCRx=4为例进行介绍。第一阶段计数器CNT工作在递增计数方式,从0开始计数,当TIMx_CNTTIMx_CCRx时,PWM参考信号OCxREF为高电平,当TIMx_CNT=TIMx_CCRx时,PWM参考信号OCxREF为低电平。第二阶段计数器CNT工作在递减计数方式,从ARR开始递减计数,当TIMx_CNTTIMx_CCRx时,PWM参考信号OCxREF为低电平,当TIMx_CNT=TIMx_CCRx时,PWM参考信号OCxREF为高电平。普中STM32开发板带您进入ARM世界3.PWM输出配置步骤(1)使能定时器及端口时钟,并设置引脚复用器映射RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);可选的参数在stm32f10x_gpio.h都已经列出来非常详细GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出普中STM32开发板带您进入ARM世界普中STM32开发板带您进入ARM世界(2)初始化定时器参数,包含自动重装值,分频系数,计数方式等voidTIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInitTypeDef*TIM_TimeBaseInitStruct);(3)初始化PWM输出参数,包含PWM模式、输出极性,使能等voidTIM_OCxInit(TIM_TypeDef*TIMx,TIM_OCInitTypeDef*TIM_OCInitStruct);typedefstruct{uint16_tTIM_OCMode;//比较输出模式uint16_tTIM_OutputState;//比较输出使能uint16_tTIM_OutputNState;//比较互补输出使能uint32_tTIM_Pulse;//脉冲宽度uint16_tTIM_OCPolarity;//输出极性uint16_tTIM_OCNPolarity;//互补比较输出极性uint16_tTIM_OCIdleState;//空闲状态下比较输出状态uint16_tTIM_OCNIdleState;//空闲状态下比较输出状态}TIM_OCInitTypeDef;普中STM32开发板带您进入ARM世界如果我们要配置TIM3的CH1为PWM1模式,输出极性为低电平,并且使能PWM输出,可以如下配置:TIM_OCInitTypeDefTIM_OCInitStructure;TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;TIM_OC1Init(TIM3,&TIM_OCInitStructure);//输出比较通道1初始化普中STM32开发板带您进入ARM世界(4)开启定时器voidTIM_Cmd(TIM_TypeDef*TIMx,FunctionalStateNewState);TIM_Cmd(TIM3,ENABLE);//开启定时器(5)修改TIMx_CCRx的值控制占空比voidTIM_SetCompare1(TIM_TypeDef*TIMx,uint32_tCompare1);(6)使能TIMx在CCRx上的预装载寄存器使能输出比较预装载库函数是:voidTIM_OCxPreloadConfig(TIM_TypeDef*TIMx,uint16_tTIM_OCPreload);第一个参数用于选择定时器,第二个参数用于选择使能还是失能输出比较预装载寄存器,可选择为TIM_OCPreload_Enable、TIM_OCPreload_Disable。(7)使能TIMx在ARR上的预装载寄存器允许位使能TIMx在ARR上的预装载寄存器允许位库函数是:voidTIM_ARRPreloadConfig(TIM_TypeDef*TIMx,FunctionalStateNewState);第一个参数用于选择定时器,第二个参数用于选择使能还是失能。普中STM32开发板带您进入ARM世界高级定时器要想输出PWM波形,必须要设置一个MOE位(TIMx_BDTR的第15位),以使能主输出,否则不会输出PWM。库函数设置的函数为:voidTIM_CtrlPWMOutputs(TIM_TypeDef*TIMx,FunctionalStateNewState);普中STM32开发板带您进入ARM世界4.硬件电路本章硬件电路非常简单,只使用到开发板上的LED(D7),因为D7指示灯接在PC6管脚,而通过对TIM3_CH1复用功能完全重映射就可以映射到PC6脚。所以可以通过TIM3的CH1输出PWM信号,实现D7指示灯呼吸灯的控制。普中STM32开发板带您进入ARM世界5.编写PWM输出控制程序本章所要实现的功能是:通过TIM3的CH1输出一个PWM信号,控制D7指示灯由暗变亮,再由亮变暗,类似于人的呼吸。程序框架如下:(1)初始化PC6管脚为PWM输出功能(2)PWM输出控制程序
本文标题:23.-PWM呼吸灯实验
链接地址:https://www.777doc.com/doc-4867591 .html