数字信号处理技术04电机测速系统交流电机的转速测量.docx
《数字信号处理技术04电机测速系统交流电机的转速测量.docx》由会员分享,可在线阅读,更多相关《数字信号处理技术04电机测速系统交流电机的转速测量.docx(20页珍藏版)》请在冰豆网上搜索。
![数字信号处理技术04电机测速系统交流电机的转速测量.docx](https://file1.bdocx.com/fileroot1/2023-6/4/af076d4a-d4f2-4291-8b3f-d735a257caf5/af076d4a-d4f2-4291-8b3f-d735a257caf51.gif)
数字信号处理技术04电机测速系统交流电机的转速测量
第4章电机测速系统
4.1电机测速系统
4.1.1电机测速系统硬件电路的组成
图4.1电机测速系统硬件接口电路
4.1.2电机测速系统的工作过程
4.2光电编码器
4.2.1光电编码器简介
4.2.2增量式旋转光电编码器的工作原理
图4.2增量编码器码盘脉冲信息细分的工作原理
4.3TMS320LF2407事件管理器模块的捕获单元
4.3.1捕获单元概述
事件管理器共有6个捕获单元,与EVA相关的捕获单元引脚3个,分别为CAP1、CAP2、CAP3,与EVB相关的捕获单元引脚3个,分别为CAP4、CAP5、CAP6。
4.3.2捕获单元操作
4.3.3捕获单元寄存器
1.捕获控制寄存器A(CAPCONA)
2.捕获控制寄存器B(CAPCONB)
3.捕获FIFO状态寄存器A(CAPFIFOA)
4.捕获FIFO状态寄存器B(CAPFIFOB)
5.捕获单元FIFO栈
4.3.4捕获单元应用举例
下面给出了利用DSP的捕获单元3(CAP3)对脉冲宽度进行捕捉的例程。
为了便于演示,被捕捉的脉冲由定时器1的比较模块产生。
1.所需的复位和中断向量定义文件“vectors.asm”
//该文件利用汇编语言代码定义了复位和中断向量
.title“vectors.asm”
.ref_c_int0,_nothing,_capint
.sect“.vectors”
reset:
b_c_int0
int1:
b_nothing
int2:
b_nothing
int3:
b_nothing
int4:
b_capint
int5:
b_nothing
int6:
b_nothing
2.主程序Cap.c
//该程序用于测试DSP的CAPTURE模块,由TIMER1的比较模块输出一个
//PWM波形,此波形输入CAP4引脚,待CAP4捕捉该PWM的10次上升沿
//后,停止捕捉,并把10次捕捉值存于数组result[10]中。
#include"register.h"
//初始化子程序
intresult[10];//定义一个存储结果的数组
intk=0;//定义的中断次数值
//系统初始化子程序
intinitial()
{
asm("setcINTM");//禁止所有中断
asm("setcSXM");//抑制符号位扩展
asm("clrcOVM");//累加器中结果正常溢出
asm("clrcCNF");//B0被配置为数据存储空间
*SCSR1=0x81FE;//CLKIN=6MHz,CLKOUT=4*CLKIN=24MHz
*WDCR=0x0E8;
*IMR=0x0000;//禁止所有中断
*IFR=0x0FFFF;//清除全部中断标志,"写1清0"
}
//捕获单元4初始化子程序
intCAP4INT()
{
*T3PER=0x0FFFF;//通用定时器3的周期寄存器为0xFFFF
*T3CON=0x1400;//通用定时器3为连续增计数模式
*T3CNT=0x00;//计数器清0
WSGR=0x0000;//禁止所有等待状态
*CAPCONB=0x0A440;//捕获单元4检测上升沿,且选择TIMER3为时钟
asm("clrcINTM");//开全局中断
*IMR=0x08;//允许中断优先级4的中断
*EVBIMRC=*EVBIMRC|0x0001;//允许CAPTURE4中断
*EVBIFRC=*EVBIFRC|0x0FFFF;
}
//定时器1初始化子程序,使其比较单元输出一个PWM波形
inttimer1int()
{
*MCRA=*MCRA|0x1000;//配置IOPB4口为定时器1的比较输出
*MCRC=*MCRC|0x0080;//配置IOPE7口为捕捉功能
*GPTCONA=*GPTCONA|0x0042;
*T1PER=0x1FE;//给定时器1的周期寄存器赋值
*T1CON=0x1442;//允许TIMER1比较输出,TIMER1为连续增计数模式//TIMER1立即启动
*T1CNT=0x00;//定时器1的计数器清0
*T1CMP=0x0FF;//给定时器1的比较寄存器赋值
}
//主程序
main()
{
initial();//系统初始化
timer1int();//定时器1初始化,使其输出一个PWM波形供捕捉
CAP4INT();//捕获单元4初始化
*T3CON=*T3CON|0x0040;//启动定时器3
while
(1)
{
if(k==10)break;//k保存中断次数值,是全局变量
}
asm("setcINTM");//捕捉10次后,禁止再中断
}
//若是由于干扰引起其它中断,则执行此子程序
voidinterruptnothing()
{
asm("clrcINTM");//返回前开中断
return;
}
//捕捉中断服务程序
voidinterruptcapint()
{
intflag;
flag=*EVBIFRC&0x01;//判断是否是CAP4中断
if(flag!
=0x01)
{
asm("clrcINTM");//返回前开中断
return;//如果不是CAP4中断,则直接返回
}
load();//如果是CAP4中断,则装载捕捉值
*EVBIFRC=*EVBIFRC|0x01;//写"1"清除CAP4中断标志
asm("clrcINTM");//返回前开中断
return;//中断返回
}
//装载捕捉值子程序
intload()
{
result[k]=*CAP4FIFO;//读取捕捉值,存于相应的数组
k++;
}
4.4TMS320LF2407事件管理器模块的正交编码脉冲电路
4.4.1正交编码脉冲电路概述
每个事件管理器模块都有一个正交编码脉冲(QEP)电路。
1.正交编码脉冲电路的引脚
两个正交编码脉冲输入引脚与捕获单元1和2(或3和4,对于EVB模块)共享。
3.正交编码脉冲电路的时基
图4.7EVA模块中的正交编码脉冲电路结构框图
4.4.2正交编码脉冲电路的编码操作
2.正交编码脉冲电路
3.正交编码脉冲电路的计数
4.正交编码脉冲电路寄存器的设置
4.4.3正交编码脉冲电路应用举例
图4.8模拟QEP脉冲软件流程图
1.所需的复位和中断向量定义文件“vectors.asm”
//该文件利用汇编语言代码定义了复位和中断向量
.title"vectors.asm"
.ref_c_int0,_nothing
.sect“.vectors”
reset:
b_c_int0
int1:
b_nothing
int2:
b_nothing
int3:
b_nothing
int4:
b_nothing
int5:
b_nothing
int6:
b_nothing
2.主程序Qep.c
//该程序用于测试TMS320LF240x的EVB模块的QEP电路,
#include"register.h"
//系统初始化子程序
initial()
{
asm("setcINTM");//禁止所有中断
asm("setcSXM");//抑制符号位扩展
asm("clrcOVM");//累加器中结果正常溢出
asm("clrcCNF");//B0被配置为数据存储空间
*SCSR1=0x81FE;//CLKIN=6MHz,CLKOUT=4*CLKIN=24MHz
*WDCR=0x0E8;
*IMR=0x0000;//禁止所有中断
*IFR=0x0FFFF;//清除全部中断标志,"写1清0"
}
//QEP电路初始化子程序
intQEPINT()
{
*T4PER=0x0FFFF;//通用定时器4的周期寄存器为0xFFFF
*T4CON=0x1870;//通用定时器4为定向增减计数模式,并且以正
//交编码脉冲电路作为时钟源
*T4CNT=0x00;//计数器清0
WSGR=0x0000;//不使能所有的等待状态
*CAPCONB=0x0E000;//使能EVB的QEP电路
}
//I/O端口初始化子程序
intioinit()
{
*MCRC=*MCRC|0x0180;//设置相应的通用引脚的I/O功能
*PEDATDIR=*PEDATDIR|0x0606;//设置IOPE1、IOPE2为输出引脚且都
//为高电平
}
//延时子程序
intDELAY()
{
intk;
for(k=0;k<30000;k++)
{;}
}
//主程序
main()
{
initial();//系统初始化
ioinit();//I/O端口初始化
QEPINT();//QEP电路初始化
while
(1)
{
*PEDATDIR=*PEDATDIR&0xFFFB;//使IOPE2引脚变低
DELAY();//延时子程序
*PEDATDIR=*PEDATDIR&0xFFFD;//使IOPE1引脚变低
DELAY();//延时子程序
*PEDATDIR=*PEDATDIR|0x0004;//使IOPE2引脚变高
DELAY();//延时子程序
*PEDATDIR=*PEDATDIR|0x0002;//使IOPE1引脚变高
DELAY();//延时子程序
}
}
//若由于干扰引起中断请求,则执行此中断服务程序,此中断程序相当于汇编中
//假中断程序,即什么事情也不作,以保证中断系统的完整性,防止程序跑飞。
voidinterruptnothing()
{
return;
}
4.5电机测速系统程序
4.5.1电机测速系统C语言主程序1
1.所需的复位和中断向量定义文件“vectors.asm”
//该文件利用汇编语言代码定义了复位和中断向量
.title“vectors.asm”
.ref_c_int0,_nothing,_capint
.sect“.vectors”
reset:
b_c_int0
int1:
b_nothing
int2:
b_nothing
int3:
b_nothing
int4:
b_CAP4INT
int5:
b_nothing
int6:
b_nothing
2.主程序Djcs1.c
//该程序用于T法电机测速
#include"register.h"
#definef060000//定义CPU时钟频率,此处设为6MHz
#definex128//定义定时器输入时钟的预分频系数,此处设为128
intn;//定义变量,用于存储瞬时转速
inti=0;//定义变量并初始化为0,用于存储中断次数
intresult[2];//定义一个存储结果的数组
//系统初始化子程序
intinitial()
{
asm("setcINTM");//禁止所有中断
asm("setcSXM");//抑制符号位扩展
asm("clrcOVM");//累加器中结果正常溢出
asm("clrcCNF");//B0被配置为数据存储空间
*SCSR1=0x81FE;//CLKIN=6MHz,CLKOUT=4*CLKIN=24MHz
*WDCR=0x0E8;//不使能看门狗
*IMR=0x0000;//禁止所有中断
*IFR=0x0FFFF;//清除全部中断标志,"写1清0"
}
//捕获单元4初始化子程序
intcap4init()
{
WSGR=0x0000;//禁止所有等待状态
*CAPCONB=0x0240;//捕获单元4选择定时器3为时基,检测上升沿
asm("clrcINTM");//允许全局中断
*IMR=0x08;//允许中断INT4
*EVBIMRC=*EVBIMRC|0x0001;//允许捕获单元4中断
*EVBIFRC=*EVBIFRC|0x0FFFF;//清除中断标志位
}
//定时器3初始化程序。
定时器3得到Z信号两个脉冲之间的时间间隔
inttimer3init()
{
*GPTCONA=0x0000;
*T3PER=0xFFFF;//给定时器3的周期寄存器赋值
*T3CON=0x170C;//位12~11=10,连续增计数模式
//位10~8=111,输入时钟预定标系数为128
//位=6,禁止定时器操作
//位5~4=00,使用内部CPU时钟
*T3CNT=0x0000;//定时器3的计数器清0
}
//装载捕捉值子程序
intload()
{
intk=0;
result[k+1]=result[k];
result[k]=*CAP4FIFO;//读取捕捉值,存于相应的数组
if(result[k+1]result[k+1]=result[k]+0x0FFFF;
}
//主程序
main()
{
initial();//系统初始化
cap4init();//捕获单元4初始化
timer3init();//定时器3初始化程序
*CAPCONB=*CAPCONB|0x2000;//启动捕获单元4
*T3CON=*T3CON|0x0040;//启动定时器3
while
(1)
{
;
}
}
//若是由于干扰引起其它中断,则执行此子程序
voidinterruptnothing()
{
asm("clrcINTM");//返回前开中断
return;
}
//捕捉中断服务程序
voidinterruptCAP4INT()
{
intflag;
flag=*EVBIFRC&0x01;//判断是否是CAP4中断
if(flag!
=0x01)
{
asm("clrcINTM");//返回前开中断
return;//如果不是CAP4中断,则直接返回
}
load();//如果是CAP4中断,则装载捕捉值
i=i+1;
if(i>=2)
n=(int)x*(result[1]-result[0])*60/f0;//得到转速,单位为转/分
*EVBIFRC=*EVBIFRC|0x01;//写"1"清除CAP4中断标志
asm("clrcINTM");//返回前开中断
return;//中断返回
}
4.5.2电机测速系统C语言主程序1分析
T法测速是测出Z信号相邻两个脉冲之间的间隔时间来计算转速的,适合于电机转速较低的情况。
电机的转速n=x/f0(*(T3CNT1-T3CNT0)=x*(result[1]-result[0])*60/f0。
4.5.3电机测速系统C语言主程序2
1.所需的复位和中断向量定义文件“vectors.asm”
//该文件利用汇编语言代码定义了复位和中断向量
.title“vectors.asm”
.ref_c_int0,_nothing,_capint
.sect“.vectors”
reset:
b_c_int0
int1:
b_nothing
int2:
b_T1PINT
int3:
b_nothing
int4:
b_nothing
int5:
b_nothing
int6:
b_nothing
2.主程序Djcs2.c
//该程序用于M法电机测速
#include"register.h"
#definef060000//定义CPU时钟频率,此处设为6MHz
#definex128//定义定时器3输入时钟的预分频系数,此处设为128
#definepN3000//定义光电编码器每转一圈正交编码脉冲个数,此处设为3000
#defineT1PR0x0FFFF//定义定时器1的周期寄存器值,此处设为0xFFFF
intn;//定义变量,用于存储瞬时转速
inti=0;//定义变量并初始化为0,用于存储中断次数
intresult[2];//定义一个存储结果的数组
intTC;//定义全局变量,用于存储定时器1的定时周期时间
//系统初始化子程序
intinitial()
{
asm("setcINTM");//禁止所有中断
asm("setcSXM");//抑制符号位扩展
asm("clrcOVM");//累加器中结果正常溢出
asm("clrcCNF");//B0被配置为数据存储空间
*SCSR1=0x81FE;//CLKIN=6MHz,CLKOUT=4*CLKIN=24MHz
*WDCR=0x0E8;//不使能看门狗
*IMR=0x0000;//禁止所有中断
*IFR=0x0FFFF;//清除全部中断标志,"写1清0"
}
//正交编码脉冲电路初始化子程序
intqepinit()
{
*T2CON=0x1870;//位12~11=11,选择定向增/减计数模式
//位5~4=11,选择正交编码脉冲电路作为时基
*T2CNT=0x00;//计数器清0
WSGR=0x0000;//不使能所有的等待状态
*CAPCONA=0x08000;//禁止捕获功能,使能EVA正交编码脉冲电路
*IMR=0x02;//允许中断INT2
*EVAIMRA=*EVBIMRC|0x0080;//允许定时器1周期匹配中断
*EVAIFRA=*EVAIFRA|0x0FFFF;//清除中断标志位
asm("clrcINTM");//允许全局中断
}
//定时器1初始化程序。
定时器1提供T法测速需要的TC
inttimer1init()
{
*GPTCONA=0x0000;
*T1PER=0xFFFF;//给定时器1的周期寄存器赋值
*T1CON=0x170C;//位12~11=10,连续计数模式
//位10~8=111,输入时钟预定标系数为128
//位=6,禁止定时器操作
//位5~4=00,使用内部CPU时钟
*T1CNT=0x0000;//定时器1的计数器清0
TC=(T1PR+1)*x/f0;//定时器1定时周期时间与周期存储器内容的关系
}
//装载正交编码脉冲个数子程序
intload()
{
result[1]=result[0];
result[0]=*T2CNT;//读取定时器2的计数值,存于相应的数组
if(result[1]result[1]=result[0]+0x0FFFF;
}
//主程序
main()
{
initial();//系统初始化
qepinit();//正交编码脉冲电路初始化子程序
*T1CON=*T1CON|0x0040;//启动定时器1
while
(1)
{
;
}
}
//若是由于干扰引起其它中断,则执行此子程序
voidinterruptnothing()
{
asm("clrcINTM");//返回前开中断
return;
}
//定时器1周期中断服务程序
voidinterruptT1PINT()
{
intflag;
flag=*EVAIFRA&0x80;//判断是否是定时器1周期中断
if(flag!
=0x80)
{
asm("clrcINTM");//返回前开中断
return;//如果不是定时器1周期中断,则直接返回
}
load();//如果是定时器1周期匹配中断,则装载正交编码脉冲个数
i=i+1;
if(i>=2)
n=(int)(60*(result[1]-result[0]))/(TC*pN);//得到转速,单位为转/分
*EVAIFRA=*EVAIFRA|0x80;//写"1"清除定时器1周期匹配中断标志
asm("clrcINTM");//返回前开中断
return;//中断返回
}
4.5.4电机测速系统C语言主程序2分析
M法测速是在相等的时间间隔TC内用光码盘输出脉冲个数来算出转速,从而得到转速的测量值,适合于电机转速较高的情况。
电机的转速n=(60*(T2CNT1-T2CNT0))/pN)/TC=(60*(result[1]-result[0]))/(TC*pN)。
作业
4.1TMS320LF2407A通过光电编码器测定电机转速时需用到哪些单元?
4.4什么是正交编码脉冲?
输入正交编码脉冲电路的信号应具有什么特点?
4.5捕获引脚出现设定的电平变化时,捕获单元是如何操作的?
4.6TMS320LF2407A通过光电编码器测定电机转速时怎样得到电机的转速?