您好,欢迎来到世旅网。
搜索
您的当前位置:首页苏州大学实验报告-输出比较和脉宽调制(PWM)实验

苏州大学实验报告-输出比较和脉宽调制(PWM)实验

来源:世旅网
.

苏州大学实验报告

院、系 年级专业 姓名 学号 课程名称 成绩 指导教师 同组实验者 实验日期

实验名称: 输出比较和脉宽调制(PWM)实验

一.实验目的

通过该实验实习,进一步熟悉MT-IDE嵌入式开发系统环境、汇编和C语言以及调试方式;理解

定时器模块的输出比较功能;理解脉宽调制的相关概念和基本原理;初步了解如何用定时器通道实现脉宽调制;理解课本中的程序代码。

二.实验内容

编制一个产生脉宽调制波的程序。要求该脉宽调制波的周期为10ms,脉宽值初始化为0,然后以一秒为间隔递增脉宽值0x20,当脉宽值到达0x0180后开始以相同的时间间隔相同的值递减脉宽,当脉宽值递减到0x0000后再递增,如此循环往复。同时要求该PWM波从定时

器1通道0输出到一指示灯上以显示结果,并使得小灯亮度与脉宽值大小相一致。 三.实验过程 (一)原理图

16位预置寄存器 定时器溢出翻转电平 16位比较器 计数时钟 16位计数寄存器 驱动门 PWM输出 16位比较器 输出比较符合输出 16位通道寄存器 图1 PWM模块框图

(二)基本原理

定时器的每一个通道都可以设置为在溢出时自动翻转电平,利用这一特性,定时器通道可以实现PWM。预置计数寄存器的值将决定脉宽调制波的周期。当计数寄存器的计数达到预置寄存器的值时,该通道的输出将自动翻转。所以两次溢出之间的时间就是PWM的周期。占空比由通道寄存器的值决定。因为在发生输出比较时,输出电平将根据每一个通道的控制状态寄存器的ELSxA位、ELSxB位的设置而发生。这样在一次时钟溢出的周期内输出电平将发生两次翻转,发生输出比较到发生时钟溢出之间的时间就是脉宽调制波的占空比。

第1页

.

四.编程 (一)流程图

复位 开始 sectmp!=sec 头文件 和声明 根据flag设置脉宽,更新sectmp MCU、PWM初始化 flag==0 开放总中断、变量初始化 duty<0x0020 duty>0x0160 flag=1 flag=1 1 ? 结束 图2 PWM流程图

延时一秒,sec++

(二)所用寄存器名称及其所用的位

T1状态和控制寄存器(T1 Status and Control Register,T1SC)

数据位 定义 复位 D7 D6 D5 D4 D3 D2 D1 D0 TOF TOIE TSTOP TRST x PS2 PS1 PS0 0 0 1 0 0 0 0 0 T1 通道0状态和控制寄存器(T1 Channel0 Status and Control Register,T1SC)

数据位 定义 复位 D7 D6 D5 D4 D3 D2 D1 D0 CH0F CH0IE MS0B MS0A ELS0B ELS0A TOV0 CH0MAX 1 1 1 1 1 1 1 1 T1通道寄存器(T1 Channel Register)

T2状态和控制寄存器(T2 Status and Control Register,T2SC)

数据位 定义 复位 D7 D6 D5 D4 D3 D2 D1 D0 TOF TOIE TSTOP TRST x PS2 PS1 PS0 0 0 1 0 0 0 0 0 T2计数寄存器(T2 Counter Register,T2CNTH、T2CNTL)

第2页

.

T2预置寄存器 (T2 Counter Modulo Register,T2MODH、T2MODL)

(三)主要代码段

1.汇编方式: PWM主程序部分代码 …… MainInit:: //复位后从此处执行(见Vectors08.s文件末尾处) SEI //关总中断 //1.堆栈初始化为RAM最高端 LDHX #RAMEndAddr //HX=#RAMEndAddr TXS //HX->SP //2.系统初始化 JSR MCUInit //初学时跳过此处 //3.PWM初始化 LDHX #$0181 //考虑边界问题,正好相等电压不对,所以$180+1 JSR PWMInit BCLR #TSTOPBit,T1SC //4.小灯初始化 LDA #%11111111 STA DDRA STA PTA CLI //开放总中断 //变量初始化 CLR Sec CLR Duty CLR Duty+1 //STHX Duty //程序总循环入口 MainLoop: //递增 LDHX Duty JSR PWMDuty CPHX #$0160 BHI MainLoop_1 CPHX #$0020 BLO MainLoop_2 BRA MainLoop_3 MainLoop_1: LDA #1 STA Sec BRA MainLoop_3 MainLoop_2: LDA #0 STA Sec MainLoop_3: LDHX #5000 JSR Delay_ms //延时1秒钟 BRA MainLoop ……

2.C语言方式: PWM主程序部分代码 第3页

.

…… void main() { INT16U duty,i; //脉宽 INT8U flag,sectmp,sec; //标记增减、计时 DisMCUInt(); //禁止总中断 MCUInit(); //芯片初始化 PWMInit(0x0181); //PWM初始化,周期10ms考虑边界问//题,正好相等电压不对,所以$180+1 EnMCUInt(); //开放总中断 //变量初始化 duty = 0; flag = 0; sec = 0; sectmp=0; //主循环 while(1) { if(sectmp!=sec) { duty=PWMDuty(duty,flag); sectmp=sec; } //递增 if(flag == 0) { if(duty > 0x0160) flag = 1; } else //递减 { if(duty < 0x0020) flag = 0; } for(i=0;i<2500;i++) //延时1秒钟 Delay1000(); sec++; } }

五.实验问答(根据实验指导书所列举的问题)

(一)在该实验中,产生PWM波和进行计时是否可以使用同一个定时器,为什么?

不可以。因为产生PWM波对预置寄存器初始化赋值为0x0180,而计时对预置寄存器 初始化赋值为0x9600,这是相互矛盾的。

(二)用万用表在PWM的输出端观察电压有什么现象?为什么?

电压先变小后变大,如此循环。因为通道寄存器的值从0以0x20的步长增加至0x0180, 然后从0x0180以0x20的步长减少至0,PWM波的占空比由0%逐步增至100%,然后又减至 0%,PWM波的平均电压也随之变小后变大。

(三)不带缓冲和带缓冲的PWM有什么差异性?

不带缓冲PWM如果需要更改脉宽,就需要改写定时器通道寄存器。如果重新写入的时机不恰当。将导致脉宽调制输出一到两个周期不正常。而带缓冲的脉宽调制则由于写入的脉宽值在下一个周期才有效,所以可以避免不带缓冲的带来的问题。

第4页

.

(四)思考如何用定时器的PWM功能设计D/A转换?

由于通道寄存器中的预置数据能控制脉冲宽度,而将不同占空比的脉冲信号通过滤波平

滑后可转换成相应的直流电平。这样就达到了数字到模拟电压输出的转换目的。

(五)数据进栈,相当复制还是相当剪切一个数据在栈中呢?

数据进栈,相当复制该数据在栈中。

(六)PWM编程注意通道寄存器与预置寄存器数据不要有什么关系,否则不能得到预想的结果?

PWM编程注意通道寄存器与预置寄存器数据不要相等,否则不能得到输出电压不能逐步减少或者

逐步增加,这样就不是预想的结果。 六.实验小结

通过该实验,初步了解了如何用定时器通道实现PWM波的输出。复习了定时溢出中断。并了解了PWM的相关概念。

第5页

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- esig.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务