国产成人av人人爽人人澡-亚洲国产日韩欧美一区-好吊日视频这里只有精品-日本高清精品视频在线

你好!歡迎來到深圳市穎特新科技有限公司!
語言
當前位置:首頁 >> MM32/靈動微電子 >> 靈動微-呼吸燈功能

靈動微-呼吸燈功能

關鍵字:靈動微電子 呼吸燈功能 MM32L0系列產品芯片 作者: 來源: 發(fā)布時間:2022-06-08  瀏覽:47
呼吸燈,就是指電子產品上的LED燈的亮度隨著時間由暗到亮逐漸增強,再由亮到暗逐漸衰減,有節(jié)奏感地一起一伏,就像是在呼吸一樣,因而被廣泛應用于手機、電腦等電子設備的指示燈中。在使用MCU開發(fā)相關的應用產品中也可以加入呼吸燈功能,增強用戶的體驗感,在本實驗中將介紹如何使用MM32L0系列產品芯片做呼吸燈功能。

在平時應用中可以知道,MCU的GPIO輸出高低電平變化可以實現LED燈的亮、滅兩個過程,如果GPIO的電平一直維持高電平或者低電平,LED燈就處于長亮或長滅的狀態(tài),呼吸燈就是通過較高頻率的電平變化來實現亮滅的切換,由于人的視覺暫留效應,肉眼無法迅速捕捉快速亮滅變化的過程,所以在視覺中一直出現一直亮或者滅的狀態(tài),通過調整占空比可以控制LED燈的亮度,給人視覺上一種燈光由暗到亮逐漸增強,然后又由亮到暗逐漸衰減。

正常的成年人的吸氣呼氣時間整個過程持續(xù)大約3秒時間,即吸氣時間(LED燈亮度逐漸變亮)時間為1.5S,吸、呼氣時間(LED燈亮度逐漸變暗)時間為1.5S。

亮度隨著時間逐漸變強再衰減,可以用兩種算數方式實現:半周期的正弦函數曲線和指數上升曲線及對稱的下降沿曲線。

指數方式曲線圖

指數方式曲線圖






要控制 LED 燈達到呼吸燈的效果,實際上就是要控制 LED 燈的亮度擬合呼吸特性曲線,在本次實驗中,將采用指數上升曲線及對稱的下降沿曲線方式,用戶如果對正弦方式感興趣也可以進行嘗試。在本次實驗中,我們使用MM32L0xx輸出較高頻率的PWM信號,通過調制信號的占空比,控制LED燈的亮度。

生成指數方式的曲線圖主要因素:

TIMPeriod:定時器的計數周期,它的值必須與PWM 表中的極大值相等(應用中賦值需要減 1),而 PWM表的極大值決定了控制的分辨率。例如極大值為 10時,PWM 占空比只有10個等級,精確到0.1,當極大值為1000 時,PWM 占空比1000個等級,精確到0.001。在本次實驗中設置定時器的計數周期值為255+1,即PWM表中的極大值也是256。

TIM_Prescaler:定時器時鐘分頻因子,它控制定時器計數器 CNT計數加1所需要的時間,它的值太大會導致輸出的單個PWM波周期過長,影響控制的動態(tài)特性。如控制LED燈時,該值太大會導致LED燈開關時間變長,閃爍明顯。一般來說,該值越小越好。在本次實驗中設置定時器時鐘分頻因子為1757+1,即對時鐘1758分頻。


PWM 表的點數:PWM表的點數即對擬合曲線的采樣點數,即把LED燈的亮度分為0-255個等級,采樣點越多,能更好地還原擬合曲線,采樣點太少,可能會導致失真。在本次實驗中設置PWM 表的點數為40。

Period_class:周期倍數,即 PWM 表中每個元素的循環(huán)次數,它影響擬合曲線的周期。

在本次實驗中設置設置周期倍數為8。

本次實驗程序直接從MM32L073的定時器PWM輸出的例程的基礎上修改得來,TIM3配置成向上計數,PWM通道輸出也被配置成當計數器 CNT 的值小于輸出比較寄存CCR1的值時,PWM通道輸出低電平,點亮 LED 燈。在函數的最后還使能了定時器中斷,每當定時器的一個計數周期完成時,產生中斷,配合中斷服務函數,即可切換CCR1 比較寄存器的值。


程序配置如下:

TIM3初始化配置

//LED亮度等級列表

