基带时钟信号发生模块

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基带时钟信号发生模块

根据题目要求,我们选用单片机MC9S12XS128 来产生基带的时钟信号,为了节约拨码开关,我们采用BCD码来编码1~10个按钮,分别表示10KHz~100KHz。

MC9S12XS128的PWM是指脉冲宽度调制,是利用其数字输出来对模拟电路进行非常有效的一种控制技术,在MC9S12XS128中,PWM主要是通过设置相关的寄存器,让PWM0~PWM7引脚输出一定周期一定占空比的矩形波,输出的矩形波的周期和占空比在输出的过程中,可以通过改变相关寄存器的值来改变。设置完相关的寄存器,就可以编写程序以实现方波的产生,单片机外围接上四个拨码开关并采用BCD编码来表示1~10,分别代表单片机产生的10KHz~100KHz,拨码开关接在PA0~PA3上即可。相关的程序清单详见附件。数据率由示波器测试,我们所使用的型号为UTD2102CED数字示波器能够显示精确到小数点后两位的数据,数据率测试如表6.2所示。

表6.2 数据率测试

预输出(KHz)102030405060708090100实测(KHz)10.0020.0030.0340.0050.0059.8869.9380.0090.10100.00误差(%)000.100-0.2-0.10-0.110

结果表明:由MC9S12XS128 的PWM 产生的时钟信号十分准确,精度很高,误差在允许的范围内且误差极小,时钟信号精度越高,最后显示的眼图也就越清晰。

程序清单

1 初始化程序

#include /* common defines and macros */

#include "derivative.h" /* derivative-specific definitions */

char key,i=0;

char Tab[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //共阳0~9

char code[4]={0xC0,0xC0,0xC0,0xC0};

...................初始化程序(PLL 锁相环).....................

void SetBusCLK_40M(void)

{

CLKSEL=0X00;

//不使能锁相环时钟 PLLCTL_PLLON=1;

//锁相环电路允许 SYNR =0xc0 | 0x04; //相当于SYNRJ=0xc4 REFDV=0x80 | 0x01; //相当于REFDV=0x81

POSTDIV=0x00; //pllclock=2*osc*(1+SYNR)/(1+REFDV)=80MHz; _asm(nop); //BUS CLOCK=40M

_asm(nop); //短暂延时,等待时钟频率稳定

while(!(CRGFLG_LOCK==1)); //时钟频率已稳定,锁相环频率锁定 CLKSEL_PLLSEL =1;

//使能锁相环时钟

}

...................PIT 初始化 定时10ms.....................

void PIT_init(void)

{

PITCFLMT=0X01; //PIT is disabled ,无等待模式

PITFLT=0X01; //PIT0强制加载

PITCE=0X01; //PIT0使能

PITMUX=0X0E; //通道0使用微定时基准0

PITINTE=0X01; //使能PIT0中断

PITTF=0X0F; //超时标志位清零

PITMTLD0=9; //微计数器0赋值9

PITLD0=39999; //PIT0加载计数器赋值,定时10ms

PITCFLMT_PITE = 1; // PIT 使能

}

ms us 10us 25.013999925

.0025.0)19(us 025.0M

401M 40=⨯+=⨯+=)(,总线周期为

...................PWM初始化.....................

void PWM_Init(void) //PWM初始化

{

PWME=0x00; //禁止PWM

PWMCTL=0x10; //通道0和通道1级联成一个16位PWM通道PWMCLK=0x00; //时钟来源选择pwm01 选择ClockA

PWMPRCLK=0x22; //ClockA=ClockB=BUS(40MHz)/4=10MHz PWMPOL=0xFF; //PWM0、1输出起始为高电平,PWM2、3输出

起始为高电平

PWMCAE=0x00; //01左对齐方式;2左对齐

}

...................IO口初始化.....................

void IO_Init(void)

{

DDRA=0xF0; //高四位为输出口,第四位为输入口

DDRB=0xFF; //初始化端口

}

..................延时程序延时1ms......................

void delayms(int ms)

{

int ii,jj;

if (ms<1) ms=1;

for(ii=0;ii

for(jj=0;jj<3338;jj++); //40MHz--1ms

}

................完成PWM模块初始化........................

void PWM(void)

{

switch(key)

{

/*case 0:

相关文档
最新文档