[资料分享与下载] 以YL-KL26Z开发板制作会讲故事的书——4

[复制链接]
1050|3
 楼主| 大苏牙 发表于 2015-11-25 21:05 | 显示全部楼层 |阅读模式
播放模式及控制
    多语音段播放模式可分为逐段按序播放、自动顺序播放、选控播放、组合播放等。
逐段按序播放:为控制语音段的播放节奏,以键控的方式按序播放语音段且可以实现循环播放,其特点是控制按键少,有利于页面与语音的对应。
自动顺序播放:启动后无需人工干预即可按顺序播放各语音段的内容,由于缺少节奏控制,故难以统一页面与语音的对应关系。
选控播放:选控播放与逐段按序播放都具有音乐播放的控制性,但它在语音段的控制上其操作性更灵活,而附带的条件则是要配置较多的按键,语音段越多,按键就越多,要建立一一对应的关系。它宜用在语音段比较少的情况,且以采用触摸键的方式为佳。
组合播放:多用于参数播报方面,如当前温度是xx度等,其温度值是按测量值来组合数字语音段而拼接出的,需一定的程序段来辅助处理。
语音文件制备及命名规则
为了实现各种语音播放模式,需制备相应的语音段文件,并按照相应的功能来命名文件。在处理顺序播放的模式下,宜采用数字来命名,以便于建立顺序间的对应关系。而在组合播放模式下,则应以简短的字符来说明语音段的内容为佳,从而便于组合输出。
TSI技术
在YL-KL26Z开发板上,除了使用小按键来进行人机交互外,还有另一种操控方式就是触摸式操控。触摸式操控采用的是TSI技术。
所谓“TSI”是Touch Sensing Input 的缩写,是触摸感应输入的意思,作为一种新型的人机交互手段,其不同于传统的机械式按键操作,而是通过感应板来感知外部的操作意向。主流的触摸感应技术主要有电阻式、电容式、红外线式和表面超声波式。
YL-KL26Z开发板所采用的是电容式感应输入接口,它最多可提供16个TSI引脚,在开发板上实际所提供的为3个触摸键位。
那电容式感应输入是如何工作的呢?它是将一块小的电极板与TSI引脚相连接,有时为了防止电流的伤害,也会在其间接入一个1K的限流电阻。而所谓电极就是一块表面覆有绝缘材料的导电板。在一般条件下,电极表面覆盖的绝缘材料如玻璃或绝缘涂层等,其厚度约为电极直径的10%,即直径1cm的电极其合适的感应距离为1mm。
当人体接近或接触电极板时,会使电极板的电容值发生改变,TSI引脚的内部机制可以对极板的电容值进行检测,当检测值超过预设的限值时,就会置位TSI的触发标志位,并激活中断请求以进行事件响应处理。
在TSI引脚内部有两个电流源对外部的极板进行冲放电,并在极板上产生三角波信号。极板上的三角波信号频率会随极板电容的变化而变化。当电容增大时,三角波的信号频率就会减小,周期就会变大。借助这一变化规律,就可判别是否出现触摸操作。
在YL-KL26Z开发板上,使用触摸操作来控制语音段的播放,需要在键控程序的基础上在项目中添加TSI的驱动程序,添加后的界面如下图所示。
为了减少编程的工作量,可在原触摸程序的基础上进行改造,对TSI_Slider_LED( )函数的主要修改为:
1.清除触摸下的LED灯处理
2.添加外部扩展的公共变量j,以传递触发键位值。

 楼主| 大苏牙 发表于 2015-11-25 21:07 | 显示全部楼层
