PWM,中文释义:脉冲宽度调制。它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。

PWM 是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。

STM32的定时器除了TIM6和7。其他的定时器都可以用来产生PWM输出。其中高级定时器TIM1和TIM8可以同时产生多达7路的PWM输出。而通用定时器也能同时产生多达4路的PWM输出,这样,STM32最多可以同时产生30路PWM输出!(在编程过程中的定时器重映像时涉及到)

STM32 的PWM是TIMx_ARR寄存器确定频率(周期)、由TIMx_CCRx寄存器确定占空比的信号。

PWM  模式

脉冲宽度调制模式可以产生一个由 TIM1_ARR 寄存器确定频率、由TIM1_CCRx寄存器确定占空比的信号。在 TIM1_CCMRx寄存器中的OCxM位写入“110”(PWM 模式 1)或“111”(PWM 模式 2),能够独立地设置每个通道工作在 PWM模式,每个 OCx 输出一路 PWM。必须通过设置 TIM1_CCMRx 寄存器 OCxPE 位使能相应的预装载寄存器,最后还要设置 TIM1_CR1 寄存器的 ARPE 位使能自动重装载的预装载寄存器(在向上计数或中心对称模式中)。

PWM 边沿对齐模式

向上计数配置     当 TIM1_CR1 寄存器中的 DIR 位为低的时候执行向上计数。 在 PWM 模式 1,当 TIM1_CNT<TIM1_CCRx 时 PWM 参考信号,OCxREF 为高,否则为低。如果 TIM1_CCRx中的比较值大于自动重装载值(TIM1_ARR),则 OCxREF 保持为“1"。如果比较值为 0,则 OCxREF 保持为“0"。 图 3-1 为 TIM1_ARR=8 时边沿对齐的 PWM 波形实例。

向下计数的配置   当 TIM1_CR1 寄存器的 DIR 位为高时执行向下计数。 在 PWM 模式 1,当 TIM1_CNT>TIM1_CCRx 时参考信号 OCxREF 为低,否则为高。如果 TIM1_CCRx 中的比较值大于 TIM1_ARR 中的自动重装载值,则 OCxREF保持为“1"。该模式下不能产生 0%的 PWM 波形。

PWM 中央对齐模式

当TIM1_CR1寄存器中的CMS位不为 00时为中央对齐模式(所有其他的配置对OCxREF/OCx信号都有相同的作用)。根据不同的CMS位的设置,比较标志可能 在计数器向上计数时被置 1、在计数器向下计数时被置 1、或在计数器向上和向下计数时被置 1。TIM1_CR1寄存器中的计数方向位(DIR)由硬件更新,不要用软件修改它。 图 3-2给出了一些中央对齐的PWM波形的例子 · TIM1_ARR=8 ; · PWM模式 1; · TIM1_CR1 寄存器中的 CMS=01,在中央对齐模式 1 时,当计数器向下计数时标志被设置。

测试用例:(PWM控制led亮度的渐变)

 #include "pbdata.h"
#include "led.h"
#include "misc.h"
#include "stm32f10x_tim.h" void RCC_Configration(void)
{
SystemInit();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //定时器时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //端口复用使能,因为要使用PWM
} void GPIO_Configration(void)
{
GPIO_LED_Configration();
} void TIM_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure; GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE); // 定时器管脚映射,部分重映像到PB5,PB5正好为接led的管脚(搜索“复用功能重映射”) TIM_TimeBaseStructure.TIM_Period = ; //设置初始值,定时1s
TIM_TimeBaseStructure.TIM_Prescaler = ; //设置预分频
TIM_TimeBaseStructure.TIM_ClockDivision = ; //时钟分割
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //pwm 初始化
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1; //设置为PWM模式1
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; // 输出使能?????
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low; //设置输出极性 TIM_OC2Init(TIM3,&TIM_OCInitStructure); //选择定时器通道2
TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable); //预装载使能
TIM_Cmd(TIM3,ENABLE); //定时器外设打开
} int main(void)
{
u8 led_fx = ;
u16 led_dt = ;
RCC_Configration();
GPIO_Configration();
TIM_Configuration();
while()
{
// delay_ms(10);
if(led_fx==)
{
led_dt++;
}
else
{
led_dt--;
}
if(led_dt>) led_fx=;
if(led_dt==) led_fx=; TIM_SetCompare2(TIM3,led_dt);
}
}

2014-08-26 01:17:28

--------------------------------------------------------------------------------------------------------------------------------------------------------------->补充...

GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);有了这个管脚的映射后,PWM才和LED有了联系,相应管脚才会以PWM方式输出。

