0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于stm32的PWM输出呼吸灯(包括stm32呼吸灯代码)

ss 来源:网络整理 2018-03-28 16:23 次阅读

基于stm32的pwm呼吸灯

使用定时器来控制I/O口输出PWM波形,从而驱动LED灯出现类似呼吸频率一般的亮灭。

硬件电路图:

基于stm32的pwm呼吸灯

我的收获:

基于stm32的pwm呼吸灯

这是STM32数据手册上对TIM3通用定时器复用功能重映象的描述,假设让PA6作为PWM输出,从图中可以看出PA6对应TIM3的通道1,

使能TIM3通道1的函数为

TIM_OC1Init();1

同样的,如果想要使能PA7,它对应的是TIM3的通道2,那么使能通道2的函数便是:

TIM_OC2Init()1

以此类推,需要注意,使能不同相同定时器不同通道的函数是有一点小差别的,防止在程序中调用TIM_OC1Init()函数来使能TIM3通道2这种情况的发生。

基于stm32的pwm呼吸灯

注意看这里,假设使用的是TIM3的通道1,那么这里就要写成

TIM3-》CCR11

类似的如果用TIM3定时器的通道2,这里就要相应的改为

TIM3-》CCR21

这同样是为了防止本来计划使用的是TIM3的通道1,反而在这里自摆乌龙写为了TIM-》CCR2的情况,这样的错误一般很隐蔽,不容易查找。

相应的程序已经上传,但是不知道为什么在这里无法显示程序的下载地址,需要下载可以去我的资源里下载。

工程文件为

Progect–》RVMDK(uv4)–》iSO_STM32

基于stm32的pwm呼吸灯

STM32PWM输出实现LED灯渐亮渐灭程序:

/**说明:

*PA0:KEY1;PA1:KEY2;

*PA2:LED1;PA3:LED2;

*PA9:USART1_TX;PA10:USART1_RX

*/

#include “stm32f10x.h”

#include “stm32f10x_rcc.h”

#include “stm32f10x_gpio.h”

#include “stm32f10x_tim.h”

#include “stm32f10x_pwr.h”

#include “stm32f10x_exti.h”

#include “system_stm32f10x.h”

#include “misc.h”

void RCC_Configuration(void);

void GPIO_Configuration(void);

void TIM2_Configuration(void);

void delay_ms(u16 time);

int main()

{

u8 led_fx=1;

u16 led_dt=0;

RCC_Configuration();

GPIO_Configuration();

TIM2_Configuration();

while(1)

{

delay_ms(10);

if(led_fx==1)

{

led_dt++;

}else{

led_dt--;

}

if(led_dt》100) led_fx=0;//可以和初始值一样

if(led_dt==0) led_fx=1;

TIM_SetCompare3(TIM2,led_dt);//通道3没有重影像是PA2对应LED1

TIM_SetCompare4(TIM2,led_dt);//通道4没有重影像是PA3对应LED2

}

}

void RCC_Configuration(void)

{

SystemInit();

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);

//GPIO_AFIODeInit();和下面相同效果,可以查看源码证明

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

}

void GPIO_Configuration(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

//GPIO_PinRemapConfig(GPIO_PartialRemap2_TIM2,ENABLE);//端口映射函数

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3;//GPIO_Pin_3对应channel3,主函数改为:TIM_SetCompare3

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_Init(GPIOA, &GPIO_InitStructure);

}

void TIM2_Configuration(void)

{

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

TIM_OCInitTypeDef TIM_OCInitStructure;

TIM_DeInit(TIM2);

TIM_InternalClockConfig(TIM2);

//定时器初始化

TIM_TimeBaseStructure.TIM_Period = 100-1;//初始值是100,2MHz=2000KHz,2MHz/100=0.02MHz,所有周期T=1/0.02MHz=50us,示波器显示周期应该为50us

TIM_TimeBaseStructure.TIM_Prescaler = 36-1;//36倍分频,72MHz/36=2MHz

TIM_TimeBaseStructure.TIM_ClockDivision = 0;

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

//PWM初始化

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

TIM_OCInitStructure.TIM_Pulse = 50;//占空比值是50,所以占空比是:50/100=50%

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;

TIM_OC3Init(TIM2,&TIM_OCInitStructure);

TIM_OCInitStructure.TIM_Pulse = 20;

TIM_OC4Init(TIM2,&TIM_OCInitStructure);

//TIM_OC3PreloadConfig(TIM2,TIM_OCPreload_Enable);

//TIM_ARRPreloadConfig(TIM2, ENABLE);

TIM_Cmd(TIM2,ENABLE);

TIM_CtrlPWMOutputs(TIM2,ENABLE);

}

