用定时器实现数字振荡器
- 格式:doc
- 大小:117.50 KB
- 文档页数:9
汇编源程序====================================================================== ======*/;/* Copyright (C) 2004 YINXING TECHNOLOGY CO., LTD */;/* All Rights Reserved. */ ;/* ----------------------------------------------------------------------------*/;/*======================================================================.title "for test INT service program ...(25 us) ".mmregs 定义存储器影响寄存器,这样就可以用AR0,PMST等助记符替换实际的存储器地址.global_c_int00,_tint,vector标明一个或多个全局符号OFF_INTIMER .set 04Ch ; TIMER的向量初始化入口地址VECTOR+OFF_INTIMERINIT_A .set 079bch ; A/2=0.9510498INIT_B .set 0c000h ; B/2=-0.5INIT_C .set 013c7h ; C/2=0.1545105.bss y0,1 ;为结果y0分配一个存储单元.bss y1,1.bss y2,1.bss temp,1.bss AA,1.bss BB,1.bss CC,1.text ;定义可可执行代码段_c_int00:ld #0,dp;设置DP页指针ssbx intm ; 关闭所有中断st #1fffh,spld #vector, a ; 读出中断向量地址and #0FF80h, a ;保留高9位(IPTR:中断向量指针andm #007Fh, pmst ;保留pmst的低7位or pmst, astlm a, pmst ; 设置IPTRstm #10h,TCR ; 初始化定时器TCR为定时器控制寄存器stm #2499,PRD ; f=100M/(2499+1)=40kHz PRD 为计数器周期寄存器stm #20h,TCR ; 重新装入TIM和PSC,然后启动定时器ldm IMR,a ; 重新返回中断屏蔽寄存器or #08h,a ; 启动定时器中断stlm a,IMR ; 设置中断屏蔽寄存器ld #temp,dp ; 设置DP页指针ssbx FRCT ; prepare for fraction mpy FRCT为ST1中的小数方式位;(Ssbx 状态寄存器复位,即对状态寄存器ST0,ST1特定位置1)st #INIT_A,AA ; init AA,BB,CC 即初始化AA BB CCst #INIT_B,BB ;将常数B装入变量BBst #INIT_C,CC ;pshd CC ;将变量CC压入堆栈popd y2 ; init y2,y2=CCld AA,T ; T=AA装载AA到T寄存器mpy y2,a ; y2*AA放入a中sth a,y1 ; y2*AA -> y1(将A寄存器的高十六位放入变量y1)stm #0h,TCR ; 定时器复位noprsbx intm ;复位所有的中断(状态寄存器复位STN (SBIT)=0)again:nopb againnopnopnopnopnopnop;-------------------------------------------------------------; interrupt for INT_TIMER ! 中断服务程序;-------------------------------------------------------------_tint:ld#BB,DPld BB,T ; T=BBmpy y2,a ; a=y2*BBltd y1 ; T=y1,y2=y1mac AA,a ; a=a+y1*AAsth a,1,y1 ; new cos data -> y1sth a,1,y0 ; new cos data -> y0nop ; set breakpoint in CCS !!!int1_end:noprete.end连接命令文件/*====================================================================== ======*//* Copyright (C) 2004 YINXING TECHNOLOGY CO., LTD *//* All Rights Reserved. */ /* ----------------------------------------------------------------------------*//*====================================================================== ======*/MEMORY;描述系统的硬件资源,用来定义用户设计的系统中所包含的的各种形式的存储器{PAGE 1:INT_D : ORIGIN=80h, LENGTH=1F80hPAGE 0:EXT_P : ORIGIN=2000h, LENGTH=2000h}SECTIONS ;描述段如何定位到家当的硬件资源上,将输出段定位到所定义的存储器中{.text : > EXT_P PAGE 0.int_table : > (EXT_P ALIGN (128) PAGE (0)).data : > INT_D PAGE 1}中断向量表:;/*====================================================================== ======*/;/* Copyright (C) 2004 YINXING TECHNOLOGY CO., LTD;/* All Rights Reserved. */ ;/* ----------------------------------------------------------------------------*/;/*====================================================================== ======*/.mmregs ;.ref _ret ;.ref 在当前段中使用,在其他段中定义.ref _c_int00.ref _tint.global vector.sect ".int_table" ;.建立包含代码和数据的定义段;--------------------------------------------------------------------; interrupte vector table !;--------------------------------------------------------------------vector:rs b _c_int00 ;复位nopnopnmi b __ret ;非屏蔽中断nopnopsint17 b __ret ;软件中断sint17nopnopsint18 b __retnopnopsint19 b __retnopnopsint20 b __ret.word 0,0sint21 b __ret.word 0,0sint22 .word 01000h.word 0,0,0sint23 .word 0ff80h /*TMS320C54x中,中断向量地址由PMST寄存器中的9 .word 0,0,0 位向量地址指针IPTR和左移2位后的中断向量序号组sint24 .word 01000h 成,复位时,IPTR全为1,因此中断向量地址为FF80H.*/ .word 0,0,0.word 0,0,0sint26 .word 01000h ;word用来设置一个或多个16位带符号整型常数.word 0,0,0sint27 .word 0ff80h.word 0,0,0sint28 .word 01000h.word 0,0,0sint29 .word 0ff80h.word 0,0,0sint30 .word 01000h.word 0,0,0int0 b __ret ;外部中断0,软中断0nopnopint1 b __ret ;外部中断1,软中断1nopnopint2 b __ret ;外部中断2,软中断2nopnoptint b _tint ;定时中断,软中断3nopnopbrint0 b __ret ;McBSP(串行口)0接收中断nopnopbxint0 b __ret ;McBSP(串行口)0发送中断nopnoptrint b __retnopnopdmac1 b __ret ;McBSP2发送中断(默认)/DMA通道中断,软中断7 nopnopint3 b __ret ;外部中断3,软中断8nopnophpint b __ret ;HPI中断,软中断9nopnopq26 .word 0ff80h.word 0,0,0.word 0,0,0dmac4 b __retnopnopdmac5 b __retnopnopq30 .word 0ff80h.word 0,0,0q31 .word 01000h.word 0,0,0;--------------------------------------------------------------------------; end of interrupte vector table !;-------------------------------------------------------------------------__ret rete ;开中断,从中断快速返回说明:中断向量表是用来装载不同类型的中断服务程序的入口!。
555定时器引脚图及其简单应用本文主要介绍了555定时器的工作原理及其在单稳态触发器、多谐振荡器方面的应用。
关键词:数字——模拟混合集成电路;施密特触发器;波形的产生与交换555芯片引脚图及引脚描述555的8脚是集成电路工作电压输入端,电压为5~18V,以UCC表示;从分压器上看出,上比较器A1的5脚接在R1和R2之间,所以5脚的电压固定在2UCC/3上;下比较器A2接在R2与R3之间,A2的同相输入端电位被固定在UCC/3上。
1脚为地。
2脚为触发输入端;3脚为输出端,输出的电平状态受触发器控制,而触发器受上比较器6脚和下比较器2脚的控制。
当触发器接受上比较器A1从R脚输入的高电平时,触发器被置于复位状态,3脚输出低电平;2脚和6脚是互补的,2脚只对低电平起作用,高电平对它不起作用,即电压小于1Ucc/3,此时3脚输出高电平。
6脚为阈值端,只对高电平起作用,低电平对它不起作用,即输入电压大于2 Ucc/3,称高触发端,3脚输出低电平,但有一个先决条件,即2脚电位必须大于1Ucc/3时才有效。
3脚在高电位接近电源电压Ucc,输出电流最大可打200mA。
4脚是复位端,当4脚电位小于0.4V时,不管2、6脚状态如何,输出端3脚都输出低电平。
5脚是控制端。
7脚称放电端,与3脚输出同步,输出电平一致,但7脚并不输出电流,所以3脚称为实高(或低)、7脚称为虚高。
1概述1.1 555定时器的简介555定时器是一种多用途的数字——模拟混合集成电路,利用它能极方便地构成施密特触发器、单稳态触发器和多谐振荡器。
由于使用灵活、方便,所以555定时器在波形的产生与交换、测量与控制、家用电器、电子玩具等许多领域中都得到了广泛应用。
自从signetics公司于1972年推出这种产品以后,国际上个主要的电子器件公司也都相继的生产了各自的555定时器产品。
尽管产品型号繁多,但是所有双极型产品型号最后的3位数码都是555,所有CMOS产品型号最后的4位数码都是7555.而且,它们的功能和外部引脚排列完全相同。
由555定时器构成的多谐振荡器介绍多谐振荡器是一种能够产生多种频率输出的电路。
555定时器是一种经典的集成电路,它被广泛应用于定时、脉冲和振荡等电路中。
本文将介绍由555定时器构成的多谐振荡器的原理和工作方式。
原理多谐振荡器利用了555定时器的特殊功能和结构。
555定时器是一种8引脚的集成电路,通过控制引脚的电压来实现不同的功能。
其中,引脚1(GND)和引脚8(Vcc)分别是地(Ground)和电源(Power)引脚,引脚4(Reset)是重置引脚,引脚5(Control)是控制引脚,引脚6(Threshold)和引脚2(Trigger)是比较器的输入引脚,引脚3(Out)是输出引脚。
在多谐振荡器中,我们使用555定时器的比较器和比较器的输入引脚来实现不同频率的输出。
具体来说,我们通过控制电压在引脚5(Control)上的变化来改变555定时器的工作方式和输出频率。
通过调整控制引脚的电压,我们可以改变比较器的输出电平,从而控制555定时器的触发和重置行为,进而改变输出波形的频率。
构成由555定时器构成的多谐振荡器一般包括以下几个基本组成部分: 1. 555定时器:作为核心部件,控制多谐振荡器的工作以及输出频率的调节。
2. 电容器:用于控制振荡器的时间常数,进而影响输出频率。
3. 电阻器:用于控制电容器充电和放电的速度,从而进一步调节输出频率。
4. 比较器的输入引脚:通过改变引脚6(Threshold)和引脚2(Trigger)的电压,控制555定时器的触发和重置行为,改变输出频率。
5. 输出引脚:通过连接外部电路或元件,实现多种不同频率的输出。
工作方式多谐振荡器的工作方式如下: 1. 当电源接通时,555定时器的引脚5(Control)和引脚6(Threshold)的电压均为高电平。
2. 由于引脚5上的高电平,555定时器工作于稳态触发器模式,输出引脚保持低电平。
3. 当输出引脚为低电平时,通过电容器和电阻器进行充电。
用定时器实现数字振荡器一、 实验目的在数字信号处理中,会经常使用到正弦/余弦信号。
通常的方法是将某个频率的正弦/余弦值预先计算出来后制成一个表,DSP 工作时仅作查表运算即可。
在本实验中将介绍另一种获得正弦/余弦信号的方法,即利用数字振荡器用叠代方法产生正弦信号。
本实验除了学习数字振荡器的 DSP 实现原理外,同时还学习 C54X 定时器使用以及中断服务程序编写。
另外,在本实验中我们将使用汇编语言和 C 语言分别完成源程序的编写。
二、 实验原理1) 数字振荡器原理设一个传递函数为正弦序列 sinkωT ,其 z 变换为2111)(-----=BzAz Cz z H 其中,A=2cosωT, B=-1, C=sinωT 。
设初始条件为 0,求出上式的反 Z 变换得:y[k]=Ay[k-1]+By[k-2]+Cx[k-1]这是一个二阶差分方程, 其单位冲击响应即为 sinkωT 。
利用单位冲击函数 x[k-1]的性质,即仅当 k=1时,x[k-1]=1,代入上式得: k=0 y[0] = Ay[-1] + By[-2] + 0 = 0k=1 y[1] = Ay[0] + By[-2] + c = ck=2 y[2] = Ay[1] + By[0] + 0 = Ay[1]k=3 y[3] = Ay[2] + By[1] .…… .k=n y[n]= Ay[n-1] + By[n-2]在 k>2 以后,y[k]能用 y[k-1]和 y[k-2]算出,这是一个递归的差分方程。
根据上面的说明,我们可以开始数字振荡器的设计。
设该振荡器的频率为 2kHz ,采样率为 40kHz (通过定时器设置,每隔 25us 中断一次,即产生一个 y[n]) ,则递归的差分方程系数为:A=2cosωT=2cos (2 x PI x 2000 / 40000)=2 x 0.95105652B=-1C=sinωT=sin (2 x PI x 2000 / 40000)=0.30901699BC A 792215=⨯ 0002215C B =⨯ 7132215C C =⨯ 为了便于定点 DSP 处理,我们将所有的系数除以 2,然后用 16 位定点格式表示为:这便是本实验中产生 2KHz 正弦信号的三个系数。
数字钟系统电路的设计方案与仿真分析
在电子技术实验教学中,构建学生的电路设计理念,提高学生的电路设计能力,是教学的根本目的和核心内容。
数字钟电路的设计和仿真,涉及模拟电子技术、数字电子技术等多方面知识,能够体现实验者的理论功底和设计水平,是电子设计和仿真教学的典型案例。
文中采用了555 定时器电路、计数电路、译码电路、显示电路和时钟校正电路,来实现该电路。
1 系统设计方案
数字钟由振荡器、分频器、计时电路、译码显示电路等组成。
振荡器是数字钟的核心,提供一定频率的方波信号;分频器的作用是进行频率变换,产生频率为1 Hz 的秒信号,作为是整个系统的时基信号; 计时电路是将时基信号进行计数;译码显示电路的作用是显示时、分、秒时间;校正电路用来对时、分进行校对调整。
其总体结构图,如图1 所示。
2 子系统的实现
2.1 振荡器
本系统的振荡器采用由555 定时器与RC 组成的多谐振荡器来实现,如图2 所示即为产生1 kHz 时钟信号的电路图。
此多谐振荡器虽然产生的脉冲误差较大,但设计方案快捷、易于实现、受电源电压和温度变化的影响很小。
2.2 分频器
由于振荡器产生的频率高,要得到标准的秒信号,就需要对所得到的信号进行分频。
在此电路中,分频器的功能主要有两个:1)产生标准脉冲信号;2)提供电路工作需要的信号,比如扩展电路需要的信号。
通常实现分频器的电路是计数器电路,选择74LS160 十进制计数器来完成上述功能[5]。
如图3 所示,555 定时器产生1 kHz 的信号,经过3 次1/10 分频后得到1 Hz 的脉冲信号,为秒个位提供标准秒脉冲信号。
实验四 用定时器实现数字振荡器1 实验目的在数字信号处理中,会经常使用到正弦/余弦信号。
通常的方法是讲某个频率的正弦/余弦值余弦计算出来后制成一个表,DSP 工作时仅作查表运算即可。
在本实验中将介绍另一种获得正弦/余弦信号的方法,即利用数字振荡器用叠代方法产生正弦信号。
本实验除了学习数字振荡器的DSP 实现原理外,同时还学习C54X 定时器使用以及中断服务程序编写。
另外,在本实验中我们将使用汇编语言和C 语言分别完成源程序的编写。
2 实验要求本实验利用定时器产生了一个2kHz 的正弦信号,定时器被设置成每25uS 产生一次中断,(等效于采样速率未40k )利用该中断,在该中断服务程序中用叠代算法计算出一个SNT 值,并利用CCS 的图形显示功能查看波形。
3 实验原理(1)数字振荡器原理设一个传递函数为阵线序列sinkwT ,其z 变换为111BzAz 1Cz )z (H -----=其中,A =2coswT ,B =-1,C=sinwT 。
设初始条件为0,求出上式的反Z 变换得: y[k]=Ay[k-1]+By[k-2]+Cx[k-1]这是个二阶差分方程,其单位冲击响应即为sinkwT 。
利用单位冲击函数x[k-1]的性质,即仅当k=1时,x[k-1]=1,代入上式得:k=0 y[0]=Ay[-1]+By[-2]+0=0k=1 y[1]=Ay[0]+By[-2]+c=ck=2 y[2]=Ay[1]+By[0]+0=Ay[1]k=3 y[3]=Ay[2]+By[1]k=n y[n]=Ay[n-1]+By[n-2]在k ﹥2以后,y[k]能用y[k -1]和y[k-2]算出,这是一个递归得方法。
根据上面得说明,我们可以开始数字振荡器得设计。
设该振荡器得频率为2kHz,采样率为40kHz (通过定时器设置,每隔25us 中断一次,即产生一个y[n])则递归得差分方程系数为:A =2coswT=2cos(2×PI ×2000/40000)=2×0.95105652B=-1C=sinwT=sin(2×PI ×2000/40000)=0.3090169979BC 22A 15=⨯ C00022B 15=⨯ 13C722C 15=⨯ 为了便于定点DSP 处理,我们将所有系数除以2,然后用16为定点格式表示为: 这便是本实验中查生2kHz 阵线信号的三个系数。
在本实验中,主程序在初始化时先计算出y[1]和y[2],然后开放定时器中断。
以后每次进入定时器中断服务程序时,利用前面的y[1]和y[2],计算出新的所有y[n],通过CCS 提供的图形显示工具,我们将在图形窗口中看到一个正弦信号波形。
下面时初始化和中断服务程序代码片断:初始化y[1]和y[2]:ssbx FRCT :置FRCT =1,准备进行小数乘法运算st #INIT_A,AA :将常数A 装入变量AAst #INIT_B,BB :将常数B 装入变量BBst #INIT_C,CC :将常数C 装入变量CCpshd CC :将变量CC 压入堆栈popd y2 :初始化y2=CCld AA.T :装AA到T寄存器mpy y2,a :y2乘系数A,结果放入A寄存器sth a,y1 :将A寄存器得高16位存入变量y1中断服务程序片断ld BB,T :将系数B 装入T寄存器mpy y2,a :y2乘系数B,结果放入A寄存器ltd y1 :将y1装入T寄存器,同时复制到y2mac AA,a :完成新正弦数据的计算,a寄存器中为y1*AA+y2*BBsth a,l,y1 :将新数据存入y1,因所有系数都除过2,所以在保存结果时转移一位,恢复数据正常大小sth a,l,y0 :将新正弦数据存入y0(2)C54X的定时器操作C54X的片内定时器利用CLKOUT时钟计数,用户使用三个寄存器(TIM,PRD,TCR)来控制定时器,参见表4-1。
在表4-2中列出了定时器控制寄存器的各个比特位的具体定义。
‘VC5402得另一个定时器(定时器1)的控制寄存器分别为:0 ×30(TIM1),0 ×31(PRD1),0 ×32(TCR1)。
表4-1‘VC5402定时器0的相关寄存器表4-2定时器控制就存起(TCR)bit概要从上面的介绍可以看到定时器实际上可以有20个比特的周期寄存器。
它对于CLKOUT信号计数,先将PSC减1,知道PSC为0。
这是CPU发出TINT中断,同时在TOUT引脚输出一个脉冲信号,脉冲宽度与CLKOUT一致。
然后用PDR重新装入TIM,重复下去一直到系统或定时器复位。
因而定时器中断得频率由一下的公式决定:TINT 的频率=)1PRD ()1T DDR (t 1c +⨯+⨯ 其中tc 表示CLKOUT 的周期。
定时器当前得值可以通过读取TIM 寄存器和TCR 寄存器的PSC 比特位得到。
下面时本实验中初始化定时器得程序片段:stm #10h,TCR :停止定时器stm #2499,PDR : 设置PDR 寄存器值为2499,TINT 中断频率为Foutclk/(2499+1)=100MHz/2500=40KHzstm #20h,TCR :重新装入TIM 和,PSC ,然后启动定时器(3)C54X 中断的使用在C54X 中用户可以通过中断屏蔽酒酿起IMR 来决定开放或关闭一个中断请求。
图4-1出了C5402得IMR 寄存器的各个比特位的定义。
图4-1 C5402的IMR 寄存器其中,HPINT 表示HPI 接口中断,INT3-INTO 为外部引脚产生的中断,TXINT 和TRINT 为TDM 串口发送和接受中断,BXINT0和BRINT0为BSP 串口的发送和接收中断,TINT0为定时器0中断。
在中断屏蔽寄存器IMR 中,1表示允许CPU 响应对应的中断,0表示禁止。
当然要CPU 响应中断,ST1寄存器中的INTM 还应该为0(允许所有的中断)。
当DSP 响应中断时,PC 指针指向中断向量表中对应中断的地址,进入中断服务子程序。
中断向量表是C54X 存放中断服务程序的一段内存区域,大小为80H 。
在中断向量表中,每一个中断占用4个字的空间,一般情况是将一条跳转或延时延时跳转指令存放于此。
当然,如果中断服务程序很短(小于或等于4个字),可以直接放入该向量表。
中断向量表的位置可以通过修改基地址来改变,其基地址由PMST 寄存器中的IPTR(15-7 bit)决定。
表4-3给出了中断向量表的各中断的偏移说明。
例如C54x复位后其IPTR全为1,所以中断向量表位置在OFF80H,因而复位后程序从OFF80H开始运行。
本实验的初始化程序读取中断向量表的起始地址,然后设置PMST的高9位,以便DSP能正确响应中断,代码如下:1d #0,dp ; 设置DP页指针ssbx intm ; 关闭所有中断1d #vector ;读出中断向量(地址vector在中断向量表程序中定义)and #OFF80h, a ; 保留PMST的低7位or pmst, a ;stlma, pmst ; 设置PMST(其中包括IPTR)表4-3 54X的中断向量表4 实验内容本实验需要使用C54X汇编语言或C语言实现数字振荡器,并通过CCS提供的图形显示窗口观察输出信号波形以及频谱。
实验分下面几步完成:(1)根据确定数字振荡器的频率,确定系数。
数字振荡器系数的确定在前面已经说明,这里不再赘述。
(2)启动CCS,新建工程文件,如文件名为sinewave.mak。
选择Project菜单中的Add File to Project 选项,将汇编源程序exer3.sdm 、vec_table.asm 和连接定位sinewave.cmd 文件依次添加到工程文件中。
注意,你可以在添加文件对话框中选择显示不同的文件类型来加快文件选择速度。
你也可以使用鼠标右键单击工程文件名(如sinewave.mak)并选择Add Files爱添加需要的文件。
其中,exer3.asm包括初始化代码和中断服务程序,而vec_talbe.asm包含中断向量表。
(3)选择Project菜单中的Option选项,或使用鼠标右键单击工程文件名(如sinewave.mak)并选择Option项来修改或添加编译、连接中使用的参数。
例如,选择Assemble窗口,选择“Enable Symbolic Debug Information”以便使用汇编代码级调试(你可以在汇编源程序设置断点等等)。
选择Linker窗口,在“Output Filename”栏中写入输出OUT文件的名字,如sina.out,你还可以设置生成的MAP文件名。
(4)写成编译、连接,正确生成OUT文件。
然后使用File菜单中的“Load Program”选项,将生成的OUT文件(如sina.out)装入DSP的片内存储器。
这是CCS将显示程序的起始地址_c_int00.(5)选View→Graph→Time/Frequency…打开图形显示设置窗口。
在弹出的对话框中按下图设置,主要修改“Star Address”为y0(y0为生成的正弦波输出变量);“Acquisition Buffer Size”为1,“DSP Data Type”为“16-bit signed integer”。
想想为什么要这样修改?(6)在汇编源程序的中断服务程序(_tint)中的“nop”语句处设置断点。
该行被加亮为洋红色。
选择Debug→Animate,运行程序,观察输出波形。
数一数一个周期的正弦波由多杀个点?算算频率是否是2kHz?另外,想想Run和Animate两种运行方式的区别?(7)用右键单击图形显示窗口,并选择“Proporties”项以便修改显示属性。
将“Display Type”项改为“FFT Magnitude”以便显示信号频谱。
修改“Sampling Rate(Hz)”项为40000,然后退出。
注意观察生成的正弦波频率。
(8)清除所有断点,关闭除波形显示窗口外的所有窗口,并关闭工程文件。
下面我们使用C语言完成本实验。
新建一个工程文件,如sinewave_c.mak并添加timer.c,vec_table.asm源程序,再添加timer.cmd,再添加C使用的标准库rts.lib。
该文件应该再CCS安装目录中。
例如,若CCS安装在d:\ti下,则rts.lib应该在d:\ti\c5400\cgtools\lib下。
修改编译、连接选项,加入符号调试选项,修改生成的OUT文件名,如tiner.out。
(9)完成编译。
连接,正确生成OUT文件。
然后使用File菜单的“Load Program”选项,将生成的OUT文件(如timer.out)装入DSP的片内存储器。