ImageVerifierCode 换一换
格式:DOCX , 页数:23 ,大小:356.11KB ,
资源ID:6955006      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6955006.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(基于单片机的对可调光LED灯发光强度进行控制.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

基于单片机的对可调光LED灯发光强度进行控制.docx

1、基于单片机的对可调光LED灯发光强度进行控制单片机课程设计报告题目:对可调光LED灯发光强度进行控制学院: 机电工程学院 班级: 自09A-1 姓名: 学号: 01 指导教师: 1、设计任务:1、单片机可选用飞思卡尔型。2、按键及显示方案可采用CH451芯片或其他方案。3、设计并制作可调光LED灯,并对发光强度进行控制。二、设计方案:硬件选择:飞思卡尔MC9S12S128系类单片机,驱动模块,LED 模块,CH4541模块;工作原理:通过调节PWM为1KHz至10KHz TTL方波,调节其占空比,从而调节电压,决定了发光强度。MC9S12S128部分管脚图:MC9S12S128主要系统参数:S

2、12X CPU, 最高总线速度 40MHz 64KB、128KB和256KB 闪存选项,均带有错误校正功能(ECC) 带有ECC的、4KB至8KB DataFlash,用于实现数据或程序存储 配置8 、10或12位模数转换器(ADC),转换时间3 s 支持控制区域网(CAN)、本地互联网(LIN)和串行外设接口(SPI)协 议模块 带有16-位计数器的、8-通道定时器 出色的EMC,及运行和停止省电模式1、由于MC9S12S128自带有AD以及PWM 功能,所以对软件的要求交简单。2、键盘输入采用CH451整体模块3、通信端口为PA口,与中断端口三、硬件结构:CH451硬件电路结构驱动模块设计

3、四、软件设计 HCS12控制软件主要理论 智能车开发环境采用了飞思卡尔HCS12系列单片机开发软件CodeWarrior。该软件具有支持多种语言、开发环境界面统一、交叉平台开发以及支持插件工具等特点。在CodeWarrior界面完成编译后,通过BDM FOR S12工具,在CodeWarrior环境下向MC9S12模块下载程序。BDM FOR S12工具使用简单,十分方便。在整个系统设计中,用到了4个单片机基本功能模块:时钟模块、PWM输出模块、AD转换模块、。通过编写程序先对所用到的模块进行初始化,并通过对相应数据寄存器或状态寄存器的读写,实现期望的功能。为实现所期望的功能所需芯片资源如表所

4、示。表 系统所用到的芯片资源AD模块 PAD电阻调值PWM 模块 PWM01 PWMIO 端口模块 PA0 CH451 系统通过在主函数中循环调用CH451读写函数、计算、控制PWM等功能子模块,对LED进行控制;程序执行前先对各个模块初始化,然后执行主函数的功能;初始化流程图如图10所示:图10 程序初始化流程图 各模块设计时钟初始化PWM初始化PWM 的主要特点有: 1、它有 8 个独立的输出通道,并且通过编程可控制其输出波形的周期。 2、每一个输出通道都有一个精确的计数器。 3、每一个通道的 PWM 输出使能都可以由编程来控制。 4、PWM 输出波形的翻转控制可以通过编程来实现。 5、周

5、期和脉宽可以被双缓冲。当通道关闭或 PWM 计数器为 0 时,改变周期和脉宽才起作用。 6、8 字节或 16 字节的通道协议。 7、有 4 个时钟源可供选择(A、SA、B、SB) ,他们提供了一个宽范围的时 钟频率。 8、通过编程可以实现希望的时钟周期。 9、具有遇到紧急情况关闭程序的功能。 10、每一个通道都可以通过编程实现左对齐输出还是居中对齐输出。 设定单片机总线频率时钟基本脉冲是CPU工作的基础。MC9S12XS128微控制器的系统时钟信号,由时钟振荡电路或专用时序脉冲信号提供。MCU内部的所有时钟信号都来源于EXTAL引脚,也为MUC与其他外接芯片之间的通信提供了可靠的同步时钟信号。

6、 对于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单片机的上

7、限内部总线频率45MHz。以下是总线频率子程序:/-设置总线频率- void SET_PLL() CLKSEL=0X00; SYNR=4; REFDV=1; PLLCTL=0x60; while (CRGFLG&0x08)=0); /时钟校正同步 CLKSEL=0x80;/使用PLLCLK 执行后busclock=pllclk/2 PWM输出模块 MC9S12XS128集成了8路8位独立PWM通道,通过相应设置可变成4个16位PWM通道,每个通道都有专用的计数器,PWM输出极性和对齐方式可选择,8个通道分成两组,共有4个时钟源控制。PWM0、PWM1、PWM4、PWM5为一组,使用时钟源Clo

