0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于HAL库的STM32呼吸灯实验

CHANBAEK 来源:嵌入式记录 作者:独处东汉 2023-05-14 16:41 次阅读

本文目标:基于HAL库的stm32呼吸灯实验

按照本文的描述,应该可以在你所处的硬件上调通代码。

先决条件:装有编译和集成的开发环境,比如:Keil uVision5。

板子硬件要求:设计了LED定时器接口

呼吸灯是一种常见的电子制作实验项目,其通过控制 LED 灯的亮度变化,实现了一种模拟人类呼吸的效果。 作为一种常见的数字调光技术,呼吸灯广泛应用于工业控制智能家居等领域。 而在此过程中,使用微控制器如 STM32 ,则可以更加便捷、灵活地实现呼吸灯的控制。 因此,本文将介绍基于 STM32 的呼吸灯实验,通过代码编写、编译下载和调试运行,实现了一个简单的呼吸灯控制系统

实验目的

本实验旨在通过 STM32 的呼吸灯实验,掌握 STM32 的编程方法和调试技巧,并深入理解呼吸灯的原理、调光技术和周期控制等知识点。 在本实验过程中,我们将涉及 STM32 的 GPIO 端口配置、定时器和 PWM 的使用、时钟配置和中断处理等技术

PWM介绍

PWM(Pulse Width Modulation)即脉冲宽度调制技术,是一种通过调节脉冲信号的占空比来实现模拟信号的调节的技术。 在PWM控制中,周期性的方波称为PWM波,其占空比是指高电平时间与周期的比值。 PWM波信号可以通过控制电路的输出电平来实现对外设的控制,如对LED的亮度、电机的转速等。 通常使用定时器模块来生成PWM波,定时器在每个周期内发出固定的时间间隔中断,根据设定的占空比,每个周期内的高电平时间和低电平时间不同,从而实现对PWM波的控制。

基础工程

使用STM32CubeMX配置stm32的基本配置。 基本的配置如下:开启swd调试,开启外部时钟,配置相应的定时器。

图片

  • 呼吸灯连接的硬件定时器配置

图片

  • 时钟界面选项卡:

图片

  • 工程选项卡:

图片

点击右上角的的生成代码:

图片

使用keil打开工程,编译工程,一切都是ok

图片

主要代码

其中我定时器配置了200hz的频率,肉眼观察明显一些,主函数中改变占空比。

/* 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计一数
  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim1.Init.Period = 500-1;        // 计数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函数

int main(void)
{
  /* USER CODE BEGIN 1 */
  //定义一个变量用来存储比较值
  uint16_t pulse = 0;
  //定义一个变量用来存储方向,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 */
   //根据方向判断是递增还是递减
  if (dir == 0)
  {
    //延时10毫秒
    HAL_Delay(10);
    //比较值加一
    pulse++;
    //设置比较值
    __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_4, pulse);
    //如果比较值达到最大值499,就改变方向为递减
    if (pulse == 499)
    {
      dir = 1;
    }
  }
  else if (dir == 1)
  {
    //延时10毫秒
    HAL_Delay(10);
    //比较值减一
    pulse--;
    //设置比较值
    __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_4, pulse);
    //如果比较值达到最小值0,就改变方向为递增
    if (pulse == 0)
    {
      dir = 0;
    }
  }
  }
  /* USER CODE END 3 */
}

实验现象

能在我的硬件上实现呼吸灯的效果。

本文完!

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 微控制器
    +关注

    关注

    48

    文章

    7548

    浏览量

    151366
  • STM32
    +关注

    关注

    2270

    文章

    10897

    浏览量

    355822
  • keil
    +关注

    关注

    68

    文章

    1212

    浏览量

    166857
  • 呼吸灯
    +关注

    关注

    10

    文章

    110

    浏览量

    42725
  • HAL库
    +关注

    关注

    1

    文章

    121

    浏览量

    6225
