查看: 5792|回复: 14

[分享] 【经验】【KL26】最简单的TSI应用实例:软件触发轮询采样...

[复制链接]
  • TA的每日心情
    奋斗
    2017-1-17 10:45
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    38

    主题

    395

    帖子

    3

    高级会员

    Rank: 4

    积分
    780
    最后登录
    2023-11-17
    发表于 2015-5-24 14:33:17 | 显示全部楼层 |阅读模式
    最简单的TSI应用实例:
    ——软件触发轮询采样闪灯


    suyong_yq   suyong_yq@126.com
    2015-05


    前文曾经提到关于KL26的ADC模块的驱动设计模型,其IP设计使用了多通道时分复用一个转换器的思路,转换之后将量化的转换结果保存到同一个结果寄存器中。作为另一个模拟输入转换模块,KL26上的TSI(Touch Sensor Interface)模块的IP也是使用了同ADC模块相同的设计思路,这让我们不得不感叹,“不是一家人,还真不进一家门”啊。

    相对于ADC使用逐次比较的方式将从输入通道获取的采样电压量化成数字,TSI也是通过使用参考震荡信号对输入通道的电极板上充放电的计数,从而将输入通道电极板的电容量化成数字。
    对于软件编程来看,TSI的功能寄存器是我们能够直接操作的对象。同ADC类似,TSI也有配置当前转换通道的寄存器字段TSIx_DATA[TSICH]及保存转换结果的寄存器字段TSIx_DATA[TSICNT]。不过在软件触发模式下,TSI需要显式地写TSIx_DATA[SWTS]字段才能实现触发,而ADC在配置通道时就可以触发了。
    figure_1.png
    图1

    在另外两个寄存器TSIx_GENCS和TSIx_TSHD中,后者只有两个字段,专门为范围检测设定高低两个阈值的,而前者包含了几乎所有配置转换器的选项(只漏了一个关于启动DMA触发的字段在TSIx_DATA寄存器)和状态标志位。关于状态标志为,TSI可以触发两种事件,扫描结束和及扫描结果超出设定阈值范围,对应有中断开关和标志位,标志位还是典型的写1清零方式。整个TSI模块的数字接口(寄存器安排)中规中矩,简单明了,但模块本身可玩性强(可以实现触摸感应呢),实在是一个不可多得的好模块。

    我根据设计ADC驱动的思路照猫画虎,很快的地实现了TSI的驱动程序,源代码及样例工程已经包含在附件中,大家感兴趣可以下载代码瞅一眼。

    后来,我打算在YL-KL26Z板子上写了一个使用TSI模块的最简单的演示工程。刚好YL-KL26Z板子上设计了三个触摸板子和三个内嵌式的LED灯:

    figure_2.png
    图2

    figure_3.png
    图3

    我就寻思着要不把触摸板搞成触摸按键吧,摸一下(好猥琐一说,不是按一下),对应的小灯就切换一次开关状态(其实还可以让喇叭叫一下的,嘿嘿,自己写写看吧)。
    应用程序执行的逻辑在main函数中,贴出来代码看一眼。


    1. #include "app_inc.h"

    2. static void init_LED(void);
    3. static void init_PAD(void);

    4. #define APP_TSI_PAD_COUNT   (3U)
    5. static uint32_t gPadIdxArray[APP_TSI_PAD_COUNT] =
    6. {
    7.     BSP_TSI_PAD1_CHN, BSP_TSI_PAD2_CHN, BSP_TSI_PAD3_CHN
    8. };
    9. static uint32_t gLedPortArray[APP_TSI_PAD_COUNT] =
    10. {
    11.     BSP_GPIO_LED1_PORT, BSP_GPIO_LED2_PORT, BSP_GPIO_LED3_PORT
    12. };
    13. static uint32_t gLedPinArray[APP_TSI_PAD_COUNT] =
    14. {
    15.     BSP_GPIO_LED1_PIN, BSP_GPIO_LED2_PIN, BSP_GPIO_LED3_PIN
    16. };

    17. static uint32_t gPadBaseVal[APP_TSI_PAD_COUNT];
    18. static uint32_t gPadPreVal[APP_TSI_PAD_COUNT];
    19. static void APP_TSI_Calibration(void);

    20. int main(void)
    21. {
    22.     uint32_t i;
    23.    
    24.     init_board();
    25.    
    26.     printf("\r\nHello, Board.\r\n");
    27.     printf("Compiled at %s on %s\r\n", __TIME__, __DATE__);
    28.    
    29.     printf("initializing...\r\n");

    30.     /* Initialize the system. */
    31.     init_LED();
    32.     init_PAD();

    33.     APP_TSI_Calibration();

    34.     printf("system ready.\r\n");
    35.    
    36.     while (1)
    37.     {
    38.         Systick_DelayTicksBlocking(4U);
    39.         //GPIO_TogglePinLogic(BSP_GPIO_LED1_PORT, BSP_GPIO_LED1_PIN);
    40.         for (i = 0U; i < APP_TSI_PAD_COUNT; i++)
    41.         {
    42.             if (gPadPreVal[i] >= gPadBaseVal[i])
    43.             {
    44.                 gPadPreVal[i] = TSI_GetConvValueBlocking(BSP_TSI_IDX, gPadIdxArray[i]);
    45.                 if (gPadPreVal[i] < gPadBaseVal[i])
    46.                 {
    47.                     GPIO_TogglePinLogic(gLedPortArray[i], gLedPinArray[i]);
    48.                 }
    49.             }
    50.             else
    51.             {
    52.                 gPadPreVal[i] = TSI_GetConvValueBlocking(BSP_TSI_IDX, gPadIdxArray[i]);
    53.             }
    54.         }
    55.     }
    56. }

    57. static void init_LED(void)
    58. {
    59.     BSP_ConfigPinForGPIO_LED();
    60.     GPIO_SetPinLogic(BSP_GPIO_LED1_PORT, BSP_GPIO_LED1_PIN, true);
    61.     GPIO_SetPinLogic(BSP_GPIO_LED2_PORT, BSP_GPIO_LED2_PIN, true);
    62.     GPIO_SetPinLogic(BSP_GPIO_LED3_PORT, BSP_GPIO_LED3_PIN, true);
    63.     GPIO_SetPinDir(BSP_GPIO_LED1_PORT, BSP_GPIO_LED1_PIN, true);
    64.     GPIO_SetPinDir(BSP_GPIO_LED2_PORT, BSP_GPIO_LED2_PIN, true);
    65.     GPIO_SetPinDir(BSP_GPIO_LED3_PORT, BSP_GPIO_LED3_PIN, true);
    66. }

    67. static void init_PAD(void)
    68. {
    69.     TSI_ConverterConfig_T mTsiConvConfigStruct = TSI_CONVERTER_CONFIG_DEFAULT;
    70.    
    71.     SIM_EnableClockForTSI(BSP_TSI_IDX, true);
    72.     BSP_ConfigPinForTSI_PAD();

    73.     TSI_ResetConverter(BSP_TSI_IDX);
    74.     TSI_ConfigConverter(BSP_TSI_IDX, &mTsiConvConfigStruct);
    75.     TSI_EnableConverter(BSP_TSI_IDX, true);
    76. }

    77. static void APP_TSI_Calibration(void)
    78. {
    79.     uint32_t i;
    80.    
    81.     /* Learn the base value. */
    82.     printf("Keep nothing on the PADs, press any key to study the base TSI values ...\r\n");
    83.     getchar();
    84.     for (i = 0U; i < APP_TSI_PAD_COUNT; i++)
    85.     {
    86.         gPadBaseVal[i] = TSI_GetConvValueBlocking(BSP_TSI_IDX, gPadIdxArray[i]);
    87.         printf("Pad %d: %5d\t", i, gPadBaseVal[i]);
    88.     }
    89.     printf("\r\n");
    90.    
    91.     /* Learn the threshold value. */
    92.     printf("Put your finger to cover all the PADs, press any key to study the upper TSI value ...\r\n");
    93.     getchar();
    94.     for (i = 0U; i < APP_TSI_PAD_COUNT; i++)
    95.     {
    96.         gPadBaseVal[i] += TSI_GetConvValueBlocking(BSP_TSI_IDX, gPadIdxArray[i]);
    97.         gPadBaseVal[i] /= 2;
    98.         printf("Pad %d: %5d\t", i, gPadBaseVal[i]);
    99.     }
    100.     printf("\r\n");
    101.    
    102.     printf("TSI Calibration Done.\r\n");
    103. }

    104. /* EOF. */
    复制代码

    编译成功后,下载程序,运行。
    首先要让KL26学一下没有摸上TSI触摸板时TSI的采样值。


    figure_4.png
    图4


    根据提示,不要摸触摸板,然后在终端中随便属于一个字符,KL26就学到了一组初始的值。


    figure_5.png
    图5

    从终端输出可以看到,在没有摸上触摸板时,三个TSI通道的采样值是1439、1516和1697。然后提示说要用手按住三个触摸板,让TSI感受一下被触摸的“感觉”。

    figure_6.jpg
    图6


    在手放在触摸板上的同时,在中断输入字符,此时输出学习后的触摸按键触发阈值。

    figure_7.png
    图7

    可以看到,三个触摸板学习的触摸阈值分别是4411、4231和3679。这组值将被用于判断手接触按键的状态。

    在应用程序中使用最简单的方式扫描按键,并且省略掉了消除抖动的处理,只为最简单地演示TSI实例的用法。

    软件上,除了配置TSI用到的:TSI_ResetConverter,TSI_ConfigConverter和TSI_EnableConverter,在使用时,以最简单的软件触发轮询等待方式读取TSI通道值只用了一个TSI_GetConvValueBlocking就可以搞定,这个工程中为TSI实现的驱动程序用起来也是非常不错的。


    figure_8.jpg
    图8

    实际玩起来的时候有点想是“打地鼠”,如果再多加一点控制逻辑,比如预先安排一个输出状态序列,再不断采集TSI检测的状态序列,加上时间控制,还真就可以实现一个“打地鼠”的游戏呢。童鞋们要不要试试呢?
    --- End

    附件:
    文档: AN_SY20150524.pdf (563.28 KB, 下载次数: 13)
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2018-7-2 06:04
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    59

    主题

    2888

    帖子

    10

    金牌会员

    Rank: 6Rank: 6

    积分
    6020
    最后登录
    2020-9-28
    发表于 2015-5-26 09:56:55 | 显示全部楼层
    非常感谢你关于Kinetis的经验分享 !
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-1-24 09:50
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    654

    主题

    3262

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    13138
    最后登录
    2019-1-27
    发表于 2015-5-28 11:00:11 | 显示全部楼层
    赞一个!
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-1-17 10:45
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    38

    主题

    395

    帖子

    3

    高级会员

    Rank: 4

    积分
    780
    最后登录
    2023-11-17
     楼主| 发表于 2015-5-28 21:31:34 | 显示全部楼层
    FSL_TICS_Robin 发表于 2015-5-26 09:56
    非常感谢你关于Kinetis的经验分享 !

    谢谢专业人士点评。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-1-17 10:45
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    38

    主题

    395

    帖子

    3

    高级会员

    Rank: 4

    积分
    780
    最后登录
    2023-11-17
     楼主| 发表于 2015-5-28 21:31:58 | 显示全部楼层

    小七就是福音啊,到哪哪里就是花开遍地。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2021-7-13 18:31
  • 签到天数: 127 天

    连续签到: 1 天

    [LV.7]常住居民III

    19

    主题

    1229

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    6124
    最后登录
    2024-12-19
    发表于 2015-5-28 22:40:40 | 显示全部楼层
    好赞啊
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2016-12-22 09:09
  • 签到天数: 12 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    24

    主题

    446

    帖子

    0

    高级会员

    Rank: 4

    积分
    876
    最后登录
    2019-3-8
    发表于 2015-6-2 13:15:15 | 显示全部楼层
    好,没弄过,兴趣
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2017-5-27 11:02
  • 签到天数: 4 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    15

    主题

    566

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1890
    最后登录
    2017-5-27
    发表于 2015-6-2 13:20:03 | 显示全部楼层
    恩,不错,像打地鼠
    klntuo累
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    19

    主题

    317

    帖子

    0

    高级会员

    Rank: 4

    积分
    862
    最后登录
    1970-1-1
    发表于 2015-6-2 13:46:07 | 显示全部楼层
    技术贴,,排队学习。。。。。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-1-17 10:45
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    38

    主题

    395

    帖子

    3

    高级会员

    Rank: 4

    积分
    780
    最后登录
    2023-11-17
     楼主| 发表于 2015-6-2 22:37:02 | 显示全部楼层
    巧子儿 发表于 2015-6-2 13:20
    恩,不错,像打地鼠

    试过了?
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-26 22:41 , Processed in 0.117692 second(s), 28 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表