uint8_t  PWM_Wave[] = {1,1,2,2,3,4,6,8,10,14,19,25,33,44,59,80,107,143,191,255,255

,191,143,107,80,59,44,33,25,19,14,10,8,6,4,3,2,2,1,1};

TIM3的初始化、中斷及PWM輸出配置:

void TIM3_PWM_Init(u16 arr,u16 psc)



GPIO_InitTypeDef GPIO_InitStructure;

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

TIM_OCInitTypeDef  TIM_OCInitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//使能TIM3時鐘

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);//使能GPIOB時鐘

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //TIM3_CH1

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽輸出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOB, &GPIO_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中斷源

NVIC_InitStructure.NVIC_IRQChannelPriority = 0x01; //設置中斷優(yōu)先級

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能


NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器

TIM_TimeBaseStructure.TIM_Period = arr;//設置自動裝載寄存器值

TIM_TimeBaseStructure.TIM_Prescaler =psc; //設置預分頻值

TIM_TimeBaseStructure.TIM_ClockDivision=0; //設置時鐘分割

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//設置計數模式

TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //初始化TIM3寄存器

TIM_OCStructInit(&TIM_OCInitStructure);

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //配置PWM模式

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //輸出使能

TIM_OCInitStructure.TIM_Pulse = 0; //設置初始脈沖寬度為0

TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;//小于CCR1值為低電平

TIM_OC1Init(TIM3, &TIM_OCInitStructure); //初始化TIM3_OC1寄存器

TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); //預裝載使能

TIM_ARRPreloadConfig(TIM3, ENABLE); //使能 TIM 重載寄存器 ARR

TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); //使能TIM3的更新中斷

TIM_Cmd(TIM3, ENABLE);//使能TIM3


}


中斷服務函數:


void TIM3_IRQHandler(void)


{     


static uint8_t a = 0;//PWM表的成員數,用于PWM查表


static uint8_t b = 0;//計算周期數


if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)//判斷更新中斷標志位


{                   


b++;


if(b >= 8) //周期倍數


{


TIM3->CCR1 = PWM_Wave [a]; //修改定時器比較寄存器值


a++;//查表指向下一個成員變量


if( a >=  40) //查表查到最后一位,重新指向表頭


{


a=0;


}


b=0;       //重置周期計數標志


}


TIM_ClearITPendingBit (TIM3, TIM_IT_Update);


}


}


主程序:


int main(void)


{


TIM3_PWM_Init(255,1757);


while(1)                                                                                              


{


}     


}



本次實驗配置擬合曲線周期計算:

TIMPeriod=255+1;

TIM_Prescaler=1757+1;

PWM 表的點數(a)=40;

Fpwm = 48M / ((arr+1)*(psc+1))(單位:Hz)

定時器 update 事件周期,即定時器中斷周期:t1= 1/ Fpwm = 9376us

每個 PWM 點的時間:t2= t1*8= 75008us

遍歷PWM表的周期時間為:t3=t2*40= 3000320us

通過公式的計算可知本工程的配置可使得輸出的擬合曲線周期約等于3秒,符合成年人的吸氣呼氣時間整個過程持續(xù)大約3秒時間。

利用GPIO模擬PWM波形設計呼吸燈功能:

void LedOnOff(uint16_t t,uint16_t i) 


{  


LED1_ON();


delay_us(i); 


LED1_OFF(); 


delay_us(t-i);    


}


int main(void)


{


int i,j;


LED_Init();


TIM3_PWM_Init(255,1757);


while(1)


{


for(i=0;i<100;i+=1){


for(j=0;j<47;j+=1)





LedOnOff(100,i);


}


}


for(i=100;i>0;i--) {


for(j=0;j<46;j+=1)





LedOnOff(100,i);


}


}


}     


}


 

使用MM32L0系列MCU上述兩種方式都可以實現呼吸燈功能,兩種方法GPIO分別是PB4和PB5,download到MiniBoard中,可以對比測試兩種實現方法的差異性,選擇合適的呼吸燈實現方式。

如需要了解更多靈動微MCU產品,請聯系靈動微核心代理商-穎特新科技

編輯:ls  最后修改時間:2022-06-08

聯系方式

0755-82591179

傳真:0755-82591176

郵箱:vicky@yingtexin.net

地址:深圳市龍華區(qū)民治街道民治大道973萬眾潤豐創(chuàng)業(yè)園A棟2樓A08

Copyright © 2014-2025 穎特新科技有限公司 All Rights Reserved.  粵ICP備14043402號-4