我们做了一个 PWM 波的实验 ,
原理及流图和时序及程序 为 : 原理为 :
利用输出模式的翻转特性和连续模式的 PWM
波形输出,通过 CCR0 加数据存储器 RAM 的中相互交叉“ 0 ”电平和“ 1
”的时间间隔,成对的两个寄存器定义了占空比 ,
而各对的和
(小周期)是定值。当计数器的计数值到达 CCR0
翻转,且产生中断,转入中断程序,在中断 程序中,我们给 CCR0
加上下次翻转的时间,即下次翻转时的计数长度从数据存储器中取出加 到上次翻转时刻的计数值中,当返回中断后,计数器继续计数,到下次翻转和中断时,又循环
继续进行。这样,就输出了占空比不断变化而又呈一种趋势的变化,经过低通滤波,即电容的
充放电形成一种阶梯状的变化趋势,当计数小周期很小时,就可以得到近似的一条模拟曲线,
从而实现了数模转换或函数发生器,由于小周期是任意的但必须大于 2
倍中断程序时间,则可
以实现任意占空比的小周期和任意的小周期长度,又由于有多少个小周期组成一个大周期也是
自由的,完全由实际需要来定,则给用户带来了很大的灵活性。下面是程序流图,由于这个
程
序实验要用到对数据段表的读操作和间接寻址且用到中断向量,因此在此列出了程序的全部清
单,以更完整:流程图为: 计数到定时值
定义对应的端口功能为外围模块 初始化和写翻转表数据 翻转并 中断 西安邮电学院 63# 710061 陈小忠 11
中断程序中,停计数,加下一个翻转时刻值,小周期数减一,如果小周 期数已到一个大周期,又返回到第一个小周期循环 PWM测试
========================================第12页========================================
MSP430
单片机的开发及应用
又从原计数值重新开始计数,中断返回,循环执行 程序清单为:
#include \RSEG UDATA0
DW 450,50,350,150,250,250,150,350,50,450/* 间隔数据表,开始地址为 200 H
,数据又需要定 */
RSEG CSTACK DS 0 RSEG CODE DS 0
Rese MOV #SFE(CSTACK),SP /* 初始化堆栈指针 */
MOV #(WDTHOLD+WDTPW),&WDTCTL /* 停看门狗定时器 */
MOV.B #0FFh,&P1SEL /* 选择外部定时器功能 */
MOV.B #0FFH,&P1DIR /* 确定方向为输出 */
MOV #030H,&CCR0 /* 给 CCR0
一个初始值,不小于两个指令周 期的计数值 */
BIS #GIE,SR /* 开一般中断允许位 */
MOV #0200H,R6 /* 将 R6
定义到数据表段开始地址 */
MOV #10,R4 /* 取 10
个地址单元,即九个小周期 */
MOV #0090H,&CCTL0 /* 选 CCR0
作为比较寄存器,定义输出模式为 4 ,且中断允许
*/
MOV #002E0H,&TACTL /* 写控制寄存器,参数为一分频,比较模式,连续计数方式,不溢出中
断,开始计数 */ TA0 EINT /* 开中断 */ JMP TA0 /*
等待翻转时刻到和等待中断到,即 TAR=CCR0*/
CMPS BIC #0FFCFH,&TACTL /* 中断程序到,停计数值,处理中断 */ ADD 0(R6),&CCR0 /* 加下一