STM32F103_TIM3输出PWM波实现全彩呼吸灯

发布者:古通闲人最新更新时间:2019-04-09 来源: eefocus关键字:STM32F103  TIM3输出  PWM波  全彩呼吸灯 手机看文章 扫描二维码
随时随地手机看文章

一、LED灯


1. 必须是全彩RGB_LED灯


2. 通过不同的红绿蓝三色LED混合出256种颜色,同电脑画图里的调色RGB888,每个灯各用8位控制其亮度,其中全灭表示黑色。


二、


1. LED亮度等级表


/* LED亮度等级 PWM表,指数曲线 ,此表使用工程目录下的python脚本index_wave.py生成*/


const uint16_t indexWave[] = {

1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 

    2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5,

    5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10,

    11, 12, 12, 13, 14, 15, 17, 18,

    19, 20, 22, 23, 25, 27, 29, 31, 

    33, 36, 38, 41, 44, 47, 51, 54, 

    58, 63, 67, 72, 77, 83, 89, 95, 

    102, 110, 117, 126, 135, 145, 156, 

    167, 179, 192, 206, 221, 237, 254,

    272, 292, 313, 336, 361, 387, 415,

    445, 477, 512, 512, 477, 445, 415, 

    387, 361, 336, 313, 292, 272, 254, 

    237, 221, 206, 192, 179, 167, 156, 

    145, 135, 126, 117, 110, 102, 95, 

    89, 83, 77, 72, 67, 63, 58, 54, 51, 

    47, 44, 41, 38, 36, 33, 31, 29, 27,

    25, 23, 22, 20, 19, 18, 17, 15, 14,

    13, 12, 12, 11, 10, 9, 9, 8, 8, 7, 7,

    6, 6, 5, 5, 5, 4, 4, 4, 4, 3, 3, 3, 

    3, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1

};

2. 各项参数宏定义


extern uint16_t POIT_NUM;

extern __IO uint16_t period_class;

 

/*电压幅值等级数*/

#define AMPLITUDE_CLASS 256

 

/*****************定时器通道**************************/

#define   BREATH_TIMx                      TIM3

#define   BREATH_TIM_APBxClock_FUN         RCC_APB1PeriphClockCmd

#define   BREATH_TIM_CLK                   RCC_APB1Periph_TIM3

/*****************红灯**************************/

#define   BREATH_RED_LED_PORT                            GPIOB

#define   BREATH_RED_LED_PIN                            GPIO_Pin_5

#define   BREATH_RED_CCRx                 CCR2    

#define   RED_TIM_OCxInit                 TIM_OC2Init

#define     RED_TIM_OCxPreloadConfig            TIM_OC2PreloadConfig

 

/*****************绿灯**************************/

#define   BREATH_GRE_LED_PORT                            GPIOB

#define   BREATH_GRE_LED_PIN                          GPIO_Pin_0

#define   BREATH_GRE_CCRx                 CCR3

#define   GRE_TIM_OCxInit                 TIM_OC3Init

#define     GRE_TIM_OCxPreloadConfig            TIM_OC3PreloadConfig

 

 

/*****************蓝灯**************************/

#define   BREATH_BLU_LED_PORT                            GPIOB

#define   BREATH_BLU_LED_PIN                            GPIO_Pin_1

#define   BREATH_BLU_CCRx                 CCR4

#define   BLU_TIM_OCxInit                 TIM_OC4Init

#define     BLU_TIM_OCxPreloadConfig            TIM_OC4PreloadConfig

 

 

#define   BREATH_LED_REMAP_FUN()       GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3 ,ENABLE);

 

//中断

#define   BREATH_TIM_IRQHandler                        TIM3_IRQHandler

 


三、breathing_led.c 编写


1. GPIO配置函数,其中red灯用TIM3_CH2,其由PB5部分重映射而来,因此在配置时必须开启AFIO时钟,并重映射。


__IO uint16_t period_class = 1;//pwm表中的每个数据只使用一次

uint16_t POIT_NUM = sizeof(indexWave) / sizeof (indexWave[0]); //计算pwm表中一共有多少数据,数据表应放在此条语句之前

static void Breath_LED_Config(void)