8、ckA和ClockSA;PWM2、PWM3、PWM6、PWM7构成另一组,使用时钟源ClockB和ClockSB。ClockA和ClockB均是由总线时钟经过分频后得到,分频范围1128,通过寄存器PWMPRCLK来设置,ClockSA和ClockSB是分别通过ClockA和ClockB进一步分频后得到的,分频范围为1512,分别通过寄存器PWMSCLA和PWMSCLB来设置,计算公式为: ClockSA=ClockA/(2*PWMSCLA) ClockSB=ClockB/(2*PWMSCLB) 通过寄存器PWME来控制PWM0PWM7的启动或关闭。 为了提高精度,我们将PWM0和PWM1,P

9、WM2和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模块初始化过程如下:*/void pwm_init(void) PWMPOL=0xff; /对应通道的极性,及联通到首先输出高电平 PWMCLK=0xff; /clock sa做时钟

10、源 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置

11、0,那么开1,3,5通道,则PWME=0x2a。 AD转换模块 AD转换模块由模拟量前端的8选1多路转换开关,采样缓冲器及放大器,逐次逼近式模拟量转换、控制部分及转换结果存储部分等组成。 AD转换所需要的时间周期是固定不变的,但采样时间和时钟频率可以通过寄存器ATDxCTL4(x为0或1)在一定范围内选择,其公式为: ATDClock=BusClock*(PRS+1) AD转换模块的初始化程序如下所示:/-AD初始化- void AD_Init() ATD0CTL1=0x00; /7:1-外部触发,65:00-8位精度,4:放电,3210:ch ATD0CTL2=0x40; /AFFC=1,对

12、结果寄存器的访问将自动清除转换完成标志位 ATD0CTL3=0x80; /右对齐无符号,4个ad通道采样, No FIFO, Freeze模式下继续转 ATD0CTL4=0x01; /765:采样时间为4个AD时钟周期,ATDClock=BusClock*/PRS+1 ATD0CTL5=0x30; /6:0特殊通道禁止,5:1连续转换 ,4:1多通道轮流采样 ATD0DIEN=0x00; /禁止数字输入 AD转换结果存放在寄存器ATD0DRxL,通过这些寄存器将结果传送到数组CAIJItable ,用来检测道路信息。CH451:算法/functhion:CH451 INIT*/void ch4

13、51_init(void) DDRJ_DDRJ6=0; DDRA=0x0f; /循环计数位 wr_ch451(0x0201); /ch451内部复位 wr_ch451(0x0402); /ch451键盘开启,显示关闭 wr_ch451(0x0507); /ch451工作在mode1,扫描极限为8,亮度占空比为7 程序调试S12系列微控制器具有一个由片内仿真、触发和跟踪硬件构成的单线背景调试模式(BDM),因此它可以通过使用两种开发工具:简单串行电缆或低成本的BDM,来完成调试功能。在本次比赛中,我们所采用的赛车软件开发工具为清华大学开发的专门面向于Motorola S12系列微控制器的BDM调

14、试工具以及由Metrowerk公司开发的CodeWarrior编译器。Code Warrior是面向以HC12和S12为CPU的单片机嵌入式应用开发的软件包,包括集成开发环境IDE、处理器专家库、全芯片仿真、可视化参数显示工具、项目工程管理器、C交叉编译器、汇编器、链接器以及调试器等。在CodeWarrior软件中可以使用汇编语言或C语言,以及两种语言的混合编程。 用户可在新建工程时将芯片的类库添加到集成环境开发环境中,工程文件一旦生成就是一个最小系统,用户无需再进行繁琐的初始化操作,就能直接在工程中添加所需的程序代码。 如图13 所示,利用BDM和CodeWarrior自带的用户可以进行一系

15、列的调试工作,如监视寄存器状态、修改PC指针、设置断点等,这样能快速的找到软件问题 图13 Hiwave 程序调试环境软件调试 在软件设计中,要用到 ATD 模块、PWM 模块、电源模块等。在编写主程序前,要先对各个模块分别进行调试,并编写各部分的子程序。根据系统电路板的资源,本设计方案中,使用PAD00对电阻值进行AD转化,PWM0和PWM1口级联后控制PWM输出调试ATD模块时,先使用BDM模块将子程序下载到芯片内,然后分别在ATD的输入端利用稳压源产生0-+5V的电压,观察CodeWarrior 的Memory窗口中各个输入的电压值在误差允许范围内相等,说明该子程序正确。为检验PWM模块

16、子程序,可以编写输出一定占空比的 PWM 波形子程序,从PWM端口接入示波器,通过示波器观察输出波形是否与设定值相同,若相同则程序正确。在每一部分子程序调试通过后,结合外围电路对所有子程序进行整合,根据LED工作原理,编写出完整的主程序。在CodeWarrior 界面完成程序编译后,通过BDM工具,将程序下载到MC9S12XS128微处理器中,然后进行PWM的调试。五、设计收获与结果通过多天的艰苦努力,实现所预想功能。虽然说没有做到最好,但是通过大家的合作与努力,我们会做到更好。比赛结果可能不能如愿以偿,但是我们在这几天中收获的是知识与经验。程序代码:#include /* common de

