单片机课程设计报告mc9s12xs128.docx
- 文档编号:9780349
- 上传时间:2023-05-21
- 格式:DOCX
- 页数:26
- 大小:357.06KB
单片机课程设计报告mc9s12xs128.docx
《单片机课程设计报告mc9s12xs128.docx》由会员分享,可在线阅读,更多相关《单片机课程设计报告mc9s12xs128.docx(26页珍藏版)》请在冰点文库上搜索。
单片机课程设计报告mc9s12xs128
单片机课程设计报告
题目:
对可调光LED灯发光强度进行控制
学院:
机电工程学院
班级:
自09A-1
姓名:
学号:
0910101011
指导教师:
1、设计任务:
1、单片机可选用飞思卡尔型。
2、按键及显示方案可采用CH451芯片或其他方案。
3、设计并制作可调光LED灯,并对发光强度进行控制。
二、设计方案:
硬件选择:
飞思卡尔MC9S12S128系类单片机,驱动模块,LED模块,CH4541模块;
工作原理:
通过调节PWM为1KHz至10KHzTTL方波,调节其占空比,从而调节电压,决定了发光强度。
MC9S12S128部分管脚图:
MC9S12S128主要系统参数:
S12XCPU,最高总线速度40MHz
64KB、128KB和256KB闪存选项,均带有错误校正功能(ECC)
带有ECC的、4KB至8KBDataFlash,用于实现数据或程序存储
配置8、10或12位模数转换器(ADC),转换时间3μs
支持控制区域网(CAN)、本地互联网(LIN)和串行外设接口(SPI)协议模块
带有16-位计数器的、8-通道定时器
出色的EMC,及运行和停止省电模式
1、由于MC9S12S128自带有AD以及PWM功能,所以对软件的要求交简单。
2、键盘输入采用CH451整体模块
3、通信端口为PA口,与中断端口
三、硬件结构:
CH451硬件电路结构
驱动模块设计
四、软件设计
4.1HCS12控制软件主要理论
智能车开发环境采用了飞思卡尔HCS12系列单片机开发软件CodeWarrior。
该软件具有支持多种语言、开发环境界面统一、交叉平台开发以及支持插件工具等特点。
在CodeWarrior界面完成编译后,通过BDMFORS12工具,在CodeWarrior环境下向MC9S12模块下载程序。
BDMFORS12工具使用简单,十分方便。
在整个系统设计中,用到了4个单片机基本功能模块:
时钟模块、PWM输出模块、AD转换模块、。
通过编写程序先对所用到的模块进行初始化,并通过对相应数据寄存器或状态寄存器的读写,实现期望的功能。
为实现所期望的功能所需芯片资源如表4.1所示。
表4.1系统所用到的芯片资源
AD模块
PAD
电阻调值
PWM模块
PWM01
PWM
IO端口模块
PA0
CH451
系统通过在主函数中循环调用CH451读写函数、计算、、控制PWM等功能子模块,对LED进行控制;程序执行前先对各个模块初始化,然后执行主函数的功能;初始化流程图如图10所示:
图10程序初始化流程图
4.2各模块设计
时钟初始化
PWM初始化
PWM的主要特点有:
1、它有8个独立的输出通道,并且通过编程可控制其输出波形的周期。
2、每一个输出通道都有一个精确的计数器。
3、每一个通道的PWM输出使能都可以由编程来控制。
4、PWM输出波形的翻转控制可以通过编程来实现。
5、周期和脉宽可以被双缓冲。
当通道关闭或PWM计数器为0时,改变周期和脉宽才起作用。
6、8字节或16字节的通道协议。
7、有4个时钟源可供选择(A、SA、B、SB),他们提供了一个宽范围的时钟频率。
8、通过编程可以实现希望的时钟周期。
9、具有遇到紧急情况关闭程序的功能。
10、每一个通道都可以通过编程实现左对齐输出还是居中对齐输出。
4.3.1设定单片机总线频率
时钟基本脉冲是CPU工作的基础。
MC9S12XS128微控制器的系统时钟信号,由时钟振荡电路或专用时序脉冲信号提供。
MCU内部的所有时钟信号都来源于EXTAL引脚,也为MUC与其他外接芯片之间的通信提供了可靠的同步时钟信号。
对于S12,可以利用寄存器SYNR、REFDV来改变晶振频率,从而产生由锁相环倍频后的时钟频率fPLLCLK,可以选用8MHz或16MHz外部晶体振荡器作外时钟。
在本车的设计中,外部晶体振荡器为16MHz,即fOSCCLK=16MHz。
而锁相环产生的时钟频率fPLLCLK=2*fOSCCLK*(SYNR+1)/(REFDV+1),设计中我们将SYNR设为4,REFDV设为1,故fPLLCLK=80MHz。
S12的总线时钟是整个MCU系统的定时基准和工作同步脉冲,其频率固定为晶体频率fPLLCLK的1/2。
故可以得到fPLLCLK/2=40MHz的总线频率,接近MC9S12XS128单片机的上限内部总线频率45MHz。
以下是总线频率子程序:
//-----------------------设置总线频率------------------------------
voidSET_PLL(){
CLKSEL=0X00;
SYNR=4;
REFDV=1;
PLLCTL=0x60;
while((CRGFLG&0x08)==0);//时钟校正同步
CLKSEL=0x80;//使用PLLCLK执行后busclock=pllclk/2
}
4.3.2PWM输出模块
MC9S12XS128集成了8路8位独立PWM通道,通过相应设置可变成4个16位PWM通道,每个通道都有专用的计数器,PWM输出极性和对齐方式可选择,8个通道分成两组,共有4个时钟源控制。
PWM0、PWM1、PWM4、PWM5为一组,使用时钟源ClockA和ClockSA;PWM2、PWM3、PWM6、PWM7构成另一组,使用时钟源ClockB和ClockSB。
ClockA和ClockB均是由总线时钟经过分频后得到,分频范围1~128,通过寄存器PWMPRCLK来设置,ClockSA和ClockSB是分别通过ClockA和ClockB进一步分频后得到的,分频范围为1~512,分别通过寄存器PWMSCLA和PWMSCLB来设置,计算公式为:
ClockSA=ClockA/(2*PWMSCLA)
ClockSB=ClockB/(2*PWMSCLB)
通过寄存器PWME来控制PWM0~PWM7的启动或关闭。
为了提高精度,我们将PWM0和PWM1,PWM2和PWM3,PWM4和PWM5级联,构成16位的PWM通道,级联时,2个通道的常数寄存器和计数器均连接成16位的寄存器,3个16位通道的输出分别使用通道1、3、5的输出引脚,时钟源分别由通道1、3、5的时钟选择控制位决定。
级联时,通道1、3、5的引脚变成PWM输出引脚,通道0、2、4的时钟选择没有意义。
通过寄存器PWMPRCLK、PWMSCLA、PWMSCLB、PWMCLK对各通道的时钟源进行设置。
PWM模块初始化过程如下:
************************************************/
voidpwm_init(void)
{
PWMPOL=0xff;//对应通道的极性,及联通到首先输出高电平
PWMCLK=0xff;//clocksa做时钟源
PWMPRCLK=0x00;//令时钟A为总线频
PWMCAE=0x00;//左对齐输出模式
PWMCTL=0xF0;//01,23,45,67级联
PWMSCLA=0x01;//clockSA=ClockA/(2*PWMSCLA)=20Mhz
PWMSCLB=0x01;//clockSB=ClockB/(2*PWMSCLB)=20Mh
PWMPER01=0xc8;//设定周期,周期是:
时钟源周期*(PWMPER)10khz
PWMDTY01=0x64;
PWME=0xFF;
}注:
开关PWM操作通过写PWME寄存器完成,如图11所示,开相应通道则相应Bit置1,关相应通道则相应Bit置0,那么开1,3,5通道,则PWME=0x2a。
4.3.4AD转换模块
AD转换模块由模拟量前端的8选1多路转换开关,采样缓冲器及放大器,逐次逼近式模拟量转换、控制部分及转换结果存储部分等组成。
AD转换所需要的时间周期是固定不变的,但采样时间和时钟频率可以通过寄存器ATDxCTL4(x为0或1)在一定范围内选择,其公式为:
ATDClock=BusClock*0.5/(PRS+1)
AD转换模块的初始化程序如下所示:
//---------------------AD初始化-------------------------------
voidAD_Init()
{
ATD0CTL1=0x00;//7:
1-外部触发,65:
00-8位精度,4:
放电,3210:
ch
ATD0CTL2=0x40;//AFFC=1,对结果寄存器的访问将自动清除转换完成标志位
ATD0CTL3=0x80;//右对齐无符号,4个ad通道采样,NoFIFO,Freeze模式下继续转
ATD0CTL4=0x01;//765:
采样时间为4个AD时钟周期,ATDClock=[BusClock*0.5]/[PRS+1]
ATD0CTL5=0x30;//6:
0特殊通道禁止,5:
1连续转换,4:
1多通道轮流采样
ATD0DIEN=0x00;//禁止数字输入
}
AD转换结果存放在寄存器ATD0DRxL,通过这些寄存器将结果传送到数组CAIJItable[],用来检测道路信息。
CH451:
算法
/functhion:
CH451INIT
************************************************/
voidch451_init(void){
DDRJ_DDRJ6=0;
DDRA=0x0f;//循环计数位
wr_ch451(0x0201);//ch451内部复位
wr_ch451(0x0402);//ch451键盘开启,显示关闭
wr_ch451(0x0507);//ch451工作在mode1,扫描极限为8,亮度占空比为7
}
4.4程序调试
S12系列微控制器具有一个由片内仿真、触发和跟踪硬件构成的单线背景调试模式(BDM),因此它可以通过使用两种开发工具:
简单串行电缆或低成本的BDM,来完成调试功能。
在本次比赛中,我们所采用的赛车软件开发工具为清华大学开发的专门面向于MotorolaS12系列微控制器的BDM调试工具以及由Metrowerk公司开发的CodeWarrior编译器。
CodeWarrior是面向以HC12和S12为CPU的单片机嵌入式应用开发的软件包,包括集成开发环境IDE、处理器专家库、全芯片仿真、可视化参数显示工具、项目工程管理器、C交叉编译器、汇编器、链接器以及调试器等。
在CodeWarrior软件中可以使用汇编语言或C语言,以及两种语言的混合编程。
用户可在新建工程时将芯片的类库添加到集成环境开发环境中,工程文件一旦生成就是一个最小系统,用户无需再进行繁琐的初始化操作,就能直接在工程中添加所需的程序代码。
如图13所示,利用BDM和CodeWarrior自带的hiwave.exe用户可以进行一系列的调试工作,如监视寄存器状态、修改PC指针、设置断点等,这样能快速的找到软件问题
图13Hiwave程序调试环境
4.4.2软件调试
在软件设计中,要用到ATD模块、PWM模块、电源模块等。
在编写主程序前,要先对各个模块分别进行调试,并编写各部分的子程序。
根据系统电路板的资源,本设计方案中,使用PAD00对电阻值进行AD转化,PWM0和PWM1口级联后控制PWM输出
调试ATD模块时,先使用BDM模块将子程序下载到芯片内,然后分别在ATD的输入端利用稳压源产生0-+5V的电压,观察CodeWarrior的Memory窗口中各个输入的电压值在误差允许范围内相等,说明该子程序正确。
为检验PWM模块子程序,可以编写输出一定占空比的PWM波形子程序,从PWM端口接入示波器,通过示波器观察输出波形是否与设定值相同,若相同则程序正确。
在每一部分子程序调试通过后,结合外围电路对所有子程序进行整合,根据LED工作原理,编写出完整的主程序。
在CodeWarrior界面完成程序编译后,通过BDM工具,将程序下载到MC9S12XS128微处理器中,然后进行PWM的调试。
五、设计收获与结果
通过多天的艰苦努力,实现所预想功能。
虽然说没有做到最好,但是通过大家的合作与努力,我们会做到更好。
比赛结果可能不能如愿以偿,但是我们在这几天中收获的是知识与经验。
程序代码:
#include
#include"derivative.h"/*derivative-specificdefinitions*/
#include"led.h"//headfileofprogram
#include
#pragmaLINK_INFODERIVATIVE"MC9S12XS128"
#defineDINPORTA_PA0
#defineDCLKPORTA_PA1
#defineDOUTPTIJ_PTIJ7
#defineLOADPORTA_PA3
ucharopen;
ucharset=0;
ucharAD_set;
ucharkeynum;
ucharled0_f[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uintch451_led[8]={0x0800,0x0900,0x0a00,0x0b00,0x0c00,0x0d00,0x0e00,0x0f00};
uinttwinkle=0x0680;
uintAD_wValue;
/*************************************/
voidmain(void){
/*putyourowncodehere*/
DisableInterrupts;
pll_set();
pwm_init();
ad_init();
ch451_init();
interrupt_init();
EnableInterrupts;//允许可屏蔽中断
for(;;){
while(!
ATD0STAT0_SCF);//等待转换结束
AD_wValue=ATD0DR0;
if(AD_set==1){
display();
delay(0xffff);
PIEJ_PIEJ7=1;
/***************************************************/
_FEED_COP();/*feedsthedog*/
}/*loopforever*/
/*pleasemakesurethatyouneverleavemain*/
}
/***********************************************
functhion:
IPLLCLKInit
************************************************/
voidpll_set(void){
CLKSEL=0X00;
PLLCTL=0xE1;
SYNR=0x04;//设置总线频率为(SYNR+1)*8MHz,即40MHz
REFDV=0x01;
PLLCTL=0x60;
asmNOP;;//空操作,进行简单的延时,等待锁相环的响应
asmNOP;
asmNOP;
while((CRGFLG&0x08)==0);//时钟校正同步
CLKSEL=0xA0;//使用PLLCLK
}
/************************************************/
voidinterrupt_init(void){
PIEJ_PIEJ7=1;
}
/***********************************************
functhion:
PWMINIT
************************************************/
voidpwm_init(void)
{
PWMPOL=0xff;//对应通道的极性,及联通到首先输出高电平
PWMCLK=0xff;//clocksa做时钟源
PWMPRCLK=0x00;//令时钟A为总线频
PWMCAE=0x00;//左对齐输出模式
PWMCTL=0xF0;//01,23,45,67级联
PWMSCLA=0x01;//clockSA=ClockA/(2*PWMSCLA)=20Mhz
PWMSCLB=0x01;//clockSB=ClockB/(2*PWMSCLB)=20Mh
PWMPER01=0xc8;//设定周期,周期是:
时钟源周期*(PWMPER)10khz
//PWMPER23=0x00c8;
//PWMPER45=0x00c8;//通道级联的周期,10khz
//PWMPER67=0x00c8;//通道级联的周期,10khz
PWMDTY01=0x64;
PWME=0xFF;
}
/***********************************************
functhion:
CH451INIT
************************************************/
voidch451_init(void){
DDRJ_DDRJ6=0;
DDRA=0x0f;//循环计数位
wr_ch451(0x0201);//ch451内部复位
wr_ch451(0x0402);//ch451键盘开启,显示关闭
wr_ch451(0x0507);//ch451工作在mode1,扫描极限为8,亮度占空比为7
}
/****************************************************
AD初始化
************************************************/
voidad_init(void)
{
ATD0CTL2=0xC0;//11000000启动清零,无等待模式,禁止外部触发,中断禁止
ATD0CTL3=0x00;//转换序列长度为8,NoFIFO,Freeze模式下继续转换
ATD0CTL4=0xB5;//时间为500<<2MHZ(时间不对)
//1(8位10位)01(采样时间选择)10101(PRS)8位精度,4个AD时钟,ATDClock=[BusClock*0.5]/[PRS+1]=1254704Hz;PRS=5,divider=32
ATD0CTL5=0x30;//0左对齐,0无符号,0单次转换,1多通道,000从0通道开始
ATD0DIEN=0x00;//禁止数字输入
}
/***********************************************
functhion:
writetoch451
************************************************/
voidwr_ch451(uintdata){
uchari;
DCLK=0;
LOAD=0;//清零,开始准备
for(i=0;i<12;i++){
if(data%2==1)DIN=1;//最后一位为1时,送1
elseDIN=0;//最后一位为0时,送0
DCLK=1;//DCLK的上升沿送数
asmnop;
asmnop;
DCLK=0;
data=data>>1;
}//循环将12位送往CH451
LOAD=1;
asmnop;
asmnop;
asmnop;//完成
}
/***********************************************
functhion:
getthekeynumber
************************************************/
ucharget_keynumber(void){
uchardata,i;
data=0;//键值初始为0
wr_ch451(0x0700);//开始获取键值
DCLK=1;
LOAD=0;
for(i=0;i<7;i++){//将七位键值循环获取
if(DOUT==1){
data=data<<1;
data+=1;
}
else{data=data<<1;}
DCLK=0;//获取下一个数
asmnop;
asmnop;
asmnop;
DCLK=1;
}
returndata;//返回值为键值
}
/***********************************************
functhion:
assingments
************************************************/
voiddis_assingments(uchardata){
switch(data){
case0x70:
turn_on();//键值70对应任务1:
开始功能
break;
case0x78:
turn_off();//键值78对应任务2:
关闭功能
break;
case0x50:
case0x47:
data_set();
break;
case0x40:
//turn_on();
up();
break;
case0x48:
down();
break;
case0x58:
AD_change();
break;
default:
break;
}
/***********************************************
case0x40:
turn_off;break;
case0x48:
up;break;
case0x49:
down;break;
case0x50:
left_move;break;
case0x51:
right_move;break;
case0x58:
data_set;break;
case0x59:
ok;break;
case0x50:
left_move;break;
}
**************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 课程设计 报告 mc9s12xs128