基带时钟信号发生模块
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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
#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: