三大电机控制方案之DSP篇(1):TMS320F28335

25 篇文章 6 订阅

三大电机控制方案之DSP篇(1):TMS320F28335

 

 

简介: TMS320F28335数字信号处理器是属于C2000系列的一款浮点DSP控制器。与以往的定点DSP相比,该器件的精度高,成本低, 功耗小,性能高,外设集成度高,数据以及程序存储量大,A/D转换更精确快速等。


 

 

近几年来,基于DSP的电机专用集成电路由于在计算速度、容量存储等方面比单片机具有更优的性能,已逐渐代替单片机运用于电机控制系统中。目前的大部分电机都把电流环控制作为DSP的一个协处理来考虑,而速度或位置环控制则由 DSP芯片来实现。一般情况下,由于位置控制比较灵活,且差异性比较大,很难做到通用性,所以位置环一般由DSP来直接完成;但速度和电流环相对具有通用性,且互相关联紧密,以致高性能的速度控制都离不开电流控制,因此完全可以把它们集成到一个芯片中处理,这样既可以实现速度伺服控制,又可以单独进行电流控制,还可以和DSP共同构成位置伺服系统。

 

市面上专注于电机控制DSP解决方案的厂商屈指可数,作为世界上最知名的DSP芯片生产厂商,美国德州仪器生产的TMS320系列芯片广泛应用于各个领域,其中TMS320C2000系列便是面向工业控制推出的DSP芯片。

 

TMS320F28335简介

 

TMS320F28335数字信号处理器是属于C2000系列的一款浮点DSP控制器。与以往的定点DSP相比,该器件的精度高,成本低, 功耗小,性能高,外设集成度高,数据以及程序存储量大,A/D转换更精确快速等。

 

TMS320F28335具有150MHz的高速处理能力,具备32位浮 点处理单元,6个DMA通道支持ADC、McBSP和 EMIF,有多达18路的PWM输出,其中有6路为TI特有的更高精度的PWM输出 (HRPWM),12位16通道ADC。得益于其浮点运算单元,用户可快速编写控制算法而无需在处理小数操作上耗费过多的时间和精力,与前代DSP相比,平均性能提高50%,并与定点C28x控制器软件兼容,从而简化软件开发, 缩短开发周期,降低开发成本。

 

功能框图

 

三大电机控制方案之DSP篇(1):TMS320F28335

 

特性

 

高性能静态 CMOS 技术

 

-高达 150MHz(6.67ns 周期时间)

 

-1.9V/1.8V内核,3.3V I/O设计

 

高性能 32 位 CPU(TMS320C28x)

 

-IEEE-754 单精度浮点单元(FPU)(只在 F2833x 上提供)

 

-16 x 16 和 32 x 32 介质访问控制 (MAC) 运算

 

-16 x 16 双 MAC

 

-哈佛 (Harvard) 总线架构

 

-快速中断响应和处理

 

-统一存储器编程模型

 

-高效代码(使用 C/C++ 和汇编语言)

 

6 通道 DMA 处理器(用于ADC,McBSP,ePWM,XINTF 和 SARAM)

 

16 位或 32 位外部接口 (XINTF)

 

-超过 2M × 16 地址范围

 

片载存储器

 

-F28335,F28235:

 

-256K×16 闪存,34K×16 SARAM

 

-F28334,F28234:

 

-128K×16 闪存,34K×16 SARAM

 

-F28332,F28232:

 

-64K×16 闪存,26K×16S ARAM

 

-1K x 16 一次性可编程 (OTP) ROM

 

引导 ROM (8K X 16)

 

-支持软件引导模式(通过 SCI,SPI,CAN,I2C,McBSP,XINTF 和并行 I/O)

 

-标准数学表

 

时钟和系统控制

 

-支持动态锁相环 (PLL) 比率变化

 

-片载振荡器

 

-安全装置定时器模块

 

GPIO0 到 GPIO63 引脚可以连接到八个外部内核中断其中的一个

 

可支持全部58个外设中断的外设中断扩展 (PIE) 块

 

128 位安全密钥/锁

 

-保护闪存 / OTP/RAM 模块

 

-防止固件逆向工程

 

增强型控制外设

 

