0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

小凌派-RK2206OpenHarmony開發(fā)板例程系列之一:ADC按鍵案例

福州市凌睿智捷電子有限公司 ? 2022-04-11 13:59 ? 次閱讀

一、簡介
嵌入式系統(tǒng)產(chǎn)品開發(fā)中,按鍵板的設(shè)計(jì)是最基本的,也是項(xiàng)目評(píng)估階段必須要考慮的問題。其實(shí)現(xiàn)方式有很多種,具體使用那一種就需要結(jié)合可用IO數(shù)量,并綜合考慮成本,做出最終選擇。傳統(tǒng)的按鍵檢測(cè)方法是一個(gè)按鍵對(duì)應(yīng)一個(gè)GPIO口,進(jìn)行高低電平輸入檢測(cè)??墒窃贕PIO口緊缺的情況下,不得不需要一個(gè)有效的解決方案,其中ADC檢測(cè)實(shí)現(xiàn)按鍵功能是一種相對(duì)有效的解決方案。
ADC檢測(cè)實(shí)現(xiàn)簡單實(shí)用的按鍵方法:僅需要一個(gè)ADC和若干個(gè)電阻就可實(shí)現(xiàn)多個(gè)按鍵的輸入檢測(cè)。工作原理:按下按鍵時(shí),通過電阻分壓得到不同的電壓值,ADC采集在各個(gè)范圍內(nèi)的值來判定是哪個(gè)按鍵按下。
本文采用RK2206芯片自帶的逐次逼近寄存器模數(shù)轉(zhuǎn)換器(Successive-Approximation Analog to Digital Converter),是一種常用的A/D轉(zhuǎn)換結(jié)構(gòu),其較低的功耗表現(xiàn),不錯(cuò)的轉(zhuǎn)換速率,在有低功耗要求(可穿戴設(shè)備、物聯(lián)網(wǎng))的數(shù)據(jù)采集場(chǎng)景下廣泛應(yīng)用。
二、硬件電路設(shè)計(jì)
ADC檢測(cè)實(shí)現(xiàn)簡單實(shí)用的按鍵方法:僅需要一個(gè)ADC和若干個(gè)電阻就可實(shí)現(xiàn)多個(gè)按鍵的輸入檢測(cè)。工作原理:按下按鍵時(shí),通過電阻分壓得到不同的電壓值,ADC采集在各個(gè)范圍內(nèi)的值來判定是哪個(gè)按鍵按下。
模塊整體硬件電路如下圖所示,電路中包含了1根ADC引腳和4個(gè)按鍵。

凌智電子:小凌派-RK2206鴻蒙開發(fā)板例程系列之一ADC按鍵案例-OpenHarmony技術(shù)社區(qū)

圖1 硬件電路圖

其中,4個(gè)按鍵分別連接不同的電阻。當(dāng)按鍵按下時(shí),USER_KEY_ADC檢測(cè)到不同的電壓。具體如下所示:

表1 按鍵對(duì)應(yīng)電壓表

凌智電子:小凌派-RK2206鴻蒙開發(fā)板例程系列之一ADC按鍵案例-OpenHarmony技術(shù)社區(qū)

USER_KEY_ADC引腳連接到RK2206芯片的GPIO0_C5,如下圖所示:

凌智電子:小凌派-RK2206鴻蒙開發(fā)板例程系列之一ADC按鍵案例-OpenHarmony技術(shù)社區(qū)

圖2 USER_KEY_ADC引腳的硬件電路圖

三、ADC接口
ADC相應(yīng)接口頭文件在:
/device/rockchip/rk2206/adapter/include/lz_hardware.h
RK2206芯片提供以下兩大類接口:
(1)初始化、銷毀ADC;
(2)ADC讀操作。
具體接口如PPT所示。以下我們?cè)敿?xì)講解這些接口。
(1)LzSaradcInit
該函數(shù)主要功能是SARADC設(shè)備初始化。
int LzSaradcInit(void);
成功返回LZ_HARDWARE_SUCCESS, 其余為失敗。
(2)LzSaradcDeinit
該函數(shù)主要功能是SARADC設(shè)備釋放。
int LzSaradcDeinit(void);
成功返回LZ_HARDWARE_SUCCESS, 其余為失敗。
(3)LzSaradcReadValue
該函數(shù)主要功能是SARADC設(shè)備讀取。
int LzSaradcReadValue(unsigned int chn, unsigned int *val);
參數(shù)chn:ADC通道id;
參數(shù)val:讀取值。
成功返回LZ_HARDWARE_SUCCESS, 其余為失敗。
四、程序設(shè)計(jì)
ADC按鍵程序每1秒通過GPIO0_PC5讀取一次按鍵電壓,通過電壓數(shù)值判斷當(dāng)前是哪個(gè)按鍵被按下,并打印出該按鍵名稱。
如圖所示為ADC按鍵主程序流程圖,開機(jī)LiteOS系統(tǒng)初始化后,進(jìn)入主程序先初始化ADC設(shè)備。程序進(jìn)入主循環(huán),1秒獲取一次ADC采樣電壓,判斷:
(1)采樣電壓在0.00~0.11V之間,則當(dāng)前是按下Key1,打印Key1;
(2)采樣電壓在0.45~0.65V之間,則當(dāng)前是按下Key2,打印Key2;
(3)采樣電壓在0.90~1.1V之間,則當(dāng)前是按下Key3,打印Key3;
(4)采樣電壓在1.55~1.75V之間,則當(dāng)前是按下Key4,打印Key4;
(5)當(dāng)前無按鍵。