void delay_ms(u16 time)

{

u16 i=0;

while(time--)

{

i=12000;

while(i--);

}

}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • PWM
    PWM
    +关注

    关注

    114

    文章

    4888

    浏览量

    209876
  • STM32
    +关注

    关注

    2239

    文章

    10669

    浏览量

    348692
  • 呼吸灯
    +关注

    关注

    9

    文章

    107

    浏览量

    42473
收藏 人收藏

    评论

    相关推荐

    PWM实现呼吸效果

    的是#11口。呼吸源码如下:void setup (){pinMode(11,OUTPUT);}void loop(){//循环语句,控制PWM亮度的增加for (int a=0; a=0;a--
    发表于 07-20 15:03

    基于stm32PWM呼吸工程分享

    使用pwm波调整led的亮度,其中led的文件包含在附件里面,代码如下:通过TIM3通用定时器的CH1通道输出一个PWM波,并调整
    发表于 07-02 07:51

    基于stm32呼吸源程序工程

    一个有趣实用的程序,通过简单延时,程序模拟PWM波实现LED呼吸闪烁。 这是一个在PB5引脚上的LED,程序正确可执行,直接修改可移植。分享一些有趣的实验小程序..... 单片机源程序如下
    发表于 07-02 03:00

    基于stm32PWM呼吸工程分享

    使用pwm波调整led的亮度,其中led的文件包含在附件里面,代码如下:通过TIM3通用定时器的CH1通道输出一个PWM波,并调整
    发表于 07-06 07:37

    STM32开发入门——呼吸

    stm32性能强大,但其开发难度又显著高于Arduino等单片机。本文将通过“呼吸”程序,介绍stm32PWM方波的产生及中断函数的应用
    发表于 07-01 09:54

    怎么通过PWM来实现呼吸

    说下我是怎么通过这个PWM来实现呼吸的。硬件的准备就不说了,想实现呼吸的你这个硬件配置肯定是莫得问题。我重点说下这个
    发表于 08-11 06:17

    采用定时器PWM功能实现呼吸的功能

    功能实现:采用定时器PWM功能实现呼吸的功能,PWM频率为1KHz,呼吸周期为1s准备工作:
    发表于 08-12 08:06

    PWM输出制作呼吸

    PWM:脉冲宽度调制(Pulse width modulation)。PWM输出实验,制作呼吸
    发表于 08-18 07:10

    STM32Cube如何配置PWM呼吸

    STM32Cube如何配置PWM呼吸
    发表于 11-23 07:17

    STM32 PWM是如何去控制呼吸的程序呢

    PWM的工作原理是什么?STM32 PWM是如何去控制呼吸的程序呢?
    发表于 11-26 07:00

    基于stm32 f103的pwm呼吸程序代码分享

    基于stm32 f103的pwm呼吸程序代码分享
    发表于 12-14 07:52

    stm32是怎样使用延时去实现一种呼吸

    stm32使用延时实现呼吸(寄存器)该实验是使用STM32F103C8T6实现,使用寄存器编程。呼吸
    发表于 01-17 07:14

    PWM实现呼吸的应用

    stm32实现PWM最简单方法前言一、PWM概念二、PWM应用输出比较功能框图三、PWM
    发表于 01-21 13:18

    STM32呼吸的原理是什么

    前段时间学习stm32的时候就做过呼吸实验,浏览了一些博客后,做下总结呼吸原理其实是利用pwm
    发表于 02-21 07:26

    请问一下STM32 PWM是如何去实现呼吸设计的

    STM32 PWM实现呼吸使用STM32F103ZET6 定时器4 CH2通道产生PWM波,在
    发表于 02-21 07:30