{

    GPIO_InitTypeDef GPIO_InitStructure;    

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); //重映射时必须开启AFIO时钟

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

 

    BREATH_LED_REMAP_FUN();

    

    GPIO_InitStructure.GPIO_Pin = BREATH_RED_LED_PIN;

    GPIO_Init(BREATH_RED_LED_PORT, &GPIO_InitStructure);

 

    GPIO_InitStructure.GPIO_Pin = BREATH_GRE_LED_PIN;

    GPIO_Init(BREATH_GRE_LED_PORT, &GPIO_InitStructure);

    

    GPIO_InitStructure.GPIO_Pin = BREATH_BLU_LED_PIN;

    GPIO_Init(BREATH_BLU_LED_PORT, &GPIO_InitStructure);

}


2. 中断向量表配置,只用到定时器3中断,因而中断优先级可任意配置。


/**

  * @brief  中断参数配置

  * @param  无

  * @retval 无

  */

static void Breath_NVIC_Config(void)

{

    NVIC_InitTypeDef NVIC_InitStructure;

    

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

    

    NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;

 

    NVIC_Init(&NVIC_InitStructure);

}

3. 定时器模式配置函数,其中低电平led量,因而PWM有效电平为low,占空比通过TIM_TimeBaseInitStructure.TIM_Period ,TIM_OCInitStructure.TIM_Pulse 来配置,初始化占空比为0;


static void Breath_TIM_Config(void)

{

    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;

    TIM_OCInitTypeDef TIM_OCInitStructure;

    //开时钟

    BREATH_TIM_APBxClock_FUN(BREATH_TIM_CLK, ENABLE);

    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;

    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;

    TIM_TimeBaseInitStructure.TIM_Period = (512 - 1);

    TIM_TimeBaseInitStructure.TIM_Prescaler =(10 - 1); 

    TIM_TimeBaseInit(BREATH_TIMx, &TIM_TimeBaseInitStructure);

    //输出比较配置

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;  /********************配置为低的原因是  低电平点亮LED灯**********************/            

    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable ;

    TIM_OCInitStructure.TIM_Pulse = 0;

    

    RED_TIM_OCxInit(BREATH_TIMx, &TIM_OCInitStructure); 

    RED_TIM_OCxPreloadConfig (BREATH_TIMx, TIM_OCPreload_Enable );  //预装载使能

 

    GRE_TIM_OCxInit(BREATH_TIMx, &TIM_OCInitStructure);

    GRE_TIM_OCxPreloadConfig (BREATH_TIMx, TIM_OCPreload_Enable );

 

    BLU_TIM_OCxInit(BREATH_TIMx, &TIM_OCInitStructure);

    BLU_TIM_OCxPreloadConfig (BREATH_TIMx, TIM_OCPreload_Enable );

    

    TIM_ARRPreloadConfig (BREATH_TIMx, ENABLE);//一定要使能自动重装载        

    TIM_Cmd (BREATH_TIMx, ENABLE);

    //中断开启

    TIM_ITConfig(BREATH_TIMx, TIM_IT_Update, ENABLE);

    //中断优先级 

        Breath_NVIC_Config();    

}

.4. 初始化


void Breath_LED_Init(void)

{

    Breath_LED_Config();

    Breath_TIM_Config();

}

四、中断函数,关键点为将每个亮度等级(一共有512个亮度等级,也就是TIM_Period的值)又分为256个等级,通过对比设定参数与实际参数控制LED亮灭来实现调色。


extern uint16_t indexWave[];

extern __IO uint32_t rgb_color;

 

void BREATH_TIM_IRQHandler(void)