-多达 18 个脉宽调制 (PWM) 输出

 

-高达 6 个支持 150ps 微边界定位 (MEP) 分辨率的高分辨率脉宽调制器 (HRPWM) 输出

 

-高达 6 个事件捕捉输入

 

-多达两个正交编码器接口

 

-高达 8 个 32 位定时器(6 个 eCAP 以及 2 个 eQEP)

 

-高达 9 个 32 位定时器(6 个ePWM 以及 3 个 XINTCTR)

 

三个 32 位 CPU 定时器

 

串行端口外设

 

-多达 2 个控制器局域网 (CAN) 模块

 

-多达 3 个 SCI (UART) 模块

 

-高达 2 个 McBSP 模块(可配置为 SPI)

 

-一个SPI模块

 

-一个内部集成电路 (I2C) 总线

 

12 位模数转换器 (ADC),16 个通道

 

-80ns 转换率

 

-2 x 8 通道输入复用器

 

-两个采样保持

 

-单一/同步转换

 

-内部或者外部基准

 

多达 88 个具有输入滤波功能可单独编程的多路复用通用输入输出 (GPIO) 引脚

 

JTAG 边界扫描支持 IEEE 标准 1149.1-1990 标准测试端口和边界扫面架构

 

高级仿真特性

 

-分析和断点功能

 

-借助硬件的实时调试

 

开发支持包括

 

-ANSI C/C++ 编译器/汇编语言/连接器

 

-Code Composer Studio IDE

 

-DSP/BIOS

 

-数字电机控制和数字电源软件库

 

低功耗模式和省电模式

 

-支持 IDLE(空闲)、STANDBY(待机)、HALT(暂停)模式

 

-可禁用独立外设时钟

 

字节序:小端序

 

封装选项:

 

-无铅,绿色封装

 

-薄型四方扁平封装 (PGF,PTP)

 

-MicroStar BGA (ZHH)

 

-塑料 BGA 封装 (ZJZ)

 

温度选项:

 

-A:-40°C 至 85°C (PGF,ZHH,ZJZ)

 

-S:-40°C 至 125°C (PTP,ZJZ)

 

-Q:-40°C 至 125°C (PTP,ZJZ)

 

主要模块分析

 

C28x CPU

 

F2833x (C28x+FPU)/F2823x (C28x)系列都属于 TMS320C2000? 数字信号控制器 (DSC)平台。 基于C28x+FPU 的控制器和 TI 现有的 C28xDSC具有相同的 32 位定点架构,但是还包括一个单精度(32 位)的 IEEE 754 浮点单元(FPU)。 这是一个非常高效的的 C/C++ 引擎,它能使用户用高层次的语言开发他们的系统控制软件。 这也使得能够使用 C/C++ 开发算术算法。 此器件在处理 DSP 算术任务时与处理系统控制任务时同样有效而系统控制任务通常由微控制器器件处理。 这样的效率在很多系统中省却了对第二个处理器的需要。 32 x 32 位 MAC 64 位处理能力使得控制器能够有效地处理更高的数字分辨率问题。 添加了带有关键寄存器自动环境保存的快速中断响应,使得一个器件能够用最小的延迟处理很多异步事件。 此器件有一个具有流水线式存储器访问的 8 级深受保护管道。 这个流水线式操作使得此器件能够在高速执行而无需求助于昂贵的高速存储器。 特别分支超前硬件大大减少了条件不连续而带来的延迟。 特别存储条件操作进一步提升了性能。

 

内存总线

 

与很多DSC类型器件一样,多总线被用于在内存和外设以及 CPU 之间移动数据。 C28x 内存总线架构包含一个程序读取总线、数据读取总线和数据写入总线。 此程序读取总线由 22 条地址线路和 32 条数据线路组成。 数据读取和写入总线由 32 条地址线路和 32 条数据线路组成。 32 位宽数据总线可实现单周期 32 位运行。 多总线结构,通常称为哈弗总线,使得 C28x 能够在一个单周期内取一个指令、读取一个数据值和写入一个数据值。 所有连接在内存总线上的外设和内存对内存访问进行优先级设定。 总的来说,内存总线访问的优先级可概括如下:

 

最高级: 数据写入 (内存总线上不能同时进行数据和程序写入。)

 

