查看完整版本: 基于 DSP 的电子负载:电子负载控制系统软件设计

admin 发表于 2015-4-28 00:05:03

基于 DSP 的电子负载:电子负载控制系统软件设计

第5章电子负载控制系统软件设计
        5.1软件架构
        研究课题的软件系统较为简单,主要任务是根据电流、电压的AD采样结果,经过数字控制环运算,由DA输出运算结果,这是最重要也是实时性最高的任务。
        此外,还要处理人机交互的任务,诸如串口通信、按键,显示等等,这些任务并不是时刻都存在的,实时性要求不高。
       
        软件的架构由前台和后台两部分组成。前台是一个预设输入和结果输出,如图5.1左图所示,包括读取按键编码值、LCD显示所处的测试模式和串口通信数据进行处理。后台如图5.1右图所示,以事件管理器A周期匹配中断为核心中断,整个反馈回路都是以此中断为基础,完成AD采样,数字控制环计算,更DA输出,实时调整负载电流。在软件系统中,需要保证实时性的任务只有反馈环的任务,在TMS320LF2812的ISR进行中,不能进行嵌套中断,别的中断是不能得到DSP响应的。
       
        为了防止串口中断(后台执行程序)的ISR执行时间过长,影响到反馈环的执行,在串口中断的ISR中避免代码的冗繁。主循环通过检测标志位,查看串口通信的事件发生,然后到指定位置读取相应数据,最大限度的避免数字控制环的执行被打断。
       
        5.2数字控制环软件设计
        采样控制系统都是有延迟的,保证控制环的数字处理和延迟时间在一个最小的周期以内,是本课题研究的重点。由于事件管理器的定时器中断和AD采样中断服务处理程序的指令数固定,而AD转换的时间由硬件决定,因而每周期内AD采样对于数字环执行周期,占用的时间是固定的。设计如图5.2所示的结构。
       
        在整个数字控制环的执行周期内,包括AD转换,AD转换结果的保存,控制算法的调用和执行,运算结果的保存和输出,执行周期内预留下一定的空闲时间,方便调用不同的控制算法时留下一定的时间余量。整个控制算法执行周期为4微妙,每个周期DA执行一次输出。
       
        (1)中断
        主程序里面一共开放了三个中断,T1定时器周期中断,串口接收中断和PDPA中断。周期中断启动A/D转换,开始采样电压、电流值,并保存结果进入数字控制环;串口接收中断,用于SCI接收中断,并置发标志;PDPA中断,用于保护功率模块,一旦PDPA关脚为低便封锁输出。其中T1的周期中断程序不允许被打断,因为该程序响应用于DA的输出,响应速度要求很快,PDPA是保护中断程序,一般不会响应,这两个中断都不允许中断嵌套。SCI串口输出允许被打断,但在中断程序的开头要加上EINT,开中断,允许中断嵌套。
       
        事件管理器A即EVA的定时器Timer1的定时器中断,在此定时器中断的中断服务处理程序ISR中,启动2路AD转换。设置EVA Timer1的周期寄存器设置EVATimer1的周期为512(约为3.4微妙),通用定时器配置为连续增减模式,周期匹配中断。
       
        (2)AD采样
        DSP2812内部有一个12位带流水线的模/数转换模块,共有16个通道,可通过寄存器配置为2个独立的8通道模块,分别服务于事件管理器A和B,2个独立的8通道模块也可以级联构成1个16通道模块,同时对16个通道进行采样,ADC要求输入的模拟电压范围为0~3V.A/D转换单元负责电流控制环的电流和电压值,设计中用事件管理器启动对ADCINA0和ADCINB0同时采样,同时对两个通道的输入信号进行转换。TMS320LF2812虽然有12位精度,但在实际的使用过程中,我们发现,ADC的转换结果误差较大,如果直接将此转换结果用于控制回路,必然会降低控制精度,最大的转换误差可以达到9%,为了提高控制的精度,必须提高A/D的采样的精度。
       
        硬件角度:加RC硬件滤波,滤除干扰信号;电路布线时注意不要让ADCIN引脚运行在靠近数字信号通路的地方,这样能使耦合到ADC输入端的数字信号开关噪声大大降低。采用隔离技术,将ADC模块电源引脚和数字电源隔离;软件角度:多次采样取平均值算法,最为简单,但耗费大量时间,对数字控制环在短时间内执行完所有的程序是一对矛盾体;数字滤波算法,例如采用中值滤波法,具体方法为:连续采样20个数据,对这些数据进行排序之后,去掉最小的5个和最大的5个,然后取中间10个采样数据的平均值,这也要付出时间上的牺牲,不太适合本设计;软件校正算法。TMS320LF的ADC转换精度较差的主要原因是存在增益误差(Gain Error)和偏置误差(Offset Error),要提高转换精度就必须对两种误差进行补偿,这也是本设计中采用的提高A/D模块的补偿方法。
       
        理想的12位ADC是没有增益误差和偏置误差的,其转换的计算公式为:
       
        但是,实际上TMS320LF2812的A/D是存在增益误差和偏置误差的,其转换的计算公式如式5.1所示:
       
        其中,ma=actual gain(实际的增益)mb=actual offset(偏置误差)
        实际的和理想的转换计算曲线如图5.3所示:
       
        用标准的0~3V信号经过A/D转换器,由示波器测出电压信号的精确值,调用CCS的A/D转换结果寄存器数值,换算成模拟值,计算出可靠的增益误差和偏置误差。在数字控制环中直接使用公式5.1得到的模数转换结果。
       
        5.3软件系统代码的编写
        通用DSP的源代码开发可以用两个方法:一种是利用汇编指令编写源代码,然后经汇编器和链接器汇编链接后生成可执行目标代码;另一种方法是用标准C/C++语言在CCS环境下编写源代码,经C/C++编译器、汇编器和链接器进行编译链接,生成可执行目标代码。这两种代码开发方法都需要花费大量的时间,耗时又耗力,大大的增加了产品开发难度,延长了产品开发的周期,从而影响到开发的效率。
       
        Math Works公司和TI公司联合开发的工具包—MATLAB Link for CCS Development Tools,把MATLAB和TI的DSP集成开发环境CCS(Code Composer Stadiu)及目标DSP连接起来。用此工具可以来方便的操做DSP的存储器或寄存器设置,像操作MATLAB变量一样,整个目标DSP对于MATLAB像透明的一样,在MATLAB环境下,开发人员可以方便的完成对CCS的操作。MATLAB Link for CCS Development Tools支持CCS识别的任何目标板,包括TI公司EVM板、DSK板和用户自己开发的DSP板。如果再把MATLAB Link for CCS Development Tools与另外一个工具包Embedded Target for the TI TMS320C2000 DSP Platform配合(MathWorks公司和TI公司联合开发的)配合使用,则可以直接由MATLAB里面的Simulink模型生成DSP的可执行代码,即在MATLAB环境完成DSP开发的过程。
       
        首先,根据系统的设计在MATLAB/Simulink平台下搭建系统模型(.mdl),仿真满意后,通过MATLAB提供的Real Time Workshop(RTW)生成面向TI编译器的工程文件代码(.prj)并进一步完成代码的编译,运行仿真模型产生C代码程序,并且生成DSP可执行机器码(.out),最后下载到目标DSP板上,运行测试程序,完成系统的开发。
       
        上述开发过程全部在MATLAB/Simulink环境下进行,开发人员不需要写任何代码,仅仅需要利用MATLAB的模型模块,就可以完成系统的设计。而且开发人员在系统设计过程中可随时对系统进行仿真验证,确保系统设计的正确性。下图5.4即为DSP代码自动生成的开发流程图。
       
        根据设计的控制算法,利用MATLAB Link for CCS Development Tools工具包和Simulink工具包里面的功能模块,搭建出控制系统的仿真模型,TMS320LF2812是一款32位定点DSP,为了能进行浮点运算,我们一般在DSP数据处理中会使用IQmath库,用定点运算代替浮点运算,在建模过程中要处理好数据格式的设置,在建立模型的过程中尤其要注意那些前后两级都有连接的模块,选用统一的Q格式。遇到模拟信号时用采样保持器和量化器把模拟连续信号离散化和数字化,数字控制环的时间选用为3.3微秒,如下图5.5所示。
       
        然后根据实际电路中控制效果,改变配置的PID参数大小,使控制效果达到最佳。本文中根据实际情况,只采用了PI控制。最后需要注意的是,建模的时候一定要加入F2812 eZdsp模块,在自动生成代码的时候需要对一些模块进行相关参数设置。F2812 eZdsp模块主要的配置信息包括:DSPBoardLabel和BuildAction,其中,BuildAction配置代码生成的四种功能模式:①Code(代码)模式,只生成C代码;②Project(工程)模式,只生成工程文件;③Build(编写)模式,生成工程文件并编译链接;④Build and Load(编写下载)模式,生成工程文件,编译链接并下载到目标板。DSPBoardLabel配置仿真器型号,所用仿真器为F2812 XDS510 Emulator,选择Build and load功能模式。然后进入Simulink的Simulation-Configuration Parameters,单击实时工作室Real-Time Workshop进入配置界面。进行如下配置:
        System target file:ti_c2000_grt.tle
        Make command:make_rtw
        Template makefile:ti_c2000_grt.tmf
        最后在Real-Time Workshop界面中,点击generate code按键,MATLAB根据设置自动生成DSP工程文件,并且自动连接打开CCS开发环境,对C代码进行编译,链接、下载到目标板上。通过CCS IDE,我们可以看到代码生成过程中自动建立的Project.prj工程文件,工程文件中包括:源文件,库文件,链接文件等。
       
        实时工作站针对不同的目标系统,产生相应的代码,主要包括目标系统相关的I/O驱动和中断服务程序(ISR)。产生代码的过程中MATLAB环境会实时的提供相关的信息,如一些警告或出错信息,用户可以根据提示修改相应的模块的设置。由于生成的代码是C代码,我们还可以根据具体的需要,在后期的时候方便的修改生成的代码,以完善设计。
       
        5.4 LCD显示程序设计
        在电子负载控制系统中,本系统选用的信号板液晶显示屏是由长沙太阳人公司提供的SMG12864ZK字符型液晶,内置ST7920接口型液晶显示控制器。因为DSP2812的最高时钟频率可工作在150MHZ,周期为6.67ns,而ST7920控制器中指令与指令输入之间的时间间隔都是在几十微秒或毫秒,小液晶的作用主要是显示当前的测试模式,具体的实时处理数据的显示由电脑来完成。
       
        在液晶编程设计过程中,如何能够控制好个控制参数的时序是至关重要的,本款液晶的读写时序如图5.6所示。
       
        因为DSP对ST7920等的访问不需要使用判“忙”过程,故没有判“忙”函数的设计。在程序设计时,要特别注意GPIO的控制,在配置时一定要添加EALLOW保护,否则会导致配置数据时发生数据丢失或数据冲突,液晶驱动初始化配置程序如下:
        void main(void)
       
        {
        InitSysCtrl();//初始化系统控制寄存器、PLL、看门狗和时钟
        DINT; //禁止和清除所有CPU中断向量表
        InitPieCtrl();//初始化PIE控制寄存器
        IER=0x0000; //禁止所有CPU中断
        IFR=0x0000; //清除所有中断标志
        InitPieVectTable(); //初始化中断向量表
        EALLOW; //允许更改受保护的寄存器
        GpioMuxRegs.GPBMUX.all=0; //使相关I/O工作在GPIO模式
        ……
       
        GpioMuxRegs.GPBDIR.bit.GPIOB0=1; // RS(控制液晶屏的数据指令选择引脚)
       
        GpioMuxRegs.GPBDIR.bit.GPIOB11=1; // RW(控制液晶屏的数据读写选择引脚)
       
        GpioMuxRegs.GPBDIR.bit.GPIOB12=1; // E(控制液晶屏的使能引脚)
        GpioMuxRegs.GPBDIR.bit.GPIOB1=1;//引脚用于控制74LVX3245(U1)方向选择GpioMuxRegs.GPBDIR.bit.GPIOB2=1;//引脚用于控制74LVX3245(U2)方向选择GpioDataRegs.GPBSET.bit.GPIOB2=1; //将方向选择引脚置高
        EDIS; //禁止更改受保护的寄存器
        lcdreset(); //初始化LCD屏
        lcdwc(0x01);//清除显示
        delay(50); //延时50*66.7ns
        hzklib(); //调用显示函数……
       
        }
        5.5键盘程序设计
        键盘程序采用查询方法来实现键值的识别。执行主程序前,首先调用按键的查询程序,判断选择的测试模式。键盘输入信息设计思想如下所示。
       
        (1)判断是否有键按下
        按键被按下时,相应DSP的GPIO口输入线的电平被拉低。因此,判断是否有键按下,读取DSP端口值即可,若端口为低电平,则表明有按键键按下;若端口仍为高电平,无键按下。
       
        (2)确定按下的键值
        本设计中用到的按键少,一个按键对应一个GPIO口,通过读取不同的GPIO口的值,就可以知道当前按键的键值。
       
        (3)等待按键释放
        确定按键的键值以后,仍然需要判断按键的释放,延时一断时间后调用执行相应的子程序。
       
        (4)消抖处理
        由于选用的按键是机械触点,因此用手按动一个键时,按键的断开和闭合瞬间会出现电压波动,如图5.7所示。
       
        为了保证按键键值的识别,电压抖动的时候不能进行状态的输入查询。为此,程序中增加消抖算法,DSP获得按键被按下信息后,并即刻确认按键的键值,而是延时1ms后再次检测相应端口,如果按键仍处于低电平,则说明按键确实被按下。同理,在DSP检测到按键释放时,GPIO口恢复高电平,程序同样也延时1ms,进行后沿的消抖,然后再识别键值。
       
        5.6串行通讯设计
        由于研究的是基于DSP的实验样机,在控制精度足够高的情况下,才能完成整机的成型,监控系统是在以后深入的研究的内容,目前仅在CCS环境下进行了调试测试,只对通讯做了简单的研究。
       
        串行通讯采用SCI异步通信接口,SCI模块采用标准的非归零数据格式,能够实现CPU和其他具有SCI端口的外设进行数据通讯。进行通信协议的设计,首先要进行信息帧结构的设计,串行异步通信以帧为单位,每次传送一个数据帧。
       
        TMS320LF2812的数据发送和接收由数据发送单元和接收单元来完成。算法程序运行一次就不停的查询是否接收到串口收到的数据,判断标志位tran_flag是否为1,一旦接收到数据,就将该数据发送出去,并清tran_flag,同时恢复串口为接收模式。DSP2812 SCI与计算机通信,采用超级中断接收数据,DSP每隔4微妙向计算机发送个数据。
       
        vvoid main(void)
        {
        ……
        SciReg.SCICTL2.TXINTENA = 1;// 使能SCI发送中断
        while (1)
        Interrupt void SCI_TX_isr (void )
        {
        int i;
        for ( i= 0 ; i < 10 ; i ++ ); // 软件延时1.5微秒,重新初始化PIE,为SCI准备下一次中断
        SciRegs.SCITXBUF=pid_cc.pid_out_reg3 + InitOut;
        PieCtrlRegs.PIEACK.all = 0x0100;// 响应中断
        while ( SciRegs.SCICTL2.bit.tran_flag = = 0 );;// 状态检测模式,等待发送标志为空
        }
        void InitSci(void) // SCI初始化
        {
        EALLOW;
        GpioMuxRegs.GPFMUX.all = 0x0030; // 配置SCI &ndash;TX
        EDIS;
        SciaRegs.SCICCR.all = 0x07;// 8位字符长度
        SciaRegs.SCICTL1.all = 0x03; // 使能 TX
        SciaRegs.SCIHBAUD = 243 >> 8;// 波特率:19200
        SciaRegs.SCILBAUD = 243 & 0x00FF
        SciaRegs.SCICTL1.all = 0x0023;// SCI退出复位
        }
页: [1]
查看完整版本: 基于 DSP 的电子负载:电子负载控制系统软件设计