17、fines and macros */#include /* derivative-specific definitions */#include /head file of program#include#pragma LINK_INFO DERIVATIVE MC9S12XS128#define DIN PORTA_PA0#define DCLK PORTA_PA1#define DOUT PTIJ_PTIJ7#define LOAD PORTA_PA3uchar open;uchar set=0;uchar AD_set; uchar keynum;uchar led0_f16=0x3f

18、,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;uint ch451_led8=0x0800,0x0900,0x0a00,0x0b00,0x0c00,0x0d00,0x0e00,0x0f00;uint twinkle=0x0680;uint AD_wValue;/*/void main(void) /* put your own code here */ DisableInterrupts; pll_set(); pwm_init(); ad_init(); ch451_init(); in

19、terrupt_init(); EnableInterrupts; /允许可屏蔽中断 for(;) while(!ATD0STAT0_SCF); / 等待转换结束 AD_wValue=ATD0DR0; if(AD_set=1) display(); delay(0xffff); PIEJ_PIEJ7=1; /*/ _FEED_COP(); /* feeds the dog */ /* loop forever */ /* please make sure that you never leave main */*functhion:IPLLCLK Init*/void pll_set(void

20、) CLKSEL=0X00; PLLCTL=0xE1; SYNR=0x04; /设置总线频率为(SYNR+1)*8MHz,即40MHz REFDV=0x01; PLLCTL=0x60; asm NOP; ;/空操作,进行简单的延时,等待锁相环的响应 asm NOP; asm NOP; while (CRGFLG&0x08)=0); /时钟校正同步 CLKSEL=0xA0;/使用PLLCLK/*/void interrupt_init(void) PIEJ_PIEJ7=1;/*functhion:PWM INIT*/void pwm_init(void) PWMPOL=0xff; /对应通道的极

21、性,及联通到首先输出高电平 PWMCLK=0xff; /clock sa做时钟源 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; /通道级联的

22、周期,10khz / PWMPER67=0x00c8; /通道级联的周期,10khz PWMDTY01=0x64; PWME=0xFF; /*functhion:CH451 INIT*/void ch451_init(void) DDRJ_DDRJ6=0; DDRA=0x0f; /循环计数位 wr_ch451(0x0201); /ch451内部复位 wr_ch451(0x0402); /ch451键盘开启,显示关闭 wr_ch451(0x0507); /ch451工作在mode1,扫描极限为8,亮度占空比为7/*AD 初始化 */ void ad_init(void) ATD0CTL2=0xC

23、0; / 11 0 000 00 启动清零, 无等待模式, 禁止外部触发, 中断禁止 ATD0CTL3=0x00; / 转换序列长度为 8, No FIFO, Freeze模式下继续转换 ATD0CTL4=0xB5; /时间为500 2MHZ (时间不对) / 1(8位10位) 01(采样时间选择) 10101(PRS)8 位精度, 4个AD时钟, ATDClock=BusClock*/PRS+1=1254704Hz;PRS=5,divider=32 ATD0CTL5=0x30; / 0左对齐,0无符号,0单次转换 ,1多通道,000从0通道开始 ATD0DIEN=0x00; / 禁止数字输入

24、 /*functhion:write to ch451*/void wr_ch451(uint data) uchar i; DCLK=0; LOAD=0; /清零,开始准备 for(i=0;i1; /循环将12位送往CH451 LOAD=1; asm nop; asm nop; asm nop; /完成/*functhion:get the keynumber*/uchar get_keynumber(void) uchar data,i; data=0; /键值初始为0 wr_ch451(0x0700); /开始获取键值 DCLK=1; LOAD=0; for(i=0;i7;i+) /将七

25、位键值循环获取 if(DOUT=1) data=data1; data+=1; else data=data1; DCLK=0; /获取下一个数 asm nop; asm nop; asm nop; DCLK=1; return data; /返回值为键值/*functhion:assingments*/void dis_assingments(uchar data) switch (data) case 0x70: turn_on(); /键值70对应任务1:开始功能 break; case 0x78: turn_off(); /键值78对应任务2:关闭功能 break; case 0x50

26、: case 0x47: data_set(); break; case 0x40: / turn_on(); up(); break; case 0x48: down(); break; case 0x58: AD_change(); break; default:break; /* case 0x40:turn_off;break; case 0x48:up;break; case 0x49:down;break; case 0x50:left_move;break; case 0x51:right_move;break; case 0x58:data_set;break; case 0x59:ok;break; case 0x50: left_move; break; */*functhion:

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1