凌智電子:小凌派-RK2206鴻蒙開發(fā)板例程系列之一ADC按鍵案例-OpenHarmony技術(shù)社區(qū)

圖3主程序流程圖

void adc_process()
{
    float voltage;

    /* 初始化adc設(shè)備 */
    adc_dev_init();
    
    while (1)
    {
        printf("***************Adc Example*************\r\n");
        /*獲取電壓值*/
        voltage = adc_get_voltage();
        printf("vlt:%.3fV\n", voltage);

        if ((0.11 >= voltage) && (voltage >= 0.00))
        {
            printf("\tKey1\n");
        }
        else if ((0.65 >= voltage) && (voltage >= 0.45))
        {
            printf("\tKey2\n");
        }
        else if ((1.1 >= voltage) && (voltage >= 0.9))
        {
            printf("\tKey3\n");
        }
        else if ((1.75 >= voltage) && (voltage >= 1.55))
        {
            printf("\tKey4\n");
        }

        /* 睡眠1秒 */
        LOS_Msleep(1000);
    }
}

ADC初始化程序主要分為ADC初始化和配置ADC參考電壓為外部電壓兩部分:

static unsigned int adc_dev_init()
{
    unsigned int ret = 0;
    uint32_t *pGrfSocCon29 = (uint32_t *)(0x41050000U + 0x274U);
    uint32_t ulValue;

    ret = DevIoInit(m_adcKey);
    if (ret != LZ_HARDWARE_SUCCESS)
    {
        printf("%s, %s, %d: ADC Key IO Init fail\n", __FILE__, __func__, __LINE__);
        return __LINE__;
    }
    ret = LzSaradcInit();
    if (ret != LZ_HARDWARE_SUCCESS) {
        printf("%s, %s, %d: ADC Init fail\n", __FILE__, __func__, __LINE__);
        return __LINE__;
}

    /* 設(shè)置saradc的電壓信號(hào),選擇AVDD */
    ulValue = *pGrfSocCon29;
    ulValue &= ~(0x1 << 4);
    ulValue |= ((0x1 << 4) << 16);
    *pGrfSocCon29 = ulValue;
    
    return 0;
}

RK2206芯片采用一種逐次逼近寄存器型模數(shù)轉(zhuǎn)換器(Successive-Approximation Analog to Digital Converter),是一種常用的A/D轉(zhuǎn)換結(jié)構(gòu),其較低的功耗表現(xiàn),還不錯(cuò)的轉(zhuǎn)換速率,在有低功耗要求(可穿戴設(shè)備、物聯(lián)網(wǎng))的數(shù)據(jù)采集場(chǎng)景下廣泛應(yīng)用。該ADC采用10bit采樣,最高電壓為3.3V。簡而言之,ADC采樣讀取的數(shù)據(jù),bit[0~9]有效,且最高數(shù)值0x400(即1024)代表實(shí)際電壓差3.3V,也就是說1個(gè)數(shù)值等于3.3V / 1024 = 0.003222V。

static float adc_get_voltage()
{
    unsigned int ret = LZ_HARDWARE_SUCCESS;
    unsigned int data = 0;

    ret = LzSaradcReadValue(ADC_CHANNEL, &data);
    if (ret != LZ_HARDWARE_SUCCESS)
    {
        printf("%s, %s, %d: ADC Read Fail\n", __FILE__, __func__, __LINE__);
        return 0.0;
}

return (float)(data * 3.3 / 1024.0);
}