程序写入 (内存总线上不能同时进行数据和程序写入。)

 

数据读取

 

程序读取 (内存总线上不能同时进行程序读取和取指令。)

 

最低级: 取指令 (内存总线上不能同时进行程序读取和取指令。)

 

ADC

 

TMS320F28335 上有 16 通道、12 位的模数转换器 ADC。他可以被配置为两个独立的 8 通道输入模式,也可以通过配置 AdcRegs.ADCTRL1.bit.SEQ_CASC=1,将其设置为一个 16 通道的级联输入模式。输入的方式可以通过配置AdcRegs.ADCTRL1.bit.ACQ_PS=1,将其设置为顺序采集。即从低通道开始到高通道结束。

 

时钟

 

TMS320F28335 上有一个基于 PLL 电路的片上时钟模块,为 CPU 及外设提供时钟有两种方式:一种是用外部的时钟源,将其连接到 X1 引脚上或者 XCLKIN 引脚上,X2 接地;另一种是使用振荡器产生时钟,用 30MHz 的晶体和两个 20PF 的电容组成的电路分别连接到 X1 和 X2 引脚上,XCLKIN 引脚接地。我们常用第二种来产生时钟。此时钟将通过一个内部 PLL 锁相环电路,进行倍频。由于 F28335 的最大工作频率是 150M,所以倍频值最大是 5。其中倍频值由 PLLCR 的低四位和 PLLSTS 的第 7、8 位来决定。

 

外部中断

 

支持8 个被屏蔽的外部中断 (XINT1–XINT7, XNMI)。 XNMI 可被连接至 INT13 或者 CPU 的 NMI 中断。这些中断中的每一个可被选择用于负边沿、正边沿或者正负边沿触发,并且可被启用或禁用(包括XNMI 在内)。 XINT1, XINT2,和 XNMI 还包含一个 16 位自由运行的上数计数器,当检测到一个有效的中断边沿时,该计数器复位为 0。 这个计数器可被用于为中断精确计时。 与 281x 器件不同,没有用于外部中断的专用引脚。 XINT1,XINT2 和 XINT 中断可接受来自 GPIO0-GPIO31 引脚的输入。 XINT3–XINT7 中断可接受来自 GPIO32-GPIO63 引脚的输入。

 

三大电机控制方案之DSP篇(1):TMS320F28335

 

电机相关应用领域

 

电机控制:AC 感应

 

三大电机控制方案之DSP篇(1):TMS320F28335

 

电机控制:低电压

 

三大电机控制方案之DSP篇(1):TMS320F28335

 

电机控制:步进电机

 

三大电机控制方案之DSP篇(1):TMS320F28335

 

电机控制:永久磁性

 

三大电机控制方案之DSP篇(1):TMS320F28335

 

电机控制:高电压

 

三大电机控制方案之DSP篇(1):TMS320F28335

 

工程师开发过程中常见问题总结

 

1.SPI驱动TLE7241E出现返回值不对的问题。主要是由于时序的不对,导致TLE7241E输入采样时数据还没有建立,所以TLE7241E收到的命令不正确,所以返回值不正确。

 

2.SPI驱动EEPROM时,如果用金属物触到clock pin时,能正确运行,否则不能正确运行。出现次问题也是由于时序的问题,金属物触到clock导致clock出现微小幅度的偏移,导致正好和 eeprom的时序对上,而不用金属物触碰时时序不正常,当使dsp MOSIpin数据发送提前半个周期后,eeprom工作正常。

 

3.示波器有时会导致显示的波形被消尖,所以用示波器测量时周期不能太大。

 

TMS320F28335部分模块使用经验

 

1.TMS320F28335+总线:

 

硬件连接情况(28335+cpld+ad7606):Cpld负责对地址译码,16位数据线接并口AD7606的D0~D15,再用几个GPIO分别接ad7606的busy、reset、CONVST.

 

软件思想:timer0控制采样速率,busy配置为外部中断输入脚,转换完成即可触发中断,在外部中断函数里把转换结果读取。

 

遇到问题:数据线上只有D0~D7有数据变换,D8~D15全为0。

 

问题分析:D8~D15和地短路了,busy时间太短、不能触发中断,ad配置为了8位模式,等等…

 

