自己设计的 TMS320F28335 仿真板原理图,实际应用效果好
- 格式:doc
- 大小:66.50 KB
- 文档页数:1
Science and Technology &Innovation ┃科技与创新2021年第01期·167·文章编号:2095-6835(2021)01-0167-02基于TMS320F28335的直流无刷电机控制技术应用张兵1,杨浩2(1.南阳农业职业学院机电工程系,河南南阳473000;2.洛阳职业技术学院机电工程学院,河南洛阳471000)摘要:近年来直流无刷电机以质量轻、调速范围精确和故障率低等优点被应用于汽车、工业机器人和家用电器等领域,根据电机调速特性,可分为直接转矩控制和脉宽调速控制,按照直流无刷电机导通形式可分为三三导通和两两导通,在闭环控制中,直流无刷电机控制方式有PID 控制、抗扰控制、模糊控制和自适应控制等多种形式。
其中,电机高性能的精确控制需要电机本体、驱动和控制器组成,常见的直流无刷电机控制芯片是由TI 公司生产的TMS320F28335芯片,它具有专门的霍尔输入模块和电机换相、死区补偿等模块,参考不同的应用环境和要求,可选择适合直流无刷电机特性的控制方式。
关键词:直流无刷电机;调速;PID ;异步交流电机中图分类号:TM33文献标志码:A DOI :10.15913/ki.kjycx.2021.01.0681引言直流无刷电机简称BLDCM ,既具备异步交流电机运行可靠、转矩平稳、维护方便等优点,同时又具备直流有刷电机体积小、运行效率高、调速范围广和调速性能好等特点,它的出现弥补了常见电机摩擦大、寿命短和效率低等缺点,被广泛应用于汽车、家用电器、智能家居及工业生产等领域中[1]。
直流无刷电机的高性能控制是由控制策略和控制器决定,考虑电机具有非线性、强耦合等特性[2],运行过程中需要时刻进行换相等操作,因此选择由TI 公司生产的TMS320F28335作为主控芯片,并设计直流无刷电机双闭环控制系统,实现电机调速过程具有响应时间快、无超调和鲁棒性强等优点。
基于TMS320F28335的电机控制系统设计电机控制系统在现代工业中起着举足轻重的作用,它被广泛应用于机器人、自动化生产线、电力传输等领域。
随着科技的发展,数字控制系统已经逐渐取代了传统的模拟控制系统,成为了电机控制系统中的主流。
在数字控制系统中,单片机芯片作为控制核心,成为了实现电机控制的重要工具。
本文将基于TMS320F28335单片机芯片,介绍电机控制系统的设计过程。
一、单片机选型在电机控制系统中,单片机芯片作为控制核心至关重要。
因此,单片机的选型是设计过程中最为关键的一步。
TMS320F28335作为一款高性能的DSP芯片,在数字控制系统中广泛应用。
TMS320F28335内置了多个PWM模块、模拟转换器、CAN总线等外设,可以支持多种电机的控制。
二、硬件设计电机控制系统的硬件设计包括电机驱动器、控制板、驱动模块等。
其中,电机驱动器通常使用功率半导体器件,如IGBT、MOSFET等。
控制板上包括单片机、PWM模块、模拟转换器等。
驱动模块是将单片机产生的PWM信号转换成可以驱动电机的电平信号的模块。
根据具体的控制要求,还可以加入如编码器、位置传感器等反馈元件。
三、软件设计电机控制系统的软件设计主要包括控制算法、PID参数的调试以及驱动程序的编写。
控制算法需要根据电机的类型和控制要求进行设计,常见的有矢量控制、FOC控制、直接转矩控制等。
PID 参数的调试是优化控制算法的一个重要步骤,需要根据实际情况进行逐步调整。
驱动程序的编写主要是将控制算法转化为可以在单片机上运行的程序。
四、调试实验在完成软硬件设计之后,需要进行实验调试。
首先进行板级调试,检验电路是否正常。
然后进行控制算法的调试,测试控制效果以及PID参数的设置合理性。
最后进行整个系统的调试。
在实验过程中,还需要注意电机的安全操作。
五、应用场景基于TMS320F28335的电机控制系统可以应用于多种不同类型的电机控制,如直流电机、交流电机、步进电机等。
TMSF28335在控制系统中的实际应用1.基本原理图:2.硬件设计:1,在F28335型号的DSP芯片内没有集成D/A转换器,如果需要运用D/A转换的功能,可以通过XINTF接口扩展并行接口的D/A转换芯片,或者通过SPI接口扩展串行接口的D/A 转换芯片,此处采用到的XINTF接口并行扩展的D/A转换芯片。
TMS320F28335的外部接口映射到3块固定的存储空间:Zone 0、Zone 6、Zone 7,当访问外部接口的存储空间时,与该存储空间对应的片选信号XZCS0、XZCS6、XZCS7变为有效的低电平,本题目中采用Zone 7对应的外部接口存储空间,其起始地址为0X200000~0X2FFFFF,对应的外部接口的片选信号为XZCS7,并采用GPIOA1和GPIOA2(I/O功能)为D/A芯片提供功能使能信号。
2,DSP芯片与D/A之间的数据线由GPIO的C口提供(复用C口的GPIO68~GPIO79的数据数据传输功能)。
3,对于输入一阶惯性环节的信号,按阶跃信号进行处理,由自动控制原理可以得,其响应信号为:其中τ为时间常数,当t=3τ时,响应达到稳态值的95%,作为最终的输出响应。
硬件连接图3.软件控制编程:实现功能:AD采样+PI调节+一阶惯性/*****************head file********************/#include "DSP2833x_Device.h"#include "DSP2833x_Examples.h"/****************macro*****************/#define S1 AdcRegs.ADCST.bit.INT_SEQ1/***************global variable************/float this_zl;float upon_zl;int PIn=0; //symbol parameterint SCn=0; // symbol parameterfloat adclo=0; //AD referenced voltagefloat adcres=65536;float Ta; //一阶系统时间常数float temp=0.950213;int sc_D;float mf_scz;float mf_sc; //outputunsigned int * Sda;float power_set;float power_get; // actual output voltagefloat KP_wr; //PI proportion coefficientfloat KI_wr; //PI integral coefficientfloat error_sg; //PI correlative parameterfloat error_1;float error_2;/****************function*******************/interrupt void cpu_timer0_isr(void);interrupt void ad_isr(void);void Init_Timer0(void);void Init_Xintf(void);void Init_Gpio(void); //GPIO initialization program void Initadc(void); //AD initializefloat PI_T(float power_sd,float pow_in); //PI control functionvoid delay_ys(void); //delay subprogram/***************main function**********************/void main(void){unsigned int * Sda =(unsigned int *) 0x200000; //define DA address,XINTF Zone7 InitSysCtrl(); // initialize system subprogramInit_Timer0();DINT;InitPieCtrl();IER=0x0000;IFR=0x0000;InitPieVectTable();Init_Gpio();Initadc();Init_Xintf();CpuTimer0Regs.TCR.bit.TIE=1;EALLOW; // 解除寄存器保护PieVectTable.TINT0=&cpu_timer0_isr; //用CUP_Timer0中断函数入口更新//PIE向量表PieVectTable.ADCINT=&ad_isr; //用AD中断函数更新PIE向量表EDIS; //使能寄存器保护ConfigCpuTimer(&CpuTimer0,150,500); //timing 500usStartCpuTimer0();PieCtrlRegs.PIEIER1.all=0x60; //使能PIE内的CUP_Timer0和AD//中断IER |=0x0001; // 使能CPU INT 1EINT;}*****************CPU timer initialization***********************************void Init_Timer0(void){CpuTimer0Regs.PRD.all=75000; //set timer period timing:500usCpuTimer0Regs.TPR.all=0;CpuTimer0Regs.TPRH.all=0;//CpuTimer0Regs.TCR.bit.TSS=1; //stop timer}********************A/D initialization**********************************void Initadc(void){long i; //AD initializeAdcRegs.ADCTRL1.bit.RESET=1;for(i=0;i<100;i++) {};AdcRegs.ADCTRL1.bit.RESET=0;AdcRegs.ADCTRL1.bit.SUSMOD=0;AdcRegs.ADCTRL1.bit.ACQ_PS=0; //setting sample windowAdcRegs.ADCTRL1.bit.CPS=0;AdcRegs.ADCTRL1.bit.CONT_RUN=0; //启动-停止模式AdcRegs.ADCTRL1.bit.SEQ_CASC=0; //AdcRegs.ADCTRL3.bit.ADCBGRFDN=3; //给ADC模块的内部基准电路上电for(i=0;i<400000;i++) {}; //delay more than 7msAdcRegs.ADCTRL3.bit.ADCPWDN=1; //给ADC模块的其余模拟电路上电for(i=0;i<10000;i++) {}; //delay more than 20usAdcRegs.ADCTRL3.bit.ADCCLKPS=10;AdcRegs.ADCTRL3.bit.SMODE_SEL=0; //choose sample styleAdcRegs.ADCMAXCONV.all=0x0000;AdcRegs.ADCCHSELSEQ1.bit.CONV00=0x0000;AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;AdcRegs.ADCTRL2.bit.RST_SEQ1=1; //复位排序器1AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1; //SEQ1 interruptAdcRegs.ADCTRL2.bit.INT_MOD_SEQ1=0; //choose interrupt style}*********************external peripherals initialization****************************** void Init_Xintf(void){EALLOW;XintfRegs.XINTCNF2.bit.XTIMCLK=1;XintfRegs.XTIMING6.bit.XWRLEAD=3;XintfRegs.XTIMING6.bit.XWRACTIVE=7;XintfRegs.XTIMING6.bit.XWRTRAIL=3;XintfRegs.XTIMING6.bit.XRDLEAD=3;XintfRegs.XTIMING6.bit.XRDACTIVE=7;XintfRegs.XTIMING6.bit.XRDTRAIL=3;XintfRegs.XTIMING6.bit.X2TIMING=0;EREADY=0;XintfRegs.XTIMING6.bit.XSIZE=3;EDIS;}********************************I/O initialization*******************************void Init_Gpio(void){EALLOW; //GPIO initializeGpioCtrlRegs.GPBMUX1.all=0xFFFFFC00; //设置B口为地址线以及DAC片选信号GpioCtrlRegs.GPCMUX1.all=0xFFFFFFFF; //set C Port as date addressGpioCtrlRegs.GPAMUX1.all=0x0000;GpioCtrlRegs.GPADIR.all= 0x0003;GpioDataRegs.GPADA T.all= 0x0003;GpioDataRegs.GPACLEAR.all= 0x0003; //choose GPIO1,2 as DA signal address EDIS;}****************************PI function****************************************** portal parameter:power_sd and pow_inexport parameter:this_zlfloat PI_T(float power_sd,float power_in){error_1 = error_sg;error_sg = power_sd - power_in;error_2 = error_sg - error_1;if(PIn == 0){error_2 = 4.0; //avoid error_2 too largePIn++;}this_zl = KP_wr*error_sg + KI_wr*error_2;error_sg = error_1;return this_zl;}*******************************Delay function*********************************** void delay_ys(void){long i;for(i=0;i<100000;i++) {};}*************************timer 0 interrupt deal function***********************interrupt void cpu_timer0_isr(void){DINT;StopCpuTimer0();CpuTimer0Regs.TCR.bit.TIF=1; //清CPU定时器0的中断标志PieCtrlRegs.PIEACK.all |=0x0001; //使能第一组中断以使AD产生的中断能// 被CPU响应AdcRegs.ADCTRL2.bit.SOC_SEQ1=1; //使能排序器,启动AD转换EINT;while(S1==0) {}; //等待AD转换的完成delay_ys();}************************AD interrupt function*********************************interrupt void ad_isr(void){DINT;AdcRegs.ADCTRL2.bit.RST_SEQ1=1;power_get=((float)AdcRegs.ADCRESULT0)*3.0/adcres + adclo; //对采样数据进行转换if(SCn == 0){mf_scz = 2.5;SCn++;}mf_sc=mf_scz;upon_zl=PI_T( power_get, mf_sc); //调用PI环节的函数mf_sc=1/Ta * upon_zl * temp; //通过一阶惯性环节的处理delay_ys();mf_scz=mf_sc;sc_D=(int)(mf_sc * 4096)/5;* (Sda) = sc_D; //写数据到DA的数据线AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;PieCtrlRegs.PIEACK.all |=0x0001; //使能第一组中断EINT;StartCpuTimer0(); //启动定时器0,开始下一次采样}。