APT32F110X內嵌了一個最大支持32個掃描通道的電容式觸摸按鍵檢測模塊。該模塊支持基于電荷轉移的檢測技術,以滿足不同應用條件下電容觸摸檢測。
APT32F110X觸摸是MCU的一大亮點!
? 最大支持32通道按鍵檢測
? 支持低功耗模式,并基于掃描值偏差自動喚醒CPU
? 支持通道掃描超時檢測
? 支持連續(xù)掃描序列間隔時間設置
? 多種掃描模式
- 單序列模式
- 連續(xù)模式
原理:
電容式按鍵傳感器是一種基于自電容檢測技術,在人體或帶電物體靠近傳感極點時,導致自電容的變化,根據這種變化從而實現按鍵或者觸摸滑條等應用的實現。系統(tǒng)時鐘由隨機時鐘 MFO 調制后控制 TOUCH IO 對觸摸電容充放電(固定頻率,隨機相位)。充電電流由內部 LDO 提供,LDO 的輸出電流鏡像給感應振蕩器 S-OSC,控制 S-OSC 輸出頻率。因為充電頻率固定,S-OSC 輸出頻率正比于 TOUCH IO 負載電容,在 R-OSC 經過 N 個周期所確定的固定時間內,SFO 的周期數將被一個內部采樣計數器記錄(CHxDAT)。寄生電容變大時,CHxDAT 值會變大;寄生電容變小時,CHxDAT 值會隨之變小。
模擬框圖:
??
開發(fā)板自帶4個觸摸按鍵,需要短接R11~R14
APT32有完整的觸摸按鍵生態(tài)工具和SDK。
SerialPlot軟件配合串口轉USB工具分析觸摸按鍵波形數據:
//#include "include/test_func.h"
#include "iostring.h"
#include
#include "soc.h"
#include "sys_clk.h"
#include
#include
#include
#include
#include
#include
#include
#include "uart.h"
#include "gpio.h"
#include "timer.h"
#include "pin.h"
#include "cnta.h"
#include "tkey.h"
csi_cnta_tg_tCnta;
csi_tkey_t g_tTkey;
csi_gpio_t g_gpioA0;
csi_uart_tg_tUart;
extern void system_init(void);
extern uint16_thwScanCnt;
extern uint32_twKeyMap;
extern uint32_twTimeCnt;
extern uint8_tbyBaseUpdata;
extern uint32_twTkeyBaseCnt;
/** \brief cnta interrupt callback function
*
* \param cnta_handle: handle timer handle to operate
* \param arg: para
* \return none
*/
static void user_cnta_event(csi_cnta_t *cnta_handle, void *arg)//定時器中斷,用來定時更新基線(任意定時器都可以,只要把下面的代碼放于定時器中斷里就ok)
{
if(wKeyMap!=0)//判斷是否有按鍵按下
{
wTimeCnt++;
if(wTimeCnt>wTkeyBaseCnt)// 基線更新時間 = (5ms*wTkeyBaseCnt ) ms
{
byBaseUpdata=1;//基線更新標志
wTimeCnt=0;
}
}
}
/**
\brief counterA 定時中斷初始化
\return csi_error_t
*/
csi_error_t cnta_init(void)
{
csi_error_t tRet = CSI_OK;
tRet = csi_cnta_init(&g_tCnta, 0);
tRet = csi_cnta_attach_callback(&g_tCnta, user_cnta_event, NULL);
tRet = csi_cnta_start(&g_tCnta, 5000);//5ms定時
return tRet;
}
/**
\brief tkey示例
\return csi_error_t
*/
csi_error_t tkey_init(void)
{
csi_error_t tRet = CSI_OK;
tRet = csi_tkey_init(&g_tTkey, 0);//touch初始化, touch的IO使能在tkey_parameter.h里的wTkeyIOEnable,第幾位對應TOUCH如:bit0 --> touch 0 bit16 --> touch16
//注意IO使能是,相應的IO請勿用于其他功能,否則會導致touch工作不正常 ,IO的初始化已經在csi_tkey_init()函數里完成,不需要自己去配置GPIO
//touch的其他一些參數配置請在tkey_parameter.h里完成。
tRet = csi_tkey_attach_callback(&g_tTkey, NULL, NULL);//注冊中斷函數
csi_tkey_set_intr(&g_tTkey,1,TKEY_DNE);//使能相應的中斷
return tRet;
}
int uart_init(void)//串口初始化 串口用于發(fā)送當前的按鍵
{
int iRet = 0;
//csi_pin_set_mux(PB05,PB05_UART2_RX);//PB05 = RX
csi_pin_set_mux(PA014,PA014_UART1_TX);//PA014= TX
iRet = csi_uart_init(&g_tUart,1);
CSI_CHECK_RETURN(iRet);
iRet = csi_uart_format(&g_tUart, UART_DATA_BITS_8, UART_PARITY_NONE, UART_STOP_BITS_1);
CSI_CHECK_RETURN(iRet);
iRet = csi_uart_baud(&g_tUart,115200);
CSI_CHECK_RETURN(iRet);
iRet = csi_uart_attach_callback(&g_tUart,NULL, NULL);
CSI_CHECK_RETURN(iRet);
return iRet;
}
int tkey_main()
{
int i=0;
system_init();//系統(tǒng)初始化
uart_init();//串口初始化
tkey_init();//touch初始化
csi_tkey_baseline_prog(&g_tTkey);//獲取第一次上電時的按鍵原始值作為基線(baseline)
cnta_init();//定時器初始化,
while(1){
csi_tkey_prgm(&g_tTkey); //循環(huán)掃描touch
if(wKeyMap !=0) //判斷是否有按鍵按下,有則PA015輸出低,沒有則輸出高
{
csi_gpio_write(&g_gpioA0,0X1<<15,0);
}else
{
csi_gpio_write(&g_gpioA0,0X1<<15,1);
}
for(i=0;i!=17;i++)//遍歷wKeyMap 變量,wKeyMap變量的第幾位被值1,則對應按鍵被按下。如:bit0 =1 則 touch0 被按下 bit16=1 則 touch16被按下
{
if((wKeyMap >>i)&0x1)
{
csi_uart_putc(&g_tUart,'T');
csi_uart_putc(&g_tUart,'C');
csi_uart_putc(&g_tUart,'H');
csi_uart_putc(&g_tUart,':');
if(i<10)
csi_uart_putc(&g_tUart,i+0x30);
else
{
csi_uart_putc(&g_tUart,0x31);
csi_uart_putc(&g_tUart,i-10+0x30);
}
csi_uart_putc(&g_tUart,0x0d);
csi_uart_putc(&g_tUart,0x0a);
}
}
}
return 0;
}
可以實現觸摸按鍵和機械按鍵一樣效果
-
工程師
+關注
關注
59文章
1589瀏覽量
69235 -
開發(fā)板
+關注
關注
25文章
5543瀏覽量
102504
發(fā)布評論請先 登錄
硬件工程師手冊(全套)
國產開發(fā)板的端側AI測評-基于米爾瑞芯微RK3576
再升級!愛普特微電子推出超高性價比全國產RISC核32位觸控MCU——APT32F104X

愛普特微電子推出國產RISC核32位觸控MCU—APT32F104X
愛普特微電子發(fā)布高性價比國產RISC核32位MCU
愛普特微電子推出超高性價比全國產RISC核32位MCU—APT32F004X

再升級!愛普特微電子推出超高性價比全國產RISC核32位MCU——APT32F104X

嵌入式工程師常用的開發(fā)工具有哪些?
【敏矽微ME32G070開發(fā)板免費體驗】之開箱與基本測試
米爾-紫光PG2L100H國產FPGA開發(fā)板試用】按鍵功能測試報告
【米爾-紫光PG2L100H國產FPGA開發(fā)板試用】米爾-紫光PG2L100H國產FPGA開發(fā)板開箱評測
解讀 | 不簡單的全志T113-S開發(fā)板

評論