单片机实现挡位调节

单片机实现挡位调节

简易挡位调节模块

1、初始化硬件

  • 这里就不过多赘述了,去看我之前的帖子,我这篇帖子选择TIM2的1通道

PWM的简单应用

2、触发方式

(1)中断

I 初始化硬件

  • 启用按钮的中断
    img
  • 在主函数外写入中断回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){uint16_t value;__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, value);
}
/* USER CODE END 0 */

(2)轮询

即在循环体内频繁判断按钮是否被按下

  • 在主循环外侧定义全局变量Value
uint16_t Value;
/* USER CODE END 0 */
  • 在循环体内读取按钮处接口状态
	  HAL_Delay(99);if(HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin) == GPIO_PIN_RESET){/*-----------写入增加比较值的代码-----------------*/}

2、调节方式

I环状链表

代码部分

这里选择中断处理的方式来写

  • 在主函数外侧声明结构体数组并重构中断回调函数
/* USER CODE BEGIN 0 */
struct Node{uint16_t CompareValue;
}Level[6];
uint16_t value;
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){value = Level[value].CompareValue;__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, (value * 2000));
}
/* USER CODE END 0 */
  • 在主函数内初始化数组
  /* USER CODE BEGIN Init */Level[0].CompareValue = 1;Level[1].CompareValue = 2;Level[2].CompareValue = 3;Level[3].CompareValue = 4;Level[4].CompareValue = 5;Level[5].CompareValue = 0;/* USER CODE END Init */

原理

  • 当按钮触发后,会产生中断回调,将PWM比较值变成环状链表的下一个键值
    img

实验效果

  • 可呈现6个挡位得亮度变化
    img

II循环体

这里以"轮询的代码为例"

  • 在主循环内写入以下内容
  /* USER CODE BEGIN WHILE */while (1){//判断比较值是否装满if(Value > 19999)Value = 0;HAL_Delay(99);//延迟0.1秒//判断按钮是否按下if(HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin) == GPIO_PIN_RESET){//如果按下,则增加比较值Value += 500;__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, Value);}/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}

实验原理、

  • 每隔0.1秒,询问一次按钮处GPIO的状态,如果为按下状态,则增加500比较值
  • 当比较值满了,则清空

实验效果

img

3、代码清单

  • stm32f4xx_hal.h
/*** @brief  读取指定的输入脚* @param  GPIOx 指定的GPIO口*                    * @param  GPIO_Pin 指定的GPIO引脚*         This parameter can be GPIO_PIN_x where x can be (0..15).* @retval 输入引脚的状态*/
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
  • stm32f4xx_hal_gpio.h
/** * @brief  GPIO 状态*/
typedef enum
{GPIO_PIN_RESET = 0,//置0GPIO_PIN_SET//置1
}GPIO_PinState;

4、总结

(1)触发方式

触发方式 特点
轮询 占用资源,效率高
中断 效率高,但是占用资源

(2)调节方式

调节方式 特点
环状链表 读写方便,但数据离散,占资源
循环体 可连续显示效果,但可读性不高