解决问题:把问题一个个排除,最后原因是数据线D8~D15在cpld连接部分未定义。

 

2.TMS320F28335+SCI模块:

 

硬件连接:F28335有三个串口,SCIA、SCIB、SCIC,这里用SCIC+232芯片接口即可与 PC机通信。

 

功能验证:使用串口调试助手发送数据,28335收到数据后再发给PC

 

软件设计:使用FIFO、查询方式发送和接收数据、配置好相应的寄存器就可以使用了,主要代码分享如下。

 

for()

 

{

 

while(ScicRegs.SCIFFRX.bit.RXFFST == 0); { }

 

data = ScicRegs.SCIRXBUF.all;

 

ScicRegs.SCITXBUF= data;

 

while(ScicRegs.SCIFFTX.bit.TXFFST != 0);

 

}

 

void scic_init() //初始化

 

{

 

ScicRegs.SCICCR.all =0x0007;

 

ScicRegs.SCICTL1.all =0x0003; // enable TX, RX, internal SCICLK,

 

// Disable RX ERR, SLEEP, TXWAKE

 

ScicRegs.SCICTL2.all =0x0;

 

#if (CPU_FRQ_150MHZ)

 

ScicRegs.SCIHBAUD =0x0001; // 9600 baud @LSPCLK = 37.5MHz.

 

ScicRegs.SCILBAUD =0x00E7;

 

#endif

 

#if (CPU_FRQ_100MHZ)

 

ScicRegs.SCIHBAUD =0x0001; // 9600 baud @LSPCLK = 20MHz.

 

ScicRegs.SCILBAUD =0x0044;

 

#endif

 

ScicRegs.SCIFFTX.bit.TXFIFOXRESET=0;

 

ScicRegs.SCIFFRX.bit.RXFIFORESET=0;

 

ScicRegs.SCIFFTX.all=0xE040;

 

ScicRegs.SCIFFRX.all=0x2040;

 

ScicRegs.SCIFFCT.all=0x0;

 

ScicRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset

 

}

 

3.TMS320F28335+I2C模块:

 

注意一下两点

 

(1)、从机地址:

 

由于28335的I2C模块会自动添加R/W位,应将从机地址右移一位。如:选用模块7位地址模式时,若使用的I2C芯片从机地址为0xD0,则设置时应置从机地址为0x68。

 

(2)、子地址:

 

I2C器件的子地址有的是8位、有的是16位,16位的发送子地址的时候要发送2次、分别发高8位和低8位,因为28335的I2C模块数据发送寄存器是8位的。

 

4.TMS320F28335+SPI模块:

 

(1)、主设备配置SPI模块的时钟模式时要根据从设备的时钟要求,要搞清楚从设备发送和接收数据是在时钟的上升沿还是下降沿。时钟配置正确后,数据才能被准确的发送和接收。

 

(2)、主设备读取数据时必须先发送一个无意义的数以启动时钟。

 

典型设计案例

 

1.高速数据采集电路设计

 

针对超声波流量计中高速数据采集的需求,采用32位浮点实时MCU 芯片 TMS320F28335和高速A/D转换器ADS805E设计了一种12位分辨率,20MSPS的高速数据采集电路。数据接口通过外部扩展接口 Xintf扩展,使用DMA高速读取转换后的数据,控制接口通过GPIO口实现。文中给出了硬、软件设计及测试结果,该接口电路具有高性能,接口简单,低成本等特点,已经在研制的超声波流量计中应用。

 

三大电机控制方案之DSP篇(1):TMS320F28335

 

2.三相SPWM波在TMS320F28335中的实现

 

载波相移正弦脉宽调制(SPWM)技术是一种适用于大功率电力开关变换装置的高性能开关调制策略,在有源电力滤波器中有良好的应用前景。本文介绍了如何利用高性能数字信号处理器TMS320F28335的片内外设事件管理器(EV)模块产生三相SPWM波,给出了程序流程图及关键程序源码。该方法采用不对称规则采样算法,参数计算主要采用查表法,计算量小,实时性高。在工程实践中表明,该方法既能满足控制精度要求,又能满足实时性要求,可以很好地控制逆变电源的输出。

 

