当前位置: 首页 > news >正文

单片机实现挡位调节

简易挡位调节模块

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)调节方式

调节方式 特点
环状链表 读写方便,但数据离散,占资源
循环体 可连续显示效果,但可读性不高
http://www.zskr.cn/news/5193.html

相关文章:

  • 长城杯WriteUp
  • vite取别名@
  • kingbase金仓数据库docker部署完整步骤
  • 【VPX361】基于3U VPX总线架构的XCZU47DR射频收发子模块
  • 自动驾驶ADAS数据集 13万张高清道路车辆识别图像 覆盖多场景智能交通应用 支持目标检测图像识别模型训练与AI视觉算法开发
  • Norwood-Hamilton男性脱发分级图像集|2400+张多角度高清头皮图像|涵盖7类脱发诊断标注|适用于AI诊断工具开发、皮肤科研究与植发产品研发|包含5角度标准化拍摄、支持秃顶早期检测
  • 30万份行业报告数据集:覆盖金融科技医疗能源等20+行业领域,2010-2024年完整时间跨度,提供高质量PDF和文本格式,支持深度学习模型训练、行业趋势分析、市场竞争研究、学术论文写作的多场景应用
  • 德创恋爱话术宝典介绍
  • 机器学习回顾(二)——KNN算法 - 教程
  • MyEMS:开源的力量,如何为企业能源管理带来颠覆性变革?
  • 完整教程:【Leetcode hot 100】543.二叉树的直径
  • 【Unity 性能优化之路——渲染流程(1)】 - 详解
  • HCIA回顾——STP
  • 老公对我的精神虐待
  • 华与华是谁?
  • IDEA Debug 高阶技巧,老手都是这么玩的~~
  • mysql 创建分区,如何轻松提升海量数据查询效率
  • SpringBoot 集成支付宝支付,看这篇就够了
  • 工业智能终端赋能自动化生产线建设数字化管理 - 指南
  • Pycharm打包PaddleOCR过程及疑问解决途径
  • 适合小型企业的项目管理系统推荐:Reddit 用户真实需求
  • 第三周训练总结
  • reLeetCode 热题 100-1 两数之和-扩展2 map实现 - MKT
  • reLeetCode 热题 100-1 两数之和-扩展3 单向和双向链表实现 - MKT
  • codeforces1050div4题解
  • 深入解析:少儿舞蹈小程序(13)作品播放量累加及点赞
  • Ubuntu 24.04 安装最新版podman@5.6.1
  • 2025.9.15——知识点学习
  • sql事务执行
  • 从Craigslist广告到BHIS安全顾问:非科班生的渗透测试求职之路