修改后的TSI程序如下:
  1. TSIDrv.c
  2. #include "TSIDrv.h"
  3. #include "includes.h"
  4. INT8U total_electrode = TOTAL_ELECTRODE;
  5. INT8U elec_array[16]={ELECTRODE0,ELECTRODE1,ELECTRODE2,ELECTRODE3,ELECTRODE4,ELECTRODE5,                        ELECTRODE6,ELECTRODE7,ELECTRODE8,ELECTRODE9,ELECTRODE10,ELECTRODE11,
  6.                                 ELECTRODE12,ELECTRODE13,ELECTRODE14,ELECTRODE15};
  7. INT16U gu16TSICount[16];
  8. INT16U gu16Baseline[16];
  9. INT16U gu16Threshold[16]={THRESHOLD0,THRESHOLD1,THRESHOLD2,THRESHOLD3,THRESHOLD4,THRESHOLD5,
  10.                                 THRESHOLD6,THRESHOLD7,THRESHOLD8,THRESHOLD9,THRESHOLD10,THRESHOLD11,
  11.                                 THRESHOLD12,THRESHOLD13,THRESHOLD14,THRESHOLD15};
  12. INT16U gu16Delta[16];
  13. INT16U ongoing_elec;
  14. INT8U end_flag = TRUE;
  15. INT8U j;
  16. INT8U SliderPercentegePosition[3] = {NO_TOUCH,NO_TOUCH,NO_TOUCH};
  17. INT8U SliderDistancePosition[3] = {NO_TOUCH,NO_TOUCH,NO_TOUCH};
  18. INT16U AbsolutePercentegePosition = NO_TOUCH;
  19. INT16U AbsoluteDistancePosition = NO_TOUCH;
  20. void TSI_Init (void)
  21. {
  22.   SIM_SCGC5 |= SIM_SCGC5_TSI_MASK;  // Enable clock gating for TSI
  23.   /* Enable proper GPIO as TSI channels */
  24.   PORTB_PCR16 = PORT_PCR_MUX(0);   // PTB16 as TSI channel 9
  25.   PORTB_PCR17 =  PORT_PCR_MUX(0);  // PTB17 as TSI channel 10
  26.   PORTC_PCR0 =  PORT_PCR_MUX(0);   // PTB17 as TSI channel 13
  27.   NVIC_DisableIRQ((IRQn_Type)TSI0_IRQn);
  28.    
  29.   TSI0_GENCS |= (TSI_GENCS_ESOR_MASK
  30.                    | TSI_GENCS_MODE(0)
  31.                    | TSI_GENCS_REFCHRG(4)
  32.                    | TSI_GENCS_DVOLT(0)
  33.                    | TSI_GENCS_EXTCHRG(7)  
  34.                    | TSI_GENCS_PS(4)
  35.                    | TSI_GENCS_NSCN(11)
  36.                    | TSI_GENCS_TSIIEN_MASK
  37.                    | TSI_GENCS_STPE_MASK
  38.                    //| TSI_GENCS_STM_MASK     //Trigger for the module 0=Sofware
  39.                    );
  40.   
  41.   TSI0_GENCS |= TSI_GENCS_TSIEN_MASK;
  42.   
  43.   TSI_SelfCalibration();
  44. }
  45. void change_electrode(void)
  46. {
  47.     int16_t u16temp_delta;
  48.    
  49.     gu16TSICount[ongoing_elec] = (TSI0_DATA & TSI_DATA_TSICNT_MASK);          // Save Counts for current electrode
  50.     u16temp_delta = gu16TSICount[ongoing_elec] - gu16Baseline[ongoing_elec];  // Obtains Counts Delta from callibration reference
  51.     if( u16temp_delta < 0)
  52.             gu16Delta[ongoing_elec] = 0;
  53.     else
  54.             gu16Delta[ongoing_elec] = u16temp_delta;
  55.    
  56.     if(total_electrode > 1)  //Change Electrode to Scan
  57.     {
  58.             if((total_electrode-1) > ongoing_elec) ongoing_elec++;
  59.             else   ongoing_elec = 0;
  60.             
  61.             TSI0_DATA = ((elec_array[ongoing_elec]<<TSI_DATA_TSICH_SHIFT) );
  62.             TSI0_DATA |= TSI_DATA_SWTS_MASK;
  63.     }
  64. }
  65. void TSI_Slider_LED(void )
  66. {
  67.      if(end_flag)
  68.       {   
  69.         end_flag = FALSE;
  70.         if((gu16Delta[0] > gu16Threshold[0])||(gu16Delta[1] > gu16Threshold[1])||(gu16Delta[2] > gu16Threshold[2]))
  71.          {
  72.            if((gu16Delta[0] > gu16Threshold[0]))      j=1;
  73.            if((gu16Delta[1] > gu16Threshold[1]))      j=2;
  74.            if((gu16Delta[2] > gu16Threshold[2]))      j=3;
  75.               }
  76. else
  77.          {  j=6;
  78.             SliderPercentegePosition[0] = NO_TOUCH;  
  79.             SliderPercentegePosition[1] = NO_TOUCH;
  80.             SliderPercentegePosition[2] = NO_TOUCH;
  81.             SliderDistancePosition[0] = NO_TOUCH;
  82.             SliderDistancePosition[1] = NO_TOUCH;
  83.             SliderDistancePosition[2] = NO_TOUCH;
  84.             AbsolutePercentegePosition = NO_TOUCH;
  85.             AbsoluteDistancePosition = NO_TOUCH;
  86.          }
  87.       }
  88. }     
  89. void TSI0_IRQHandler(void)
  90. {
  91.   end_flag = TRUE;
  92.   TSI0_GENCS |= TSI_GENCS_EOSF_MASK; // Clear End of Scan Flag
  93.   change_electrode();
  94. }
 楼主| 大苏牙 发表于 2015-11-25 21:08 | 显示全部楼层
Mancherstun 发表于 2015-11-25 21:27 | 显示全部楼层
KL26z是cortex m0的吧,出现锯齿波是怎么回事啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

278

帖子

4

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