PWM控制led渐变的更多相关文章

  1. Arduino系列之pwm控制LED灯(呼吸灯)

    下面我将写出最简单控制呼吸灯的方法 void setup()                                 // { pinMode(12,OUTPUT);             ...

  2. [ZigBee] 13、ZigBee基础阶段性回顾与加深理解——用定时器1产生PWM来控制LED亮度(七色灯)

    引言:PWM对于很多软件工程师可能又熟悉又陌生,以PWM调节LED亮度为例,其本质是在每个周期都偷工减料一些,整体表现出LED欠压亮度不同的效果.像大家看到的七色彩灯其原理也类似,只是用3路PWM分别 ...

  3. [ZigBee] 16、Zigbee协议栈应用(二)——基于OSAL的无线控制LED闪烁分析(下)

    说在前面:上一篇介绍了无线LED闪烁实现的OSAL部分,本篇介绍如何实现无线数据收发及数据处理: 上一篇是用SI跟着流程查看源码,我个人认为以架构的思维去了解代码能让人更清晰 ::ZMain.c程序入 ...

  4. 树莓派 温度监控 PWM 控制风扇 shell python c 语言

    Mine: 图中圈出来的是三极管 和滤波电容 依赖库: wiringPi sudo apt-get install wiringpi Shell脚本 本文介绍使用Shell脚本在树莓派上启用软件PWM ...

  5. 树莓派GPIO控制LED彩灯

    树莓派使用GPIO接口来控制LED灯,自制五彩炫光的节日彩灯. 1.硬件准备 a. 树莓派(Raspberry Pi)一个 b. 彩色RGB二极管 c. 杜邦线 d. 5V电源引脚 以上所有零件均可在 ...

  6. 8_陀螺仪MPU6050和PWM控制在STM32F4-Discovery开发板上的实现

    非常早曾经就把圆点博士的程序从STM32F103移植到STM32F4_Discovery (STM32F407), battery.陀螺仪和PWM电机控制的程序都已经測试完成,执行有一段时间,正常.以 ...

  7. 18-ESP8266 SDK开发基础入门篇--TCP 服务器 RTOS版,串口透传,TCP客户端控制LED

    https://www.cnblogs.com/yangfengwu/p/11112015.html 先规定一下协议 aa 55 02 01 F1 4C 控制LED点亮  F1 4C为CRC高位和低位 ...

  8. PWM控制灯亮暗的verilog实现

    PWM的全称为Pulse-Width Modulation(脉冲宽度调制),即调节脉冲的占空比.当输出的脉冲频率一定时,输出的脉冲占空比越大,相当于输出的有效电平越大,这样也就简单实现了由FPGA来控 ...

  9. 【单片机入门】(四)应用层软件开发的单片机学习之路-----ESP32开发板PWM控制电机以及中断的使用

    引言 各位大佬,晚上好啊,在上一篇博客中,我们讲了什么是UART串口通讯,以及使用USB转TTL使得单片机可以和c#上位机做一个串口通讯,接下来,为大家带来PWM的概念原理,以及实际案例,使用PWM对 ...

随机推荐

  1. typedef定义函数类型或函数指针

    转载请标明出处: 最近在看redis的代码,发现了有关函数指针的部分,想把它记下来. 在redis中有类似下面的定义,利用typedef 定义了一个新的类型,这种类型是一个函数: typedef vo ...

  2. Android Studio 使用genymotion 模拟器运行app时 提示找不到任何设备

    原因是使用了genymotion 默认的Android toos .打开genymotion  选择设置  ADB  使用自己的SDKtools 选择Android Studio 使用的SDK位置就行 ...

  3. iframe中的jquery ui modal dialog 覆盖父窗口

    在iframe中 使用jquery ui dialog,弹出后可以覆盖父窗体 ///iframe中的jquery ui modal dialog 覆盖父窗口 function openDialog() ...

  4. allegro si(三)

    前言:si的教程市面上是很少的,layout是台湾工程师的强项,还有就是日本人,国人爱用AD. si的教程中靠谱的还是张飞的收费课程,还有华为的资料. Cadence SI 仿真实验步骤如下: 1.熟 ...

  5. php大力力 [024节]PHP中的字符串连接操作(2015-08-27)

    2015-08-27 php大力力024.PHP中的字符串连接操作 PHP中的字符串连接操作  阅读:次   时间:2012-03-25 PHP字符串的连接的简单实例 时间:2013-12-30 很多 ...

  6. php大力力 [022节]php编程要有一种态度:渴望遇见麻烦

    2015-08-27 php大力力022.php编程要有一种态度:渴望遇见麻烦 不能一遇到问题和麻烦,就烦躁焦躁. 写程序,写代码,调试实验就是天天遇见不可预期的错误bug,这是常态.老生常谈,要适应 ...

  7. LeetCode----3 Sum

    Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all un ...

  8. Js的 "继承"

    Js 和 Java , C等语言不是很一样 . 其他语言有 类和实例 但是Js就比较特殊 , 所以 类和实例 只能说是大多数面向对象编程的语言的基本概念 . Js比较特殊 , 它不去分类和实例的概念 ...

  9. ERP联系记录管理(十七)

    联系记录管理修改页面: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Co ...

  10. Mac 将mysql路径加入环境变量

    1.打开终端,输入: cd ~ 会进入~文件夹 2.然后输入:touch .bash_profile 回车执行后, 2.再输入:open -e .bash_profile 会在TextEdit中打开这 ...