本文目標(biāo):基于HAL庫(kù)的stm32呼吸燈實(shí)驗(yàn)
按照本文的描述,應(yīng)該可以在你所處的硬件上調(diào)通代碼。
先決條件:裝有編譯和集成的開(kāi)發(fā)環(huán)境,比如:Keil uVision5。
板子硬件要求:設(shè)計(jì)了LED在定時(shí)器的接口上
呼吸燈是一種常見(jiàn)的電子制作實(shí)驗(yàn)項(xiàng)目,其通過(guò)控制 LED 燈的亮度變化,實(shí)現(xiàn)了一種模擬人類呼吸的效果。 作為一種常見(jiàn)的數(shù)字調(diào)光技術(shù),呼吸燈廣泛應(yīng)用于工業(yè)控制、智能家居等領(lǐng)域。 而在此過(guò)程中,使用微控制器如 STM32 ,則可以更加便捷、靈活地實(shí)現(xiàn)呼吸燈的控制。 因此,本文將介紹基于 STM32 的呼吸燈實(shí)驗(yàn),通過(guò)代碼編寫、編譯下載和調(diào)試運(yùn)行,實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的呼吸燈控制系統(tǒng)。
實(shí)驗(yàn)?zāi)康?/h2>
本實(shí)驗(yàn)旨在通過(guò) STM32 的呼吸燈實(shí)驗(yàn),掌握 STM32 的編程方法和調(diào)試技巧,并深入理解呼吸燈的原理、調(diào)光技術(shù)和周期控制等知識(shí)點(diǎn)。 在本實(shí)驗(yàn)過(guò)程中,我們將涉及 STM32 的 GPIO 端口配置、定時(shí)器和 PWM 的使用、時(shí)鐘配置和中斷處理等技術(shù)
PWM介紹
PWM(Pulse Width Modulation)即脈沖寬度調(diào)制技術(shù),是一種通過(guò)調(diào)節(jié)脈沖信號(hào)的占空比來(lái)實(shí)現(xiàn)模擬信號(hào)的調(diào)節(jié)的技術(shù)。 在PWM控制中,周期性的方波稱為PWM波,其占空比是指高電平時(shí)間與周期的比值。 PWM波信號(hào)可以通過(guò)控制電路的輸出電平來(lái)實(shí)現(xiàn)對(duì)外設(shè)的控制,如對(duì)LED的亮度、電機(jī)的轉(zhuǎn)速等。 通常使用定時(shí)器模塊來(lái)生成PWM波,定時(shí)器在每個(gè)周期內(nèi)發(fā)出固定的時(shí)間間隔中斷,根據(jù)設(shè)定的占空比,每個(gè)周期內(nèi)的高電平時(shí)間和低電平時(shí)間不同,從而實(shí)現(xiàn)對(duì)PWM波的控制。
基礎(chǔ)工程
使用STM32CubeMX配置stm32的基本配置。 基本的配置如下:開(kāi)啟swd調(diào)試,開(kāi)啟外部時(shí)鐘,配置相應(yīng)的定時(shí)器。
- 呼吸燈連接的硬件定時(shí)器配置
- 時(shí)鐘界面選項(xiàng)卡:
- 工程選項(xiàng)卡:
點(diǎn)擊右上角的的生成代碼:
使用keil打開(kāi)工程,編譯工程,一切都是ok
主要代碼
其中我定時(shí)器配置了200hz的頻率,肉眼觀察明顯一些,主函數(shù)中改變占空比。
/* TIM1 init function */
void MX_TIM1_Init(void)
{
/* USER CODE BEGIN TIM1_Init 0 */
/* USER CODE END TIM1_Init 0 */
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_OC_InitTypeDef sConfigOC = {0};
TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};
/* USER CODE BEGIN TIM1_Init 1 */
/* USER CODE END TIM1_Init 1 */
htim1.Instance = TIM1;
htim1.Init.Prescaler = 720-1; // 分頻720 100khz 10us計(jì)一數(shù)
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = 500-1; // 計(jì)數(shù)500次 500*10 = 5000us = 5ms = 200hz
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim1.Init.RepetitionCounter = 0;
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
{
Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 0;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
{
Error_Handler();
}
sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
sBreakDeadTimeConfig.DeadTime = 0;
sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM1_Init 2 */
/* USER CODE END TIM1_Init 2 */
HAL_TIM_MspPostInit(&htim1);
}
main函數(shù)
int main(void)
{
/* USER CODE BEGIN 1 */
//定義一個(gè)變量用來(lái)存儲(chǔ)比較值
uint16_t pulse = 0;
//定義一個(gè)變量用來(lái)存儲(chǔ)方向,0表示遞增,1表示遞減
uint8_t dir = 0;
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_TIM2_Init();
MX_TIM1_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
//根據(jù)方向判斷是遞增還是遞減
if (dir == 0)
{
//延時(shí)10毫秒
HAL_Delay(10);
//比較值加一
pulse++;
//設(shè)置比較值
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_4, pulse);
//如果比較值達(dá)到最大值499,就改變方向?yàn)檫f減
if (pulse == 499)
{
dir = 1;
}
}
else if (dir == 1)
{
//延時(shí)10毫秒
HAL_Delay(10);
//比較值減一
pulse--;
//設(shè)置比較值
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_4, pulse);
//如果比較值達(dá)到最小值0,就改變方向?yàn)檫f增
if (pulse == 0)
{
dir = 0;
}
}
}
/* USER CODE END 3 */
}
實(shí)驗(yàn)現(xiàn)象
能在我的硬件上實(shí)現(xiàn)呼吸燈的效果。
本文完!
-
微控制器
+關(guān)注
關(guān)注
48文章
7846瀏覽量
153415 -
STM32
+關(guān)注
關(guān)注
2284文章
10986瀏覽量
361437 -
keil
+關(guān)注
關(guān)注
69文章
1218瀏覽量
168642 -
呼吸燈
+關(guān)注
關(guān)注
10文章
112瀏覽量
43044 -
HAL庫(kù)
+關(guān)注
關(guān)注
1文章
121瀏覽量
6670
發(fā)布評(píng)論請(qǐng)先 登錄
STM32呼吸燈的原理是什么
請(qǐng)問(wèn)一下STM32 PWM是如何去實(shí)現(xiàn)呼吸燈設(shè)計(jì)的
使用STM32F103RB單片機(jī)實(shí)現(xiàn)PWM呼吸燈實(shí)驗(yàn)的資料免費(fèi)下載

【STM32】標(biāo)準(zhǔn)庫(kù)與HAL庫(kù)對(duì)照學(xué)習(xí)教程三--使用庫(kù)函數(shù)配置GPIO點(diǎn)亮LED燈

STM32實(shí)戰(zhàn) 2 | STM32CubeMX及HAL庫(kù)點(diǎn)亮LED

STM32呼吸燈原理

STM32 使用PWM實(shí)現(xiàn)呼吸燈

評(píng)論