打印
[资料分享与下载]

以YL-KL26Z开发板制作会讲故事的书——4

[复制链接]
820|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程序如下:
TSIDrv.c
#include "TSIDrv.h"
#include "includes.h"
INT8U total_electrode = TOTAL_ELECTRODE;
INT8U elec_array[16]={ELECTRODE0,ELECTRODE1,ELECTRODE2,ELECTRODE3,ELECTRODE4,ELECTRODE5,                        ELECTRODE6,ELECTRODE7,ELECTRODE8,ELECTRODE9,ELECTRODE10,ELECTRODE11,
                                ELECTRODE12,ELECTRODE13,ELECTRODE14,ELECTRODE15};
INT16U gu16TSICount[16];
INT16U gu16Baseline[16];
INT16U gu16Threshold[16]={THRESHOLD0,THRESHOLD1,THRESHOLD2,THRESHOLD3,THRESHOLD4,THRESHOLD5,
                                THRESHOLD6,THRESHOLD7,THRESHOLD8,THRESHOLD9,THRESHOLD10,THRESHOLD11,
                                THRESHOLD12,THRESHOLD13,THRESHOLD14,THRESHOLD15};
INT16U gu16Delta[16];
INT16U ongoing_elec;
INT8U end_flag = TRUE;
INT8U j;
INT8U SliderPercentegePosition[3] = {NO_TOUCH,NO_TOUCH,NO_TOUCH};
INT8U SliderDistancePosition[3] = {NO_TOUCH,NO_TOUCH,NO_TOUCH};
INT16U AbsolutePercentegePosition = NO_TOUCH;
INT16U AbsoluteDistancePosition = NO_TOUCH;
void TSI_Init (void)
{
  SIM_SCGC5 |= SIM_SCGC5_TSI_MASK;  // Enable clock gating for TSI
  /* Enable proper GPIO as TSI channels */
  PORTB_PCR16 = PORT_PCR_MUX(0);   // PTB16 as TSI channel 9
  PORTB_PCR17 =  PORT_PCR_MUX(0);  // PTB17 as TSI channel 10
  PORTC_PCR0 =  PORT_PCR_MUX(0);   // PTB17 as TSI channel 13
  NVIC_DisableIRQ((IRQn_Type)TSI0_IRQn);
   
  TSI0_GENCS |= (TSI_GENCS_ESOR_MASK
                   | TSI_GENCS_MODE(0)
                   | TSI_GENCS_REFCHRG(4)
                   | TSI_GENCS_DVOLT(0)
                   | TSI_GENCS_EXTCHRG(7)  
                   | TSI_GENCS_PS(4)
                   | TSI_GENCS_NSCN(11)
                   | TSI_GENCS_TSIIEN_MASK
                   | TSI_GENCS_STPE_MASK
                   //| TSI_GENCS_STM_MASK     //Trigger for the module 0=Sofware
                   );
  
  TSI0_GENCS |= TSI_GENCS_TSIEN_MASK;
  
  TSI_SelfCalibration();
}
void change_electrode(void)
{
    int16_t u16temp_delta;
   
    gu16TSICount[ongoing_elec] = (TSI0_DATA & TSI_DATA_TSICNT_MASK);          // Save Counts for current electrode
    u16temp_delta = gu16TSICount[ongoing_elec] - gu16Baseline[ongoing_elec];  // Obtains Counts Delta from callibration reference
    if( u16temp_delta < 0)
            gu16Delta[ongoing_elec] = 0;
    else
            gu16Delta[ongoing_elec] = u16temp_delta;
   
    if(total_electrode > 1)  //Change Electrode to Scan
    {
            if((total_electrode-1) > ongoing_elec) ongoing_elec++;
            else   ongoing_elec = 0;
            
            TSI0_DATA = ((elec_array[ongoing_elec]<<TSI_DATA_TSICH_SHIFT) );
            TSI0_DATA |= TSI_DATA_SWTS_MASK;
    }
}
void TSI_Slider_LED(void )
{
     if(end_flag)
      {   
        end_flag = FALSE;
        if((gu16Delta[0] > gu16Threshold[0])||(gu16Delta[1] > gu16Threshold[1])||(gu16Delta[2] > gu16Threshold[2]))
         {
           if((gu16Delta[0] > gu16Threshold[0]))      j=1;
           if((gu16Delta[1] > gu16Threshold[1]))      j=2;
           if((gu16Delta[2] > gu16Threshold[2]))      j=3;
              }
else
         {  j=6;
            SliderPercentegePosition[0] = NO_TOUCH;  
            SliderPercentegePosition[1] = NO_TOUCH;
            SliderPercentegePosition[2] = NO_TOUCH;
            SliderDistancePosition[0] = NO_TOUCH;
            SliderDistancePosition[1] = NO_TOUCH;
            SliderDistancePosition[2] = NO_TOUCH;
            AbsolutePercentegePosition = NO_TOUCH;
            AbsoluteDistancePosition = NO_TOUCH;
         }
      }
}     
void TSI0_IRQHandler(void)
{
  end_flag = TRUE;
  TSI0_GENCS |= TSI_GENCS_EOSF_MASK; // Clear End of Scan Flag
  change_electrode();
}

使用特权

评论回复
板凳
大苏牙|  楼主 | 2015-11-25 21:08 | 只看该作者








使用特权

评论回复
地板
Mancherstun| | 2015-11-25 21:27 | 只看该作者
KL26z是cortex m0的吧,出现锯齿波是怎么回事啊

使用特权

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

本版积分规则

27

主题

278

帖子

4

粉丝