1、当有键按下时,行、列线将导通,此时,行线电平将由与此行线相连的列线电平决定。这一点是识别矩阵按键是否被按下的关键。然而,矩阵键盘中的行线、列线和多个键相连,各按键按下与否均影响该键所在行线和列线的电平,各按键间将相互影响,因此,必须将行线、列线信号配合起来作适当处理,才能确定闭合键的位置。键盘的扫描码由DSP得CTRKEY给出,当有键盘输入时,读此端口得到扫描码,当无键按下时,读此端口的结果为0。CTRCLKEY。读取的方法如下: nScanCode=CTRKEY;nnn=CTRCLKEY;/nScanCode中为扫描码 对于高速运行的DSP,在两次读键盘之间可能需要增加延时语句。键盘连接原理
2、如下:DATA7:0ADDRESS15:/CS/RDUI数据锁存串行移位寄存器地址译码清除电平转换键盘U2U3U4CLKDATA图2 键盘连接原理键盘的扫描码由DSP得扩展地址0x602800给出,当有键盘输入时,读此端口得到扫描码,当无按键按下时读此端口的结果为0。各按键的扫描码排列如下所示(scancode.h)。#define SCANCODE_0 0x70#define SCANCODE_1 0x69#define SCANCODE_2 0x72#define SCANCODE_3 0x7A#define SCANCODE_4 0x6B#define SCANCODE_5 0x73#d
3、efine SCANCODE_6 0x74#define SCANCODE_7 0x6C#define SCANCODE_8 0x75#define SCANCODE_9 0x7D#define SCANCODE_Del 0x49#define SCANCODE_Enter 0x5A#define SCANCODE_Plus 0x79#define SCANCODE_Minus 0x7B#define SCANCODE_Mult 0x7C#define SCANCODE_Divid 0x4A#define SCANCODE_Num 0x772.直流电机变速原理:2.1TM320VC5509DS
4、P的McBSP引脚通过设置McBSP的工作方式和状态,可以实现将它们当成通用I/O引脚使用。2.2直流电机控制本试验采用直流电动机的脉宽调制(PWM)控制方式。 1)PWM调压调速原理 直流电机转速n的表达式为:其中,U为电枢端电压;I为电枢电流;R为电枢电路总电阻;为每极磁通量;K为电动机结构参数。所以直流电机的转速控制方法可分为两类:对励磁磁通进行控制的励磁控制法和对电枢电压进行控制的电枢控制法。其中励磁控制法在低速时收磁极饱和的限制,在高速时受换向火花和换向器结构强度的限制,并且励磁线圈电感较大,动态响应较差,所以这种控制方法用得很少。现在,大多数应用场合都使用电枢控制法。绝大多数直流电
5、机采用开关驱动方式。开关驱动方式是使半导体功率器件工作在开关状态,通过脉宽调制PWM来控制电动机电枢电压,实现调速。ViUiDIUsGNDtUoT图3 利用开关管对直流电动机进行PWM调速控制的原理图和输入输出电压波形 上图是利用开关管对直流电动机进行PWM调速控制的原理图和输入输出电压波形。图中,当开关管MOSFET的栅极输入高电平时,开关管导通,直流电动机电枢绕组两端有电压Us,t1秒后,栅极输入变为低电平,开关管截止,电动机电枢两端电压为0。T2秒后,栅极输入重新变为高电平,开关管的动作重复前面的过程。这样,对应着输入的高低电平,直流电动机电枢绕组两端的电压波形如图中所示。电动机的电枢绕
6、组两端的电压平均值Uo为: 式中,a为占空比,a=t1/T占空比a表示了在一个周期T里,开关管导通的时间与周期的比值。A的变化范围为0=a=1.由此式可知,当电源电压Us不变的情况下,电枢的端电压的平均值Uo取决于占空比a的大小,改变a值就可以改变端电压的平均值,从而达到调速的目的,这就是PWM调速原理。2)PWM调速方法在PWM调速时,占空比a是一个重要参数。以下三种方法都可以改变占空比的值:(1)定宽调频法:这种方法是保持t1不变,只改变t2,这样使周期T(或频率)也随之改变。(2)调宽调频法:这种方法是保持t2不变,只改变t1,这样使周期T(或频率)也随之改变。(3)定频调宽法:这种方法
7、是使周期T(或频率)保持不变。而改变t1和变t2。前两种方法由于在调速时改变了控制脉冲的周期(或频率),当控制脉冲的频率与系统的固有频率接近时,将会引起震荡,因此这两种方法用得很少。目前,在直流电机的控制中,主要使用定频调宽法。2.3 ICETEK-CTR直流电机模块:1)原理图ICETEK-CTR即显示控制模块上直流电机部分的原理图见下图。V3PWMDIRV1V2V4F1Y1Y2图4 ICETEK-CTR直流电机部分原理图图中PWM输入对应ICETEK-CTR-A板上P4外扩插座第26引脚的S22信号,DSP将在此引脚上给出PWM信号开控制直流电机转速;图中的DIR输入引脚ICETEK-CT
8、R-A板上P4外扩插座第29引脚的S14信号,DSP将在此引脚上给出高电平或低电平来控制直流电机的方向。从DSP输出的PWM信号和转向信号先经过2个与门和1个非门再与各个开关管的栅极相连。2)控制原理当电动机要求正传时,S14给出高电平信号,该信号分为3路:第1路与门Y1的输出由PWM决定,所以开关管V1栅极受PWM控制;第2路直接与开关管V4的栅极相连,是V4导通;第三路经非门F1连接到与门Y2的输入端,使与门Y2输出为0,这样是开关管V3截止;从非门F1输出的另一路与开关管V2的栅极相连,其低电平信号也是V2截止。同样,当电动机要求反转使,S14给出低电平信号,经过2个与门和1个非门组成的
9、逻辑电路后,使开关管V3受PWM信号控制,V2导通,V1、V4全部截止。2.4程序编制程序中采用定时器中断产生固定频率的PWM波,100次中断为一个周期,在每一个中断中根据当前占空比判断输出波形的高低电平。主程序用轮询方式读入键盘输入,得到转速和方向控制命令。在改变电机方向时为减少电压和电流的波动采用先减速再反转的控制顺序。2.5电机转动试验流程图初始化:DSP时钟、EMIF开始初始化中断寄存器、定时器初始化ICETEK-CTR,直流电机使能初始化McDSP接口(S14,S22输出控制)键盘检测改变McDSP引脚S14状态如输入1-5则根据输入调整占空比键盘输入“9”?键盘输入方向?否是中断服
10、务程序开始计数器加1,从0-99比较计数器与占空比的当前值S22引脚的状态关闭ICETEK-CTR使用设备退出中断服务程序结束图5电机转动试验流程图 3.EMIF接口:TMS320C5509DSP的扩展存储器接口(EMIF)用来与大多数外围设备进行连接,典型应用如连接片外扩展存储器等。这一接口提供地址连线、数据连线和一组控制线。ICETEK-VC5509-A将这些扩展引线到了板上的扩展插座上供扩展使用。4.蜂鸣器蜂鸣器由DSP通用I/O管脚输出控制,可将此管脚上的频率输出转换成声音输出。5509A的通用I/O口S13扩展蜂鸣器的输出频率。控制的方法是使用DSP通用定时器设置S13以一定的频率改
11、变高低状态,输出方波。对于通用定时器周期寄存器的设置,计数值为所需计数值的二分之一。蜂鸣器的连接;由于选用的蜂鸣器所需电流较小,所以采用将DSP通用I/O引脚直接驱动的方式。5.交通灯实验发光二极管是由连接在DSP扩展地址接口上的寄存器EWR和SNR控制的。这两个寄存器均为6位寄存器,其位定义如下:表1 寄存器EWRBit5Bit4Bit3Bit2Bit1Bit0东-红东-黄东-绿西-红西-黄西-绿表2 寄存器SNR南-红南-黄南-绿北-红北-黄北-绿两个寄存器的地址均映射到2812DSP的扩展空间,CTRLR,DSP通过对该地址的写操作来修改二个寄存器各位的状态,当寄存器某位取1时,相应提示
12、灯被点亮,取0则熄灭。当写入CTRLR的数据(8位有效值)的高两位为00时,数据的低6位将写入EWR寄存器;高两位为01时,数据的低6位将写入SNR寄存器。三、实验流程图:1、整体构思流程图如图1:图1 主程序流程图2、键盘扫描子程序流程图如图2: 图2 键盘扫描子程序流程图四、实验源程序:#include myapp.hICETEK-VC5509-EDU.hscancode.h#define TLIGHTWE 0x0#define TLIGHTNS 0x40#define TLIGHTSWGREEN 0x01#define TLIGHTNEGREEN 0x08ioport unsigned
13、int *tim0;ioport unsigned int *prd0;ioport unsigned int *tcr0;ioport unsigned int *prsc0;int nCursorCount;void InitInterrupt();void InitMcBSP();int tKey,cKey,nKeyCode,nCount,nCount1,uN;main() int j; unsigned char dbScanCode,dbOld; PLL_Init(20); SDRAM_init(); InitCTR(); /直流电机 /unsigned char dbScanCod
14、e,dbOld; /unsigned char dbOld; dbScanCode=dbOld=0; nCount=nCount1=0; PLL_Init(20); InitMcBSP(); CTRLR=0x0c1; for (;) dbScanCode=GetKey(); dbScanCode&=0x0ff; if(dbScanCode=SCANCODE_9) break; switch(dbScanCode) case 1: CTRLR=0x1; CTRLR=0x40; int nMusicCount; int nWork; int uN; CTRGR=8; / BUZZE=1 打开蜂鸣器
15、, 见ICETEK-CTR的全局控制寄存器描述 / 设置合适的音长和音高 for ( nWork=0;nWorknMusicNumber;nWork+ ) musicnWork0*=10;/10 musicnWork1*=3;/3 musicnWork1/=12;/12 / 设置DX0管脚为通用输出管脚以驱动蜂鸣器/ SPCR0&=0x0fffeffff; / /XRST=0/ PCR0|=0x2000; / RIOEN=1 InitInterrupt(); TIME_init(); nMusicCount=0; while ( dbScanCode = 1 ) nMusicCount+; n
16、MusicCount%=nMusicNumber; if ( musicnMusicCount0=0 ) *tcr0&=0x0fffffcff; / 静音 else *prd0=musicnMusicCount0; / 切换音符 *tcr0=0xe0; /if ( dbScanCode=SCANCODE_Enter ) break; Delay(musicnMusicCount1); uN=60; CTRGR=1; /直流电机使能,DCME=1 while ( dbScanCode =1 ) if ( nCount1=0 ) dbScanCode=GetKey(); if ( dbScanCo
17、de!=dbOld ) dbOld=dbScanCode; if ( dbScanCode=SCANCODE_9 ) break; /退出 else if ( dbScanCode=SCANCODE_7 ) PCR1|=2; /反转 else if ( dbScanCode=SCANCODE_8) PCR1&=0x0fffd; else if ( dbScanCode=SCANCODE_3 ) uN=80; else if ( dbScanCode=SCANCODE_4 ) uN=60; else if ( dbScanCode=SCANCODE_5 ) uN=40; else if ( db
18、ScanCode=SCANCODE_6 ) uN=20; break; case 2: CTRLR=0x2;for(;) musicnWork0*=5; musicnWork1/=5; while ( dbScanCode = 2 ) for(j=0;j30;j+) / North CTRLR=TLIGHTNS+(TLIGHTSWGREENj);/使交通灯依次亮起 Delay(38); CTRLR=TLIGHTNS; Delay(38);j+) / West CTRLR=TLIGHTWE+(TLIGHTSWGREEN /使交通灯依次亮起 CTRLR=TLIGHTWE; j+) / South
19、CTRLR=TLIGHTNS+(TLIGHTNEGREENj+) / East CTRLR=TLIGHTWE+(TLIGHTNEGREENuN ) PCR2|=4; else PCR2&=0x0fffb; nCount1+; nCount1%=5120;void InitMcBSP() / IOPin: McBSP1.FSX S15 /SPCR2.XRST_=0,PCR.XIOEN=1,PCR.FSXM=1,PCR.FSXP=0/1 SPCR2_1&=0x0fffe; PCR1|=0x2800;void TIME_init(void) tim0 = (unsigned int *)0x1000
20、; prd0 = (unsigned int *)0x1001; tcr0 = (unsigned int *)0x1002; prsc0 = (unsigned int *)0x1003; *tcr0 = 0x04f0; *tim0 = 0; *prd0 = 0xffff; *prsc0 = 2; *tcr0 = 0x00e0; 五、实验过程中遇到的困难及实验心得:1.关键问题:本次试验过程中,我们遇到了很多困难。虽然,之前我们已经将各个实验功能都实现了,但是光是将这些实验加到一起,组成一个综合型的实验就要比我们想象中难得多,更不用说还要将这些实验加以改进、完善。我们首先遇到的问题就是如何将
21、各个实验整合到一起。在多次失败的尝试后,我们终于找到了方法。最大的问题就是由于自己的程序编写能力不足,不能够达到想要的效果。例如,我们想将交通灯的实验和音频信号发生实验相结合,但是多次尝试都没能实现,明明在程序中没有错误,可是就是不发声。其他主要遇到具体问题如下:1)将各独立的程序作为子程序放在文件里带来的公共参数的定义冲突问题。在刚开始实验的阶段,由于经验不足,在将独立的程序融入到主中时,在定义公共参数的时候,函数的重新定义以及参数的反复负值,导致程序不能正常的运行。在综合程序的调试时,缺少某些函数和变量的定义。2)直流电机不能正常运转,比如,运行程序时,电机无法正常运转.3)交通灯只亮两圈
22、。2.解决方案:1)在主程序之前统一定义公共变量和函数,避免在子程序中重复定义。对于缺少的函数或变量,首先检查了是否在程序开始部分将需要的头文件全部include进来;其次,对于已经包含的头文件,对比原来独立程序的相同名称的头文件,检查是否没有将所有的变量定义复制过来。2)向其他成功显示信息的组的成员求教,发现成功的情况是在电机实验的基础上对实验内容进行添加修改的。也许是因为程序包含的文件中,有些许定义方面有差别,或者是实验硬件本身兼容性的问题,所以沿用了成功的组的经验,转而在步进电机的实验上进行添加修改,问题得以解决.3)电机无法正常运转,我们经过多次试验,最后终于找到了原因,有的是因为DSP试验箱没有正常工作,我们又检查了程序,发现程序没问题,最后我们终于可使电机正转反转,并且可以调整电机速度。4)交通灯只亮两圈,最后我们明白了需要加循环,这样才能