三大电机控制方案之DSP篇(1):TMS320F28335

 

3.PMSM伺服系统的设计

 

交流永磁同步电机(PMSM)伺服系统已广泛应用于在工业领域。为了提高系统的控制性能,设计了以数字信号控制器TMS320F28335为控制核心,主电路为AC/DC/AC拓扑结构,采用矢量控制策略的高性能PMSM伺服系统,并将所构成的系统与基于TMS320F2812的系统进行了比较。相关实验证明,该系统具有更好的响应速度和控制精度。

 

三大电机控制方案之DSP篇(1):TMS320F28335

  • 18
    点赞
  • 158
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
以下是一个简单的DSP电机驱动程序的例子,用于控制直流电机的速度和方向: ``` #include <dsp.h> #include <stdio.h> // 定义PWM参数 #define PWM_FREQ 20000 // PWM频率 #define PWM_PERIOD (1.0/PWM_FREQ) #define PWM_DUTY_CYCLE_MIN 0.0 // 最小占空比 #define PWM_DUTY_CYCLE_MAX 1.0 // 最大占空比 // 定义电机驱动器参数 #define MOTOR_PWM_PIN 1 // PWM输出引脚 #define MOTOR_DIR_PIN 2 // 方向控制引脚 // 定义速度反馈参数 #define ENCODER_PIN 3 // 编码器输入引脚 #define ENCODER_RESOLUTION 1000 // 编码器分辨率 // 定义PID参数 #define KP 0.1 // 比例系数 #define KI 0.01 // 积分系数 #define KD 0.001 // 微分系数 // 定义常量 #define PI 3.14159265358979323846 // 初始化PWM模块和编码器模块 void init_pwm_encoder() { // 初始化PWM模块 DINT; InitPieCtrl(); IER = 0x0000; IFR = 0x0000; InitPieVectTable(); EALLOW; CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0; EDIS; InitEPwm1(); ConfigCpuTimer(&CpuTimer0, 200, 1000000/PWM_FREQ); CpuTimer0Regs.TCR.all = 0x4001; EINT; // 初始化编码器模块 InitEQep1Gpio(); InitEQep1(); } // 初始化PID控制器 void init_pid_controller() { // 初始化PID控制器 PID_Handle myPID; PID_Obj myPIDobj; PID_Handle *myPIDptr; myPIDptr = &myPID; myPID = &myPIDobj; myPID->Kp = KP; myPID->Ki = KI; myPID->Kd = KD; myPID->Ref = 0.0; myPID->Fdb = 0.0; myPID->Out = 0.0; myPID->Err = 0.0; myPID->Err1 = 0.0; myPID->Err2 = 0.0; myPID->Ui = 0.0; myPID->Up = 0.0; myPID->Ud = 0.0; myPID->OutMax = PWM_DUTY_CYCLE_MAX; myPID->OutMin = PWM_DUTY_CYCLE_MIN; PID_init(myPIDptr); } // 电机控制函数 void motor_control(float speed_ref) { // 读取编码器反馈信号,计算电机转速 float speed_fdb = ((float)EQep1Regs.QPOSCNT/(float)ENCODER_RESOLUTION)*2*PI*PWM_FREQ; // 计算PID输出 float u = PID_run(&myPIDobj, speed_ref, speed_fdb); // 控制PWM输出占空比 if(u < 0) { GpioDataRegs.GPASET.bit.MOTOR_DIR_PIN = 0; // 设置方向引脚为反转 EPwm1Regs.CMPA.half.CMPA = (Uint16)(-u*PWM_PERIOD*PWM_FREQ); // 设置PWM占空比 } else { GpioDataRegs.GPASET.bit.MOTOR_DIR_PIN = 1; // 设置方向引脚为正转 EPwm1Regs.CMPA.half.CMPA = (Uint16)(u*PWM_PERIOD*PWM_FREQ); // 设置PWM占空比 } } // 主函数 void main(void) { init_pwm_encoder(); // 初始化PWM模块和编码器模块 init_pid_controller(); // 初始化PID控制器 while(1) { motor_control(1000); // 控制电机转速为1000rpm } } ``` 以上代码仅为示例,具体实现需要根据电机和控制器的实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值