求单相锁相环SPLL程序,dsp28335

求单相锁相环SPLL程序,dsp28335,第1张

实现软件锁相环技术的方法很多,如指针旅段归零同时调频调相[1]、多周期调节锁相原理[2]等。上述方法、

法利用DSP的捕获单元,对单相电压的过零点进行捕获,只能在电压过零点时,对相位进行校正。若在一个周期内相位发生变化拆咐誉,就不具有对电压相位的实时控制能力,且需使用两个捕获单元和3个定时器。提出一种基于TMS320F2812[3]的三相软件锁相环实现方法,该方法模拟硬件锁相实简念现原理,利用PI调节器输出的误差角频率与TMS320F2812定时器计数值的对应关系产生定时器周期中断,在中断程序中加固定角度,从而取代软件锁相复杂的积分环

#include "myapp.h"

#include "ICETEK-VC5509-EDU.h"

#include "scancode.h"

/腊老槐/ :-- Define Timer 0 's Registers ---//

ioport unsigned int *tim0

ioport unsigned int *prd0

ioport unsigned int *tcr0

ioport unsigned int *prsc0

// :-- End of Define -----------------//

void InitMcBSP() //函数声明

unsigned int uN,nCount,nCount1//定义外部变量

main() //主程序

{

unsigned char dbScanCode,dbOld //定义内部变量

dbScanCode=dbOld=0

nCount=nCount1=0

PLL_Init(20) //初始化PLL

SDRAM_init() //初始化SDRAM

InitCTR() //初始化CTR

InitMcBSP() //初始化McBSP

uN=60

CTRGR=1

InitInterrupt() //初始化中断

TIME_init() //初始化定时器

while ( 1 )

{

if ( nCount1==0 )

{

dbScanCode=GetKey() //读取键盘输入的信轮友息

if ( dbScanCode!=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_1 )

uN=60

else if ( dbScanCode==SCANCODE_2 )

uN=40

else if ( dbScanCode==SCANCODE_3 )

uN=20

else if ( dbScanCode==SCANCODE_4 )

uN=10

else if ( dbScanCode==SCANCODE_5 )

uN=0

}

}

}

CloseCTR() //关显示器

exit(0)

}

void InitInterrupt(void)

{

// 设置中断控制寄存器

IVPD=0x80

IVPH=0x80

IER0=0x10

DBIER0 =0x10

IFR0=0xffff

asm(" BCLR INTM")

}

void interrupt Timer() //中断响含悉应函数

{

nCount++nCount%=100

if ( nCount>uN ) PCR2|=4

else PCR2&=0x0fffb

nCount1++nCount1%=5120

}

void InitMcBSP()

{

// IOPin: McBSP2.FSR S22

//SPCR1.RRST_=0,PCR.RIOEN=1,PCR.FSRM=1,PCR.FSRP=0/1

SPCR1_2&=0x0fffe

PCR2|=0x1400

// IOPin: McBSP1.CLKX S14

//SPCR2.XRST_=0,PCR.XIOEN=1,PCR.CLKXM=1,PCR.CLKXP=0/1

SPCR2_1&=0x0fffe

PCR1|=0x2200

}

void TIME_init(void)

{

tim0 = (unsigned int *)0x1000

prd0 = (unsigned int *)0x1001

tcr0 = (unsigned int *)0x1002

prsc0 = (unsigned int *)0x1003

*tcr0 = 0x04f0

*tim0 = 0

*prd0 = 0x0100

*prsc0 = 2

*tcr0 = 0x00e0

}

涉及到外设部分就得看具体的DSP型号了,查查数据手册吧。

1、时钟输入问题

时钟输入:对于280x系列的dsp的时钟选择有多种,包括:

晶体经过X1、X2输入:需要将CLKIN连接到参考地,否则在用FLASH运行程序的时候,将无法运行。;

外部时钟经过CLKIN引脚输入:允许时钟电压是3.3V。需要将X1引脚接到参考地。X2悬空。

外部时钟经过X1引脚输入。允许时钟电压是1.8V。需要将CLKIN连接到参考地,X2悬空。

2、PLL问题

PLL作为DSP的时钟重要组成部分,它除了提高系统内部SYSCLKOUT的频率之外,还有一个重要的用途就是监视外部时钟是不是很好的为DSP内部提供系统时钟。

如果系统让PLL处于使能状态,那么就能够监视PPLSTS寄存器中的MCLKSTS位的状态即可。如果MCLKSTS被置位。那么软件就要恰当陪型的措施保证系统不出现事故。这种措施包括使系陆陪统停机、使系统复位。

1、 对PLL *** 作需要注意的问题

需要采用正确的步骤来更新PLL控制寄存器。

当DSP工作在“limp mode”状态下,禁止写PLLCR。特别是在系统上电以后;也禁止进入HALT节电模式。

如果没有外部时钟。那么Watch将失去效能。

2、 各种工作模式下的时钟输入检测逻辑功能。

PLL被旁路状态:如果PLLCR=0,那么PLL就被旁路。如果OSCCLK检测到丢失,DSP自动切换到PLL,设置MCLKSTS。DSP运行在“limp mode”频率模式下。

PLL使能状态:除了PLLCR≠0以外,其他的芦悉猜监测模式及其结果同上。

标准低功耗模式:在这种模式下,连接到CPU的CLKIN被停止。如果检测到时钟消失,那么也是置位MCLKSTS,同时产生复位。如果工作于PLL旁路模式下,1/2的limp频率连接到cpu。

3、 XCLKOUT

主要是说:由于XCLKOUT随着RESET被激活而同时开始工作。所以可以用该引脚来检测和监视系统的SYSCLKOUT是否工作。或者说是否是预期的工作频率。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12331809.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存