五、編譯過程
1、打開sdk下面路徑的文件
/vendor/lockzhiner/rk2206/samples/b1_adc/adc_example.c
注意:Gitee上的ADC案例為通用案例,請(qǐng)大家根據(jù)上述的需求修改相關(guān)源代碼。
2、修改編譯腳本
修改 vendor/lockzhiner/rk2206/sample 路徑下 BUILD.gn 文件,指定 adc_example 參與編譯。
“./b0_adc:adc_example”,
修改 device/lockzhiner/rk2206/sdk_liteos 路徑下 Makefile 文件,添加 -ladc_example 參與編譯。
hardware_LIBS = -lhal_iothardware -lhardware -ladc_example
3、編譯固件

hb set -root .
hb set
hb build -f

4、燒寫固件
5、通過串口查看結(jié)果
運(yùn)行結(jié)果

***************Adc Example*************
vlt:3.297V
***************Adc Example*************
vlt:3.297V
***************Adc Example*************
vlt:3.297V
***************Adc Example*************
vlt:3.297V
***************Adc Example*************
vlt:3.297V
***************Adc Example*************
vlt:3.297V
……

好了,今天的課程就到這里,更多技術(shù)干貨請(qǐng)關(guān)注福州市凌睿智捷電子有限公司(凌智電子),持續(xù)更新中…

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式開發(fā)
    +關(guān)注

    關(guān)注

    18

    文章

    1063

    瀏覽量

    48317
  • OpenHarmony
    +關(guān)注

    關(guān)注

    26

    文章

    3803

    瀏覽量

    17781
  • 凌智電子
    +關(guān)注

    關(guān)注

    1

    文章

    26

    瀏覽量

    1240
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于小RK2206開發(fā)板OpenHarmony如何使用IoT接口控制FLASH外設(shè)

    1、實(shí)驗(yàn)簡介 本實(shí)驗(yàn)將演示如何在小-RK2206開發(fā)板上使用IOT庫的FLASH接口,進(jìn)行FLASH編程開發(fā)。
    發(fā)表于 04-22 15:02

    基于小RK2206開發(fā)板OpenHarmony如何使用IoT接口控制FLASH外設(shè)

    1、實(shí)驗(yàn)簡介本實(shí)驗(yàn)將演示如何在小-RK2206開發(fā)板上使用IOT庫的FLASH接口,進(jìn)行FLASH編程開發(fā)。
    的頭像 發(fā)表于 04-22 14:49 ?146次閱讀
    基于小<b class='flag-5'>凌</b><b class='flag-5'>派</b><b class='flag-5'>RK2206</b><b class='flag-5'>開發(fā)板</b>:<b class='flag-5'>OpenHarmony</b>如何使用IoT接口控制FLASH外設(shè)

    基于小RK2206開發(fā)板OpenHarmony如何使用IoT接口控制UART外設(shè)

    1、實(shí)驗(yàn)簡介 本實(shí)驗(yàn)將演示如何在小-RK2206開發(fā)板上使用IOT庫的UART接口,進(jìn)行UART編程開發(fā)。
    發(fā)表于 04-22 14:27

    基于小RK2206開發(fā)板OpenHarmony如何使用IoT接口控制UART外設(shè)

    1、實(shí)驗(yàn)簡介本實(shí)驗(yàn)將演示如何在小-RK2206開發(fā)板上使用IOT庫的UART接口,進(jìn)行UART編程開發(fā)。
    的頭像 發(fā)表于 04-22 14:22 ?200次閱讀
    基于小<b class='flag-5'>凌</b><b class='flag-5'>派</b><b class='flag-5'>RK2206</b><b class='flag-5'>開發(fā)板</b>:<b class='flag-5'>OpenHarmony</b>如何使用IoT接口控制UART外設(shè)

    基于小RK2206開發(fā)板OpenHarmony如何使用IoT接口控制GPIO中斷

    1、實(shí)驗(yàn)簡介 本實(shí)驗(yàn)將演示如何在小-RK2206開發(fā)板上使用IOT庫的GPIO中斷模式,進(jìn)行GPIO編程開發(fā)
    發(fā)表于 04-21 11:08

    基于小RK2206開發(fā)板OpenHarmony如何使用IoT接口控制GPIO中斷

    1、實(shí)驗(yàn)簡介本實(shí)驗(yàn)將演示如何在小-RK2206開發(fā)板上使用IOT庫的GPIO中斷模式,進(jìn)行GPIO編程開發(fā)。
    的頭像 發(fā)表于 04-21 10:39 ?199次閱讀
    基于小<b class='flag-5'>凌</b><b class='flag-5'>派</b><b class='flag-5'>RK2206</b><b class='flag-5'>開發(fā)板</b>:<b class='flag-5'>OpenHarmony</b>如何使用IoT接口控制GPIO中斷

    基于小RK2206開發(fā)板OpenHarmony如何使用IoT接口控制GPIO外設(shè)

    1、案例簡介 本案例主要是如何在小-RK2206開發(fā)板上使用IOT庫的GPIO接口,進(jìn)行GPIO編程開發(fā)。
    發(fā)表于 04-11 15:45

    基于小RK2206開發(fā)板OpenHarmony如何使用IoT接口控制GPIO外設(shè)

    1、案例簡介本案例主要是如何在小-RK2206開發(fā)板上使用IOT庫的GPIO接口,進(jìn)行GPIO編程開發(fā)
    的頭像 發(fā)表于 04-11 15:36 ?312次閱讀
    基于小<b class='flag-5'>凌</b><b class='flag-5'>派</b><b class='flag-5'>RK2206</b><b class='flag-5'>開發(fā)板</b>:<b class='flag-5'>OpenHarmony</b>如何使用IoT接口控制GPIO外設(shè)

    基于小RK2206開發(fā)板OpenHarmony如何使用IoT接口控制ADC外設(shè)

    1、案例簡介 本案例主要講解如何在小-RK2206開發(fā)板上使用IoT庫的ADC接口,進(jìn)行ADC
    發(fā)表于 04-10 16:20

    基于小RK2206開發(fā)板OpenHarmony如何使用IoT接口控制ADC外設(shè)

    1、案例簡介本案例主要講解如何在小-RK2206開發(fā)板上使用IoT庫的ADC接口,進(jìn)行ADC
    的頭像 發(fā)表于 04-10 16:00 ?210次閱讀
    基于小<b class='flag-5'>凌</b><b class='flag-5'>派</b><b class='flag-5'>RK2206</b><b class='flag-5'>開發(fā)板</b>:<b class='flag-5'>OpenHarmony</b>如何使用IoT接口控制<b class='flag-5'>ADC</b>外設(shè)

    基于小RK2206開發(fā)板OpenHarmony如何使用IoT接口控制PWM外設(shè)

    1、案例簡介 本案例是在小-RK2206開發(fā)板上使用IoT庫PWM接口,進(jìn)行PWM編程開發(fā)例程
    發(fā)表于 04-09 09:37

    基于小RK2206開發(fā)板OpenHarmony如何使用IoT接口控制PWM外設(shè)

    1、案例簡介本案例是在小-RK2206開發(fā)板上使用IoT庫PWM接口,進(jìn)行PWM編程開發(fā)。例程
    的頭像 發(fā)表于 04-09 08:59 ?528次閱讀
    基于小<b class='flag-5'>凌</b><b class='flag-5'>派</b><b class='flag-5'>RK2206</b><b class='flag-5'>開發(fā)板</b>:<b class='flag-5'>OpenHarmony</b>如何使用IoT接口控制PWM外設(shè)

    【「OpenHarmony開發(fā)與實(shí)踐 | 基于紅莓RK2206開發(fā)板」閱讀體驗(yàn)】+初體驗(yàn)1

    愛好者沒有bug,「OpenHarmony開發(fā)與實(shí)踐 | 基于紅莓RK2206開發(fā)板」大賣吧!哦對(duì)了 你們的開發(fā)板是怎么準(zhǔn)備的呢?【小
    發(fā)表于 09-18 18:30

    【「OpenHarmony開發(fā)與實(shí)踐 | 基于紅莓RK2206開發(fā)板」閱讀體驗(yàn)】+初體驗(yàn)2連發(fā)發(fā)

    啥也不說先上圖 對(duì)于《OpenHarmony開發(fā)與實(shí)踐 | 基于紅莓RK2206開發(fā)板》這本書的熱愛,簡直就像夏日里的股清泉,讓人忍不
    發(fā)表于 09-18 18:01

    基于OpenHarmony輕量級(jí)操作系統(tǒng)實(shí)現(xiàn)RK2206 WiFi-AP模式通信開發(fā)案例

    實(shí)驗(yàn)內(nèi)容本示例將演示如何在小-RK2206開發(fā)板上使用WiFi-AP模式(即將RK2206作為WiFi路由器),實(shí)現(xiàn)與PC端進(jìn)行TCP通
    的頭像 發(fā)表于 08-08 08:23 ?726次閱讀
    基于<b class='flag-5'>OpenHarmony</b>輕量級(jí)操作系統(tǒng)實(shí)現(xiàn)<b class='flag-5'>RK2206</b> WiFi-AP模式通信<b class='flag-5'>開發(fā)</b>案例

    電子發(fā)燒友

    中國電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品