第6章PWM波形发生器PWM波形的产生.docx
《第6章PWM波形发生器PWM波形的产生.docx》由会员分享,可在线阅读,更多相关《第6章PWM波形发生器PWM波形的产生.docx(23页珍藏版)》请在冰豆网上搜索。
第6章PWM波形发生器PWM波形的产生
第6章PWM波形的产生
6.1PWM波形发生器
6.1.1采用事件管理器模块中的通用定时器产生PWM波形
1.硬件连接图
+3.3V
29
2S
匹
我波
PWMI戟波
186
129
RS
DIJU
111*,
42丽
PIMS320LF2407A
IMS320LF2407A
XTAI.IOJCIK'llPUrM/r]CMJ5/IOPB4XTAL2[■2f:
WM/]X,MI7K)PH5
4]
蛋
76
匝
125
L4(J
图6.1利用通用定时器产生
PWM波形的硬件连接图
2.
工作原理
图6.2非对称PWM波形的产生
定时器的值
Tx^'v-'-'/Tx匚FP
低电平有效
高电平有效
定时周期
无效有效无效无效有效
-无效丄有效丄无效—无效匚有效
图6.3对称PWM波形的产生
6.1.2采用事件管理器模块中的比较单元产生PWM波形
1.硬件连接图
-3JiV
UL
具输出卞细常死肚控制向卩液
2.工作原理
—22
42
67
j1—
L16
133
*nonJI?
n打沖
"ijratF唤%、
XTALirLKIN
PWM7/IOPEIXTAL2PWM8/IOPE2PWM9/IOPE3PWMIO/IOPF4
PWM11/IOPE5卩WMI2/1OPE6
TMS320LF2407A
图6.4利用比较单元产生PWM波形的硬件连接图
1
1
S5(
1
128
3
41
66
76
95
125
140
117
123
124
lOpF
S
定时器周期
高电平有效
定时器的值
TxPmx二叶
低电平有效
图6.5带死区控制的非对称PWM波形的产生
定时器周期
r
高电平有效
图6.6带死区控制的对称PWM波形的产生
6.2PWM波形
6.2.1PWM控制技术
Uryr电■路
W
图6.7三相桥式PWM型逆变电路
622SPWM算法
2
I
2
7
j
u
6.3TMS320LF2407事件管理器模块的通用定时器与比较单元
6.3.1TMS320LF2407事件管理器模块的组成
6.3.2TMS320LF2407事件管理器模块的通用定时器
1.通用定时器的工作原理
2.通用定时器寄存器
(1)单个通用定时器控制寄存器TxCON(x=1,2或3,4)
(2)通用定时器控制寄存器(GPTCONA/B)
3.通用定时器的计数操作
(1)停止/保持模式
(2)连续增计数模式
(3)定向增/减计数模式
(4)连续增/减计数模式
4.通用定时器的中断实现
(1)所需的复位和中断向量定义文件“vectors.asm”
.ref
nothing
;直接返回的中断服务程序符号
.ref
c
int0
;复位向量符号
.sect
a
.vectors”
reset:
B
_c_int0
int1:
B
_nothing
int2:
B
_T1INT
int3:
B
_nothing
int4:
B
_nothing
int5:
B
_nothing
int6:
B
_nothing
(2)主程序
//该程序利用了定时器1的周期中断功能,每1ms产生一次中断
#include"register.h"//屏蔽中断程序voidinlinedisable(){
asm("setcINTM");}
//开全局中断程序voidinlineenable()
{
asm("clrcINTM");
}//系统初始化子程序
initial()
{
asm("setcSXM");asm("clrcOVM");asm("clrcCNF");
//符号位扩展有效//累加器中结果正常溢出//B0被配置为数据存储空间
*SCSR1=0x81FE;
*WDCR=0x0E8;
//CLKIN=6MHz,CLKOUT=4*CLKIN=24MHz
//不使能看门狗,因为SCSR2中的WDOVERRIDE
//即WD保护位复位后的缺省值为1,故可以用软件禁止看门狗
*IMR=0x0002;
*IFR=0x0FFFF;
//允许INT2中断
//清除全部中断标志,
"写1清0"
WSGR=0x00;
//禁止所有的等待状态
//定时器1的初始化子程序inttimer1int()
{
*EVAIMRA=*EVAIMRA|0x0080;//允许定时器1的周期中断
*EVAIFRA=*EVAIFRA&0x0080;//清除定时器1周期中断标志
*T1CON=0x160C;
*T1PER=0x0177;
//连续增计数模式,预分频值为64,使用内部时钟
//周期寄存器的值根据1ms延时和预分频值确定
*T1CNT=0x00;
//计数器清零
}
//定时器1周期中断服务程序
voidinterruptT1INT()
{
intflag;//定义一个局部变量flag=*EVAIFRA&0x0080;
if(flag!
=0x0080)
{
enable();return;
}
//允许全局中断
//如果不是定时器1周期中断,则直接返回
//若是定时器1周期中断定时器1的周期中断,则执行下面的程序
*T1CNT=0x00;
//定时器1的计数器重新赋0
*EVAIFRA=*EVAIFRA&0x0080;
enable();return;
}
//清除定时器1周期中断标志,否则以后的中断将被忽略
//允许全局中断,因为进了中断服务程序后全局中断会自动关闭//中断返回
//其它优先级的中断服务程序,虽然程序中已经禁止,但可能由于干扰
//会引起他们的执行,故该中断服务程序无额外操作,直接返回
voidinterruptnothing()
{enable();return;
}
//主程序
//允许全局中断,因一进中断服务程序后全局中断就自动关闭
//中断返回
main()
{
disable();initial();
timer1int();enable();
//初始化时禁止中断//系统初始化//定时器1的初始化//允许全局中断
*T1CON=*T1CON|0x0040;//启动Timer1while
(1)
{
}
}
//等待中断发生
6.3.3TMS320LF2407
事件管理器模块的比较单元
1.比较单元的的结构和工作原理
图6.12EVA比较单元结构框图
2.比较单元的寄存器
(1)比较控制寄存器A(COMCONA)
(2)比较控制寄存器B(COMCONB)
⑶比较方式控制寄存器A(ACTRA)
⑷比较方式控制寄存器B(ACTRB)
(5)死区控制寄存器A(DBTCONA)
(6)死区控制寄存器DBTCONB
3.用比较单元实现PWM
6.4
中断系统概述
中断响应过程
TMS320LF240X中断系统
6.4.1TMS320LF240X
6.4.2TMS320LF240X
1.中断的管理
2.
图6.19外设中断扩展模块图
3.中断向量
4.假(phantorn)中断向量
5.不可屏蔽中断(NMI)
6.可屏蔽中断的产生
7.
可屏蔽中断响应的流程
图6.20CPU响应外设中断的流程图
643TMS320LF240X
中断寄存器
1.CPU中断寄存器
(1)中断标志寄存器IFR
⑵CPU中断屏蔽寄存器(IMR)
2.外设中断寄存器
(1)
外设中断向量寄存器(
PIVR)
(2)
外设中断请求寄存器
0(PIRQR0)
(3)
外设中断请求寄存器
1(PIRQR1)
(4)
外设中断请求寄存器
2(PIRQR2)
(5)
外设中断应答寄存器
0(PIACKR0
(6)
外设中断应答寄存器
1(PIACKR1
(7)
外设中断应答寄存器
2(PIACKR2
)
)
外部中断控制寄存器
3.
6.5用C语言处理DSP中断
6.5.1通过软件识别中断标志的方法实现可屏蔽的中断
voidinterruptCAP4INT()
{
intflag;
flag=*EVBIFRC&0x01;//判断是否是CAP4INT
if(flag!
=0x01)
{
asm(“clrcINTM”);
return;
}
//如果是CAP4INT,则执行相应的中断服务程序
*EVBIFRC=*EVBIFRC*0xfe;//写“0”以清除CAP4INT中断标志
asm(“clrcINTM”);
return;
}
6.5.2通过外围中断向量寄存器PIVR的值实现可屏蔽的中断
voidinterruptGISR4()
{
switch(*PIVR)
{
case0x0036:
break;default:
break;
}
*EVBIFRC=*EVBIFRC*0xfe;asm(“clrcINTM”);
return;
//如果是中断CAP4INT,则执行相应的中断服务程序
//如果不是中断CAP4INT,则直接返回
//写“0”以清除CAP4INT中断标志//中断返回前开中断
//中断返回
6.6
1.所需的复位和中断向量定义文件“vectors.asm”
//该文件利用汇编语言代码定义了复位和中断向量
.ref_nothing;直接返回的中断服务程序符号
.ref_c_int0;复位向量符号
.sect".vectors"reset:
b_c_int0
int0:
b_nothing
int1:
b_nothing
int2:
b_T1CINT
;当发生INT2中断时,程序跳转至“T1CINT”所标志的中断服务程序int3:
b_nothing
PWM波形发生器程序
6.7
int4:
b
_nothing
int5:
b
_nothing
int6:
b
_nothing
2.
主程序
Pwm1.c
*EVAIFRC=*EVAIFRC|0xFFFF;
//位12~11=01,选择连续增/减计数模式
//位10~8=100,选择输入时钟预定标系数=16
//位6=0,禁止定时器的操作
//位5~4=00,选择内部CPU时钟
//位3~2=01,定时器比较寄存器的重装载条件:
当计数值是0
//或等于周期寄存器值时重装载
//位1=1,使能定时器的比较操作
//该中断服务程序主要是为了防止干扰,不做任何其它操作voidinterruptnothing()
{
return;//中断直接返回
}
voidinterruptT1CINT()
{
intflag;
flag=*EVAIFRA&0x0100;//判断是否是T1CINTif(flag!
=0x0100)
{
asm(“clrcINTM”);
return;
}
//如果是T1CINT,则执行相应的中断服务程序
*T1PR=input_carrier;//修改PWM波的载波周期,并存入T1PR*T1CMPR=input_pwm;//修改PWM波的有效脉宽周期,并存入T1CMPRasm(“clrcINTM”);
return;
}
//主程序
6.6.2基于通用定时器的PWM波形发生器程序分析
6.6.3基于比较单元的PWM波形发生器C语言主程序
1.所需的复位和中断向量定义文件“vectors.asm”//该文件利用汇编语言代码定义了复位和中断向量
reset:
b_c_int0
int0:
b_nothing
int1:
b_nothing
int2:
b_T3PINT
;当发生INT2中断时,程序跳转至“T3PINT”所标志的中断服务程序
int3:
b_nothing
int4:
b_nothing
int5:
b_nothing
int6:
b_nothing
2.主程序Pwm2.c
//屏蔽中断程序voidinlinedisable()
asm("setcINTM");
}//允许全局中断程序voidinlineenable()
{
asm(“clrcINTM”);
}//系统初始化子程序intinitial()
asm("setcSXM");
//符号位扩展有效
asm("clrcOVM");
//累加器中结果正常溢出
asm("clrcCNF");
//B0被配置为数据存储空间
*SCSR1=0x81FE;
//CLKIN=6MHz,CLKOUT=4*CLKIN=24M
*WDCR=0x0E8;
//不使能看门狗
*IMR=0x0000;
//禁止所有中断
*IFR=0x0FFFF;
//清除全部中断标志,“写1清0”
WSGR=0x00;
//禁止所有的等待状态
Hz
}
//EVB模块的PWM初始化程序
intpwminitial()
{
*MCRC=*MCRC|0x007E;//IOPE1~6被配置为基本功能方式,PWM7~12*EVAIFRA=*EVAIFRA|0xFFFF;//清EVA模块的全部中断标志寄存器*EVAIFRB=*EVAIFRB|0xFFFF;//防止系统误触发其它不需要的中断*EVAIFRC=*EVAIFRC|0xFFFF;
*ACTRB=0x0666;
//PWM12、10、8低有效,PWM11、9、7高有效
*DBTCONB=0x0F90;
//位11~8=1111,死区控制周期为15
//位7~5=100,输出PWM11、PWM12有死区控制,//PWM7~PWM10不进行死区控制
//位7~5=100,死区定时器的预分频系数是16
*CMPR4=0x1200;
//设置与PWM7、PWM8相应的CMPR4,占空比20%
*CMPR5=0x750;
*CMPR6=0x300;
//设置与PWM9、PWM10相应的CMPR5,占空比50%
//设置与PWM11、PWM12相应的CMPR6,占空比80%
*T3PER=0x1499;
//设置定时器3的周期寄存器,
//也即PWM载波周期为1500个定标器时钟周期
*COMCONB=0xA600;
*T3CNT=0x0000;
//使能比较操作
//清定时器3的计数寄存器
*GPTCONB=0x0041;
*EVAIMRA=0x0080;
//使能所有定时器的比较输出
//定时器3的比较输出低有效
//仅使能EVB模块定时器3的周期中断T3PINT
*EVAIMRB=0x0000;
*EVAIMRC=0x0000;
*T3CON=0x1402;
//配置定时器3的控制寄存器
//位12~11=10,选择连续增计数模式
//位10~8=100,选择输入时钟预定标系数=16
//位6=0,禁止定时器的操作
//位5~4=00,选择内部CPU时钟
//位3~2=00,定时器比较寄存器的重装载条件:
//当计数值是0时重装载
//位1=1,使能定时器的比较操作
//该中断服务程序主要是为了防止干扰,不做任何其它操作voidinterruptnothing()
{
return;//中断直接返回
}
voidinterruptT3PINT()
{
intflag;
flag=*EVBIFRA&0x0080;//判断是否是T3PINT
if(flag!
=0x0080)
{
asm(“clrcINTM”);
return;
return;
}
//主程序main()
{
disable();
initial();
pwminitial();
enable();
*T3CON=*T3CON|0x0040;while
(1)
{
6.6.4
//全局中断禁止//系统初始化//PWM输出初始化//允许全局中断//启动定时器3
基于比较单元的PWM波形发生器程序分析
作业
6.2TMS320LF2407可通过事件管理器的哪些引脚实现PWM波形的输出?
6.4简述通用定时器4种工作方式的特点。
6.5阐述通用定时器输出PWM波形的过程。
6.6阐述比较单元输出PWM波形的过程。
6.9简述TMS320LF2407响应可屏蔽中断的过程。
6.10如何用C语言实现可屏蔽中断的响应?