[STM32C0] 分享一个五向开关更少IO的设计

[复制链接]
 楼主| 电子烂人 发表于 2025-2-16 10:19 | 显示全部楼层 |阅读模式
本帖最后由 电子烂人 于 2025-2-20 14:32 编辑

#申请原创#[url=home.php?mod=space&uid=760190]@21小跑堂 [/url]0.前言:

之前做小产品用到过很多五向开关按键这个料,一个五项开关就要5个IO口来驱动,很是浪费
1789767b1448f61b4d.png

(图源:立创商城)

正巧在ST的C0116-DK开发板上看到过一个非常“巧妙”的设计,拿来品鉴一下
9265667b1459834853.png

(图源:ST文档MB1684)

1.硬件赏析
C0116-DK上面搭载的是一片C011F6,UFQFPN20的封装,注定了这个MCU绝对不能用5个IO单独驱动五向开关
DK开发板的工程师很清楚这一点,所以他们用了另一种办法:ADC监测每个IO上的电压值
9660367b146302334c.png

(图源:ST文档MB1684)

每个IO所接的电阻值不同,电压故而不一样,很巧妙的避开了IO占用过多的问题
1134667b14aa9a1cb5.png

(图源:ST工程MB1684)

2.代码参考
这里写一段ADC检测IO的代码,仅供参考
以ADC1为例:
  1. <font size="4">HAL_ADC_Start(&hadc1);
  2. HAL_ADC_PollForConversion(&hadc1, 50);
  3. if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC))
  4. {
  5. ADC_Value = HAL_ADC_GetValue(&hadc1);
  6. }
  7. HAL_Delay(1000);</font>

之后只需用一个ELSE IF语句,来判定当前按下的IO是哪个即可:
  1. if ((ADC_Value >= 0)&&(ADC_Value <= 1000))
  2.     {
  3.             For_back_ward=1;
  4.     }
  5.     else if ((ADC_Value >= 1000) &&(ADC_Value <= 2000))
  6.     {
  7.             Gear-=1;
  8.     }
  9.     else if ((ADC_Value >= 2000)&& (ADC_Value <= 3000))
  10.     {
  11.             Gear+=1;
  12.     }
  13.     else if ((ADC_Value >= 3000)&&( ADC_Value <= 4000))
  14.     {

  15.             For_back_ward=0;
  16.     }

3.总结
其实很多时候做的工作都是在做优化,用减法把项目做到预算范围内,这种用更小封装、更少IO去做更多功能的例子还有很多,欢迎各位朋友分享。


wangshujun 发表于 2025-3-1 17:11 | 显示全部楼层
以前这么用过,效果没问题,用一个ad换五个io,小封装效果确实好
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

70

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部