利用DSP控制直流无刷电机
时器模块,它们分别是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()中先把系统状态设置为Init,然后在程序状态机ApplicationStateMachine()里实现如图4所示的转换。
状态之间转换的各种条件均标在图4的各个箭头上。硬件上的其他事件:定时器A0、A1、A2的输入捕捉,A3的输入捕捉和溢出,D0的输出比较以及加减速按键都是通过中断的方式打入。所以整个软件的结构如图5所示。
系统一加电,程序进入初始化函数Initialize(),在这个函数中,做了以下工作:
◆启动直流电压ADC;
◆初始化Led,开始20ms的周期时钟中断D0;
◆开关状态初始化;
◆PWM参数初始化;
◆捕捉积分编码器跳变沿的定时器A0、A1、A2初始化;
◆相位检测器初始化;
◆ApplicationMode=Init;
◆取得转子位置,设好初始的导通相;
◆PI控制器初始化;
◆用于测量转速的定时器A3的初始化。
从Initialize()返回后,立刻进入前台死循环。
在转子运行过程中,定时器A0、A1、A2输入捕捉的发生,标志着转子运行到了一个需要换相的位置。输入捕捉事件触发中断ISRQTimer(),在这个中断服务程序中,完成以下的工作:
◆从相位检测器取得当前积分编码器的三路输出状态;
◆根据当前积分编码器输出状态,判断转子运转方向;
◆并调整PWM模块的交换和屏蔽,即定子电流换相。
所以说,定子电流的换相,是在紧随着积分编码器输出跳变沿的中断服务子程序中完成的。在判断转子运转方向的时候,使用了一个常数组:DIRECTION_TABLE[8]={0,5,3,1,6,4,2,0}。这个数组元素的下标和元素的值对应转子在顺时针运转情况下,当前编码器状态和下一个编码器状态(见图1)。比如,当前编码器输出011 《利用DSP控制直流无刷电机(第2页)》
本文链接地址:http://www.oyaya.net/fanwen/view/142302.html
相位检测器DECODER模块对于电机控制非常有用,它不仅能用于本文所说的六状态积分编码器,还能用于转子每转一圈产生相当多数目脉冲的积分编码器。该模块框图如图3所示。
但在本应用中,只用到了它的干扰信号滤波器,即使用了积分编码器的三路输出经过滤波后的值。六状态积分编码器的三个输出PHASEA、PHASEB、PHASEC分别接到相位检测器的PHASEA、PHASEB、INDEX三个输入端上。
控制算法
对于无刷直流电机的控制,软件上的内容是主体。
程序是一种前后台结构,前台是一个死循环,死循环内作两个工作,一个是程序状态转换ApplicationStateMachine(),另一个是20ms时钟节拍触发的LED控制、直流电压数字值读取和速度控制等服务性工作ServiceLedISR()。程序中有一个全局变量ApplicationMode,取值可以是Init、Stopped、Running和Fault,用来指示系统的状态。main()函数一开始在初始化函数Initialize()中先把系统状态设置为Init,然后在程序状态机ApplicationStateMachine()里实现如图4所示的转换。
状态之间转换的各种条件均标在图4的各个箭头上。硬件上的其他事件:定时器A0、A1、A2的输入捕捉,A3的输入捕捉和溢出,D0的输出比较以及加减速按键都是通过中断的方式打入。所以整个软件的结构如图5所示。
系统一加电,程序进入初始化函数Initialize(),在这个函数中,做了以下工作:
◆启动直流电压ADC;
◆初始化Led,开始20ms的周期时钟中断D0;
◆开关状态初始化;
◆PWM参数初始化;
◆捕捉积分编码器跳变沿的定时器A0、A1、A2初始化;
◆相位检测器初始化;
◆ApplicationMode=Init;
◆取得转子位置,设好初始的导通相;
◆PI控制器初始化;
◆用于测量转速的定时器A3的初始化。
从Initialize()返回后,立刻进入前台死循环。
在转子运行过程中,定时器A0、A1、A2输入捕捉的发生,标志着转子运行到了一个需要换相的位置。输入捕捉事件触发中断ISRQTimer(),在这个中断服务程序中,完成以下的工作:
◆从相位检测器取得当前积分编码器的三路输出状态;
◆根据当前积分编码器输出状态,判断转子运转方向;
◆并调整PWM模块的交换和屏蔽,即定子电流换相。
所以说,定子电流的换相,是在紧随着积分编码器输出跳变沿的中断服务子程序中完成的。在判断转子运转方向的时候,使用了一个常数组:DIRECTION_TABLE[8]={0,5,3,1,6,4,2,0}。这个数组元素的下标和元素的值对应转子在顺时针运转情况下,当前编码器状态和下一个编码器状态(见图1)。比如,当前编码器输出011 《利用DSP控制直流无刷电机(第2页)》