1. 程式人生 > >STM32F103_TIM3輸出PWM波實現全綵呼吸燈

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實現呼吸

一、LED燈 1. 必須是全綵RGB_LED燈 2. 通過不同的紅綠藍三色LED混合出256種顏色,同電腦畫圖裡的調色RGB888,每個燈各用8位控制其亮度,其中全滅表示黑色。 二、 1. LED亮度等級表 /* LED亮度等級 PWM表,指數曲線 ,此表使用工程目

STM32F103定時器輸出PWM控制直流電機

       這個暑假沒有回家,在學校準備九月份的電子設計競賽。今天想給大家分享一下STM32高階定時器輸出PWM波驅動直流電機的問題。。        要想用定時器輸出的PWM控制直流電機,,首先要

stm32f407 輸出pwm

1.    pwm:脈衝寬度調製是一種模擬控制方式,其根據相應載荷的變化來調製電晶體基極或MOS管柵極的偏置,來實現電晶體或MOS管導通時間的改變,從而實現開關穩壓電源輸出的改變。這種方式能使電源的輸出電壓在工作條件變化時保持恆定,是利用微處理器的數字訊號對類比電路進行控制的

使用Arduino開發板點亮RGBLED

在本篇文章中,我們將瞭解什麼是RGB全綵LED燈以及如何使用Arduino開發板點亮它。 什麼是RGB LED燈? RGB LED燈可以通過混合紅色、綠色和藍色這三種基本顏色來發出不同的顏色。所以它實際上由3個獨立的LED組成,紅色、綠色和藍色包裝在一個盒子裡。這就是為什麼它有4

【定時器/中斷/PWM】利用一個定時器實現一路PWM輸出---點亮LED

------------------------------------------湊熱鬧的分割線------------------------------------------------ /*點亮led0(P1^0)和led7(P1^7) 其中led0以5v電壓正

STM32F1 PWM PB4沒輸出

很多人遇到這種問題,但是應該注意的是PB4在微控制器復位後,它是作為JTAG引腳來使用的,也就是說,要使用PB4你需要自己將其配置成普通GPIO,GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);  配置成普通GP

用DFS輸出n個數的排列(遞迴實現

最近在研究DFS,可能腦子不太夠吧,很多題都不知道怎麼實現,全排列應該是最簡單的題了。執行成功的程式碼如下所示:#include<stdio.h> #include<iostream> #include<string.h> using na

STM32 定時器2 CH1 CH2 PWM輸出 產生呼吸效果

     PWM一般用來驅動電機(控制速度),控制LED亮度,驅動開關電源電路等等,本例項通過改變PWM佔空比的方式來驅動LED燈,形成呼吸燈的效果。用這種方式來學習STM32 TIM2輸出PWM的配置。      以STM32F103C8T6為例,從其資料手冊中可以看到,P

STM32HAL定時器PWM輸出呼吸

STM32定時器區別      基本定時器主要特徵:      ●16位自動重灌載累加計數器      ●16位可程式設計(可實時修改)預分頻器,用於對輸入的時鐘按係數為1~65536之間的任意數值分頻      ●在更新事件(計數器溢位)時產生中斷/DMA請求 

STM32CubeMX學習教程之五:PWM實現呼吸效果

完整原始碼下載:https://github.com/simonliu009/STM32CubeMX-PWM-Output軟體:STM32CubeMX V4.25.0  System Workbench V2.4韌體庫版本:STM32Cube FW_F1 V1.6.1硬體:O

java實現那契數列,現在要求輸入一個整數n,請你輸出那契數列的第n項。 n

public class Solution_feibonaqi { public int Fibonacci(int n) { int result[] = { 0, 1 }; if (n < 2) { return result[n];

STM32F103輸出多路死區互補PWM

TIM1,TIM8可以產生死區互補PWM波,學習後發現stm32的定時器功能確實很強大,小總結一下方便以後使用的時候做參考。Stm32定時器一共分為三種:tim1和tim8是高階定時器,6和7是基本定時器,2—5是通用定時器。從名字就可以看得出來主要功能上的差異。今天我主要是

使用兩個定時器實現PWM(脈寬調製)——呼吸

PWM(脈寬調製)大家可以上網查查,其原理講解很多。為了更好的學習PWM,我特意參照別人寫的文章,自己也寫了一份程式碼來實現PWM。程式碼如下: #include <stc12c5a60s2.h> unsigned long cnt; unsigned int

STM32 重新理解GPIO配置以及配置PWM輸出

最近做了個SD卡BOOTLOARDER程式。在測試過程中,想到可以利用板子的LED燈進行螢火蟲燈的製作,通過BOOTLOARDER將APP檔案下載到板子裡面檢視LED燈的閃爍。可能是因為太過自信,這麼個小程式能搞不定,所以並沒有仔細閱讀DATASHEET,導致最終費了半天時

ZYNQ自定義AXI匯流排IP應用——PWM實現呼吸效果

一、前言   在實時性要求較高的場合中,CPU軟體執行的方式顯然不能滿足需求,這時需要硬體邏輯實現部分功能。要想使自定義IP核被CPU訪問,就必須帶有匯流排介面。ZYNQ採用AXI BUS實現PS和PL之間的資料互動。本文以PWM為例設計了自定義AXI匯流排IP,來演示如何靈活運用ARM+FPGA的架構。 功

jquery實現選/反選功能

click demo lar sim llc res rip rop 個數 <!DOCTYPE html><html><head> <meta http-equiv="Content-Type" content="text/h

jQuery實現選反選功能

ava -type func tex solid blog pan 原因 input 廢話不說,直接上代碼! <html> <head> <meta http-equiv="Content-Type" content="text/html;

用Mysqldump實現庫備份+binlog的數據還原

備份 mysql 隨著業務量的增長,數據庫也是成倍增長,原來一直使用的全庫備份不再適合現在的數據庫了,動輒就備份10G-20G,太占用磁盤空間,所以就考慮用更簡潔更快速更節省磁盤空間的備份方法,這就想到了使用binlog日誌來進行備份和恢復,下面是具體實施的方法:環境介紹:操作系統:Centos

vue中實現選功能

containe lda mod html ret model methods == -m <!DOCTYPE html><html><head><meta charset="utf-8"><title>Vue 測

STM32定時器輸出PWM頻率和步進電機控制速度計算

內部 定時 .cn 但是 nbsp 返回 定時器 開發 r12 1、STM32F4系列定時器輸出PWM頻率計算 第一步,了解定時器的時鐘多少:   我們知道AHP總線是168Mhz的頻率,而APB1和APB2都是掛在AHP總線上的。 (1)高級定時器timer1, time