预览加载中,请您耐心等待几秒...
1/7
2/7
3/7
4/7
5/7
6/7
7/7

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

利用DSP控制直流无刷电机摘要:介绍了一种利用双口RAM实现DSP与单片机高速数据通信的方法给出了它们之间的接口电路以及软件实现方案。关键词:DSP;双口RAM;接口电路;数据通信直流无刷电机实际属于永磁同步电机一般转子为永磁材料随定子磁场同步转动。这种电机结构简单而且由于移去了物理电刷使得电磁性能可靠维护简单从而被广泛应用于办公自动化、家电等领域。直流无刷电机运行过程要进行两种控制一种是转速控制也即控制提供给定子线圈的电流;另一种是换相控制在转子到达指定位置改变定子导通相实现定子磁场改变这种控制实际上实现了物理电刷的机制。因此这种电机需要有位置反馈机制比如霍尔元件、光电码盘或者利用梯形反电动势特点进行反电动势过零检测等。利用光电编码器的系统在软件实现上更方便。电机速度控制也是根据位置反馈信号计算出转子速度再利用PI或PID等控制方法实时调整PWM占空比等来实现定子电流调节。因此控制芯片要进行较多的计算过程。当然也有专门的直流无刷电机控制芯片;但一般来说在大多数应用中除了电机控制总还需要做一些其他的控制和通信等事情所以选用带PWM同时又有较强数学运算功能的芯片也是一种很好的选择。Motorola的数字信号处理器DSP568__系列整合了通用数字信号处理器快速运算功能和单片机外围丰富的特点使得该系列特别适合于那些要求有较强的数据处理能力同时又要有较多控制功能的应用中对直流无刷电机的控制就是这一系列DSP的典型应用之一。直流无刷电机结构和连接三相直流无刷电机采用二二导通、三相六状态PWM调制方式。电机定子绕组轴向示意图如图1所示。当电流从A到B时定子绕组产生的磁场为图1中A-B方向如果电机顺时针运行此时永磁转子磁场应位于III区产生的扭矩最大。当转子转过III区和IV区的交界到达IV区时定子绕组电流应相应改变成为从A到C即产生的磁场成为图1中A-C方向。这样定子磁场总超前转子磁场约90°使转子不断的向前跟进。实现这个过程的关键是取得转子位置积分编码器就起这个作用如它的三路输出:PHASEA、PHASEB、PHASEC在转子分别位于图1中的I到VI各区时输出信号相应为:011、001、101、100、110、010。这样通过捕捉积分编码器任一路输出上的跳变沿读取跳变沿后的积分编码器输出状态就可以确定转子的新位置实现定子绕组电流换向。同时利用定时器检测两次换向之间的时间间隔计算出电机运行的速度再通过调整PWM信号的占空比调整定子电流实现调速。DSP568__中使用到的主要模块在Motorola的DSP568__系列数字信号处理器的软件开发包中给出了一个利用上述思路对直流无刷电机控制的应用程序:bldc_sensors。主要用到了DSP的脉宽调制PWM模块、定时器模块、相位检测器DECODER模块。PWM模块共有六路输出分别用来控制三相的顶底共六个功率管。模块可以被配置成互补通道模式即PWM0与PWM1为一对互补对共三对互补对如图2所示。互补对内的两个信号可以在芯片内部被互相交换如图2中C相所示;也可以同时被屏蔽使得输出全为0该相就关断如图2中A相所示。定时器模块是最普通的外设在这个应用中使用了5个定时器模块它们分别是A0、A1、A2、A3和D0。前3个分别接积分编码器的一路输出利用它们的输入捕捉功能产生中断在中断子程序内检测新的积分编码器输出状态实现换相。A3接的也是积分编码器的一路输出它用来测量某路霍尔信号两个跳变沿间的时间间隔计算转子速度。D0用来产生20ms间隔的节拍周期性的对系统状态进行转换和检测。相位检测器DECODER模块对于电机控制非常有用它不仅能用于本文所说的六状态积分编码器还能用于转子每转一圈产生相当多数目脉冲的积分编码器。该模块框图如图3所示。但在本应用中只用到了它的干扰信号滤波器即使用了积分编码器的三路输出经过滤波后的值。六状态积分编码器的三个输出PHASEA、PHASEB、PHASEC分别接到相位检测器的PHASEA、PHASEB、INDEX三个输入端上。控制算法对于无刷直流电机的控制软件上的内容是主体。程序是一种前后台结构前台是一个死循环死循环内作两个工作一个是程序状态转换ApplicationStateMachine()另一个是20ms时钟节拍触发的LED控制、直流电压数字值读取和速度控制等服务性工作ServiceLedISR()。程序中有一个全局变量ApplicationMode取值可以是Init、Stopped、Running和Fault用来指示系统的状态。main()函数一开始在初始化函数Initialize()