{

    static uint16_t period_cnt = 0;

    static uint16_t pwm_index = 0;

    static uint16_t amplitude_cnt = 0;//计算幅值等级

        if(TIM_GetFlagStatus (BREATH_TIMx, TIM_FLAG_Update) == SET)

        {

            amplitude_cnt ++;

            if(amplitude_cnt > AMPLITUDE_CLASS)

            {

                period_cnt ++;

                

                if(period_cnt > period_class)

                {

                    period_cnt = 0;

                    pwm_index ++;

                    

                    if(pwm_index >= POIT_NUM)

                    {

                        pwm_index = 0;

                    }                        

                }    

                amplitude_cnt = 0;

            }

            

            else

            {

                if(((rgb_color & 0xff0000) >> 16) >= amplitude_cnt)

                    BREATH_TIMx -> BREATH_RED_CCRx = indexWave[pwm_index];

                else 

                    BREATH_TIMx -> BREATH_RED_CCRx = 0;

                

                if(((rgb_color & 0x00ff00) >> 8) >= amplitude_cnt)

                    BREATH_TIMx -> BREATH_GRE_CCRx = indexWave[pwm_index];

                else 

                    BREATH_TIMx -> BREATH_GRE_CCRx = 0;

                

                if((rgb_color & 0xff) >=amplitude_cnt)

                    BREATH_TIMx -> BREATH_BLU_CCRx = indexWave[pwm_index];

                else 

                    BREATH_TIMx -> BREATH_BLU_CCRx = 0;                

            

            }        

            

            TIM_ClearITPendingBit (BREATH_TIMx, TIM_IT_Update);

 

        }

五、主函数


#include "breathing_led.h"

 

#define SOFT_DELAY() Delay(0xFFFFFF);  //通过设定此参数来实现指定颜色,其值可通过电脑-画图-编辑颜色算得

 

__IO uint32_t rgb_color = 0x9CE326; // 156  227  38,此参数用来设置混合的颜色 

 

 

int main()

{

    Breath_LED_Init();

    

    while(1)

    ;   

}


关键字:STM32F103  TIM3输出  PWM波  全彩呼吸灯 引用地址:STM32F103_TIM3输出PWM波实现全彩呼吸灯

上一篇:STM32实战 2.矩阵键盘通过串口3输出
下一篇:STM32的PWM波的频率和占空比

推荐阅读最新更新时间:2024-03-16 16:27

stm32f103学习笔记——NVIC初始化
初学STM32F103的中断优先级配置,感觉很难找到着手点,下面给出NVIC初始化程序的注释,供大家参考: void Nvic_Init(void)//中断优先级初始化 { NVIC_InitTypeDef NVIC_InitStructure; /* NVIC_PriorityGroup */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//指定抢占优先级为两位,响应优先级为2位,(抢占优先级- 响应优先级- 中断向量表顺序) NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;//指定TIMER3中断 NVIC_InitStruct
[单片机]
stm32f103c8t6控制ESP8266与手机APP通信
之前已经发表过利用stm32控制蓝牙模块与手机APP通信的文章,那么现在我就来说说用WIFI模块来控制与手机APP的通信 首先需要的器件如下: stm32f103c8t6 ESP8266-01S(默认波特率115200) 除此之外还需要手机下载一个通讯软件,我用的是安卓手机应用宝上面的TCP连接这个APP WIFI模块的连接如下所示: 代码很简单,我主要附上主函数代码: /* ESP8266 AP+Station服务器模式测试 UART2 PA2 PA3 与网络模块ESP进行通信 UART1 PA9 PA10 进行数据跟踪 */ #include delay.h #include led.h #in
[单片机]
<font color='red'>stm32f103</font>c8t6控制ESP8266与手机APP通信
STM32F103:GPIO八种工作原理详解
一、GPIO简介 GPIO就是通用I/O(输入/输出)端口,是STM32可控制的引脚。 STM32芯片的GPIO引脚与外部设备连接起来,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。 二、GPIO工作模式 1. 四种输入模式 GPIO_Mode_IN_FLOATING 浮空输入模式 GPIO_Mode_IPU 上拉输入模式 GPIO_Mode_IPD 下拉输入模式 GPIO_Mode_AIN 模拟输入模式 2. 四种输出模式 GPIO_Mode_Out_OD 开漏输出模式 GPIO_Mode_Out_PP 推挽输出模式 GPIO_Mode_AF_OD 复用开漏输出模式 GPIO_Mode_AF_PP 复用推挽输出模
[单片机]
<font color='red'>STM32F103</font>:GPIO八种工作原理详解
STM32F103做CAN的收发通信的程序思路与代码分享
CAN通信 CAN 是Controller Area Network 的缩写(以下称为CAN),该通信使用的是ISO11898标准,该标准的物理层特征如下图所示。 CAN协议是通过以下5种类型的帧进行的: 数据帧 摇控帧 错误帧 过载帧 帧间隔 另外,数据帧和遥控帧有标准格式和扩展格式两种格式。标准格式有11 个位的标识符(ID),扩展格式有29 个位的ID。 大部分系统使用的都是数据帧 ,我这里使用的也是数据帧。 数据帧一般由7个段构成,即: (1) 帧起始。表示数据帧开始的段。 (2) 仲裁段。表示该帧优先级的段。 (3) 控制段。表示数据的字节数及保留位的段。 (4) 数据段。数据的内容,一帧可发送0~8个字节的数据
[单片机]
用<font color='red'>STM32F103</font>做CAN的收发通信的程序思路与代码分享
将伺服电机与STM32F103C8板连接起来的教程
在电子领域,伺服电机主要用于机器人项目,因为它们的准确性和易于操作。伺服电机尺寸较小,非常有效且节能。它们提供高扭矩,可用于根据电机规格提升或推动重物。在本教程中,我们将了解伺服电机以及如何将伺服与STM32F103C8板连接。还连接了一个电位计来改变伺服电机轴的位置,和一个LCD来显示角度值。 所需组件 STM32F103C8 (蓝色药丸)板 伺服电机 (SG90) 液晶显示器(16x2) 电位计 面包板 跳线 电路图和连接 SMT32F103C8 引脚详细信息 在STM32F103C8中,我们有10个ADC引脚(PA0-PB1),这里我们只使用一个引脚(PA3)进行模拟读取(),用于通过电位计设置电机的轴位置。此外,在
[单片机]
将伺服电机与<font color='red'>STM32F103</font>C8板连接起来的教程
基于STM32F103C8T6的音频显示设计
0. 开机默认音频模式,按下S1进入麦克风模式,输入电压DC12~24V。 1. 六种音频显示模式(4种频谱显示,2种时域显示),经扫频音乐测试; 2. 采样电路采用自动增益控制(AGC),性能大大提升。 3. 代码清晰结构清晰,绝非粗制滥造。 4. 默认256分频,当然也可以设置1024分频。 5. 256分频,里面频点通过软件进行了显示优化,不需要调节显示强度。 6. S1按键:打开或关闭麦克风,S2按键:切换显示模式,S3按键:去除显示落点,S4按键:强度调节(1024分频可用)。 7. 支持麦克风信号和音频信号输入显示。 8. 预留2路电机,2路UART,1个RTC芯片。
[单片机]
STM32F103学习之RCC配置
STM32F103时钟配置 STM32的独立时钟源共有四个: 1.HSE(外部高速时钟,4~16MHz); 2.HSI(内部高速时钟,8MHz,精度不高); 3.LSE(外部低速时钟,32.768kHz,一般用于产生精确秒信号); 4.LSI(内部低速时钟,40kHz); 还有几个衍生的时钟 5.PLLCLK(锁相环时钟,来源可以是 HSE,HSE/2,HSI/2 这三种再进行倍频得到); 6.SYSCLK(系统时钟,来源可以是 HSE,HSI,PLL 这三种); 7.HCLK(AHB总线时钟,由SYSCLK分频得到); 8.PCLK1(APB1低速时钟,最高36MHz,由HCLK分频得到)
[单片机]
<font color='red'>STM32F103</font>学习之RCC配置
STM32F103单片机PWM功能实现
PWM模式也叫脉冲宽度调制模式,它可以产生一个频率和占空比可调的方波。由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的信号。在硬件电路中,PWM波产生通常是由一个三角波和参考值送入比较器中,然后比较器输出的就是PWM波。 V1是三角波发生器,幅度为5V,频率为1K,V2是直流源,电压为3V,将这两个波形送入到比较器中,然后比较器输出的就是PWM波。输出波形如下: 当V1的电压值大于V2时,比较器输出高电平。当V1电压值小于V2时,比较器输出的就是低电平。改变V2的值,就可以改变占空比。 在单片机中寄存器ARR的值就相当于V1的值,CCR的值就相当于V2的值。当ARR和CCR寄存器的值设置好之后,
[单片机]
<font color='red'>STM32F103</font>单片机<font color='red'>PWM</font>功能实现
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved