一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于HAL庫(kù)的STM32呼吸燈實(shí)驗(yàn)

CHANBAEK ? 來(lái)源:嵌入式記錄 ? 作者:獨(dú)處東漢 ? 2023-05-14 16:41 ? 次閱讀

本文目標(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)呼吸燈的效果。

本文完!

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 微控制器
    +關(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
收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    STM32呼吸的原理是什么

    前段時(shí)間學(xué)習(xí)stm32的時(shí)候就做過(guò)呼吸實(shí)驗(yàn),瀏覽了一些博客后,做下總結(jié)呼吸原理其實(shí)是利用pw
    發(fā)表于 02-21 07:26

    請(qǐng)問(wèn)一下STM32 PWM是如何去實(shí)現(xiàn)呼吸設(shè)計(jì)的

    STM32 PWM實(shí)現(xiàn)呼吸使用STM32F103ZET6 定時(shí)器4 CH2通道產(chǎn)生PWM波,在GPIOD,GPIO_PIN13引腳LED1產(chǎn)生呼吸
    發(fā)表于 02-21 07:30

    STM32HAL與LL庫(kù)能共同使用(混用)嗎?

    STM32HAL和LL庫(kù)能共同使用(混用)嗎?
    的頭像 發(fā)表于 02-28 16:57 ?1.5w次閱讀

    使用STM32F103RB單片機(jī)實(shí)現(xiàn)PWM呼吸實(shí)驗(yàn)的資料免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是使用STM32F103RB單片機(jī)實(shí)現(xiàn)PWM呼吸實(shí)驗(yàn)的資料免費(fèi)下載。
    發(fā)表于 04-07 08:00 ?8次下載
    使用<b class='flag-5'>STM32</b>F103RB單片機(jī)實(shí)現(xiàn)PWM<b class='flag-5'>呼吸</b><b class='flag-5'>燈</b><b class='flag-5'>實(shí)驗(yàn)</b>的資料免費(fèi)下載

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

    STM32】標(biāo)準(zhǔn)庫(kù)HAL庫(kù)對(duì)照學(xué)習(xí)教程三--使用庫(kù)函數(shù)配置GPIO點(diǎn)亮LED一、前言二、準(zhǔn)備工作三、LED硬件電路四、使用標(biāo)準(zhǔn)
    發(fā)表于 12-05 14:06 ?15次下載
    【<b class='flag-5'>STM32</b>】標(biāo)準(zhǔn)<b class='flag-5'>庫(kù)</b>與<b class='flag-5'>HAL</b><b class='flag-5'>庫(kù)</b>對(duì)照學(xué)習(xí)教程三--使用庫(kù)函數(shù)配置GPIO點(diǎn)亮LED<b class='flag-5'>燈</b>

    STM32 CubeMX+HAL庫(kù)基本操作

    STM32 CubeMX+HAL庫(kù)基本操作
    發(fā)表于 12-07 11:21 ?50次下載
    <b class='flag-5'>STM32</b> CubeMX+<b class='flag-5'>HAL</b><b class='flag-5'>庫(kù)</b>基本操作

    STM32開(kāi)發(fā)入門(三)——呼吸

    STM32開(kāi)發(fā)入門(三)——呼吸
    發(fā)表于 12-07 17:36 ?25次下載
    <b class='flag-5'>STM32</b>開(kāi)發(fā)入門(三)——<b class='flag-5'>呼吸</b><b class='flag-5'>燈</b>

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

    STM32實(shí)戰(zhàn) 2 | STM32CubeMX及HAL庫(kù)點(diǎn)亮LED
    發(fā)表于 12-08 12:36 ?34次下載
    <b class='flag-5'>STM32</b>實(shí)戰(zhàn) 2 | <b class='flag-5'>STM32</b>CubeMX及<b class='flag-5'>HAL</b><b class='flag-5'>庫(kù)</b>點(diǎn)亮LED

    STM32呼吸原理

    前段時(shí)間學(xué)習(xí)stm32的時(shí)候就做過(guò)呼吸實(shí)驗(yàn),瀏覽了一些博客后,做下總結(jié)呼吸原理其實(shí)是利用pw
    發(fā)表于 12-24 19:27 ?20次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>呼吸</b><b class='flag-5'>燈</b>原理

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

    STM32 PWM實(shí)現(xiàn)呼吸使用STM32F103ZET6 定時(shí)器4 CH2通道產(chǎn)生PWM波,在GPIOD,GPIO_PIN13引腳LED1產(chǎn)生呼吸
    發(fā)表于 12-24 19:41 ?55次下載
    <b class='flag-5'>STM32</b> 使用PWM實(shí)現(xiàn)<b class='flag-5'>呼吸</b><b class='flag-5'>燈</b>

    STM32HAL庫(kù)微秒延時(shí)(μs)

    STM32HAL庫(kù)微秒(μs)延時(shí)
    發(fā)表于 01-18 10:39 ?48次下載
    <b class='flag-5'>STM32HAL</b><b class='flag-5'>庫(kù)</b>微秒延時(shí)(μs)

    stm32 hal庫(kù)資料分享

    stm32 hal庫(kù)資料分享
    發(fā)表于 11-03 16:17 ?131次下載

    STM32 HAL庫(kù)的功能和使用方法 STM32 HAL庫(kù)和標(biāo)準(zhǔn)庫(kù)的區(qū)別

    和可維護(hù)性,從而節(jié)省開(kāi)發(fā)成本和時(shí)間。STM32 HAL庫(kù)STM32系列芯片的HAL庫(kù),由ST公
    發(fā)表于 08-08 18:21 ?5859次閱讀

    STM32 HAL庫(kù)串口收發(fā)是如何使用的?

    STM32 HAL庫(kù)串口收發(fā)是如何使用的? STM32是一款高性能的微控制器,它擁有廣泛的應(yīng)用領(lǐng)域,其中包括了各種通訊應(yīng)用,如UART串口通訊。HA
    的頭像 發(fā)表于 10-26 17:42 ?1609次閱讀

    STM32 HAL庫(kù)串口同時(shí)收發(fā),接收卡死?

    STM32 HAL庫(kù)串口同時(shí)收發(fā),接收卡死? 為什么STM32 HAL庫(kù)串口會(huì)出現(xiàn)同時(shí)收發(fā)導(dǎo)致接
    的頭像 發(fā)表于 10-26 17:42 ?4004次閱讀