收藏 人收藏

    评论

    相关推荐

    STM32呼吸的原理是什么

    前段时间学习stm32的时候就做过呼吸实验,浏览了一些博客后,做下总结呼吸原理其实是利用pw
    发表于 02-21 07:26

    请问一下STM32 PWM是如何去实现呼吸设计的

    STM32 PWM实现呼吸使用STM32F103ZET6 定时器4 CH2通道产生PWM波,在GPIOD,GPIO_PIN13引脚LED1产生呼吸
    发表于 02-21 07:30

    STM32HAL与LL能共同使用(混用)吗?

    STM32HAL和LL能共同使用(混用)吗?
    的头像 发表于 02-28 16:57 1.4w次阅读

    STM32】标准HAL对照学习教程三--使用库函数配置GPIO点亮LED

    STM32】标准HAL对照学习教程三--使用库函数配置GPIO点亮LED一、前言二、准备工作三、LED硬件电路四、使用标准
    发表于 12-05 14:06 15次下载
    【<b class='flag-5'>STM32</b>】标准<b class='flag-5'>库</b>与<b class='flag-5'>HAL</b><b class='flag-5'>库</b>对照学习教程三--使用库函数配置GPIO点亮LED<b class='flag-5'>灯</b>

    STM32 CubeMX+HAL基本操作

    STM32 CubeMX+HAL基本操作
    发表于 12-07 11:21 50次下载
    <b class='flag-5'>STM32</b> CubeMX+<b class='flag-5'>HAL</b><b class='flag-5'>库</b>基本操作

    STM32开发入门(三)——呼吸

    STM32开发入门(三)——呼吸
    发表于 12-07 17:36 25次下载
    <b class='flag-5'>STM32</b>开发入门(三)——<b class='flag-5'>呼吸</b><b class='flag-5'>灯</b>

    STM32实战 2 | STM32CubeMX及HAL点亮LED

    STM32实战 2 | STM32CubeMX及HAL点亮LED
    发表于 12-08 12:36 34次下载
    <b class='flag-5'>STM32</b>实战 2 | <b class='flag-5'>STM32</b>CubeMX及<b class='flag-5'>HAL</b><b class='flag-5'>库</b>点亮LED

    STM32呼吸原理

    前段时间学习stm32的时候就做过呼吸实验,浏览了一些博客后,做下总结呼吸原理其实是利用pw
    发表于 12-24 19:27 20次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>呼吸</b><b class='flag-5'>灯</b>原理

    STM32 使用PWM实现呼吸

    STM32 PWM实现呼吸使用STM32F103ZET6 定时器4 CH2通道产生PWM波,在GPIOD,GPIO_PIN13引脚LED1产生呼吸
    发表于 12-24 19:41 55次下载
    <b class='flag-5'>STM32</b> 使用PWM实现<b class='flag-5'>呼吸</b><b class='flag-5'>灯</b>

    STM32HAL微秒延时(μs)

    STM32HAL微秒(μs)延时
    发表于 01-18 10:39 48次下载
    <b class='flag-5'>STM32HAL</b><b class='flag-5'>库</b>微秒延时(μs)

    stm32 hal资料分享

    stm32 hal资料分享
    发表于 11-03 16:17 120次下载

    STM32 HAL串口收发如何使用

    前言 一、 HAL 串口收发 1.1 串口发送 1.2 串口接收 二、 收发同时串口卡死? 2.1 问题说明 2.2 尝试的处理方式 结语 前言 对于 STM32 串口的使用,确实很简单
    的头像 发表于 06-22 10:38 6252次阅读
    <b class='flag-5'>STM32</b> <b class='flag-5'>HAL</b><b class='flag-5'>库</b>串口收发如何使用

    STM32 HAL的功能和使用方法 STM32 HAL和标准的区别

    和可维护性,从而节省开发成本和时间。STM32 HALSTM32系列芯片的HAL,由ST公
    发表于 08-08 18:21 4395次阅读

    STM32 HAL串口收发是如何使用的?

    STM32 HAL串口收发是如何使用的? STM32是一款高性能的微控制器,它拥有广泛的应用领域,其中包括了各种通讯应用,如UART串口通讯。HA
    的头像 发表于 10-26 17:42 1229次阅读

    STM32 HAL串口同时收发,接收卡死?

    STM32 HAL串口同时收发,接收卡死? 为什么STM32 HAL串口会出现同时收发导致接
    的头像 发表于 10-26 17:42 3503次阅读