打印
[STM32C0]

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

[复制链接]
2826|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 电子烂人 于 2025-2-20 14:32 编辑

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

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

(图源:立创商城)

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

(图源:ST文档MB1684)

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

(图源:ST文档MB1684)

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

(图源:ST工程MB1684)

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

之后只需用一个ELSE IF语句,来判定当前按下的IO是哪个即可:
if ((ADC_Value >= 0)&&(ADC_Value <= 1000))
    {
            For_back_ward=1;
    }
    else if ((ADC_Value >= 1000) &&(ADC_Value <= 2000))
    {
            Gear-=1;
    }
    else if ((ADC_Value >= 2000)&& (ADC_Value <= 3000))
    {
            Gear+=1;
    }
    else if ((ADC_Value >= 3000)&&( ADC_Value <= 4000))
    {

            For_back_ward=0;
    }

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


使用特权

评论回复
沙发
wangshujun| | 2025-3-1 17:11 | 只看该作者
以前这么用过,效果没问题,用一个ad换五个io,小封装效果确实好

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

70

帖子

0

粉丝