数字信号处理技术04电机测速系统交流电机的转速测量.docx

上传人:b****7 文档编号:25082551 上传时间:2023-06-04 格式:DOCX 页数:20 大小:181.02KB
下载 相关 举报
数字信号处理技术04电机测速系统交流电机的转速测量.docx_第1页
第1页 / 共20页
数字信号处理技术04电机测速系统交流电机的转速测量.docx_第2页
第2页 / 共20页
数字信号处理技术04电机测速系统交流电机的转速测量.docx_第3页
第3页 / 共20页
数字信号处理技术04电机测速系统交流电机的转速测量.docx_第4页
第4页 / 共20页
数字信号处理技术04电机测速系统交流电机的转速测量.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

数字信号处理技术04电机测速系统交流电机的转速测量.docx

《数字信号处理技术04电机测速系统交流电机的转速测量.docx》由会员分享,可在线阅读,更多相关《数字信号处理技术04电机测速系统交流电机的转速测量.docx(20页珍藏版)》请在冰豆网上搜索。

数字信号处理技术04电机测速系统交流电机的转速测量.docx

数字信号处理技术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通过光电编码器测定电机转速时怎样得到电机的转速?

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

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

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