2. DSP控制器基础:DSP芯片概述、TMS320F28335介绍、DSP开发环境搭建(CCS)、第一个LED闪烁程序
2.1 DSP芯片到底是什么?
很多刚入行的朋友问我:DSP和普通单片机有啥区别?
我一般这么解释:普通单片机像是个全能选手,啥都能干一点。DSP呢,它是个偏科生——特别擅长做数学运算。尤其是乘法和加法,它能在一个时钟周期内完成。
你想想看,在电机控制里,我们要做PID运算、坐标变换、SVPWM调制。这些全是乘加运算。用普通单片机做,算一个坐标变换可能要几十微秒。用DSP,几微秒就搞定了。
我个人习惯把DSP比作「数学加速器」。它内部有专门的硬件乘法器,还有哈佛结构——程序和数据分开存储,取指令和取数据可以同时进行。这就像两条高速公路同时跑车,效率自然高。
核心要点:DSP = 普通CPU + 硬件乘法器 + 哈佛结构 + 专用指令集
2.2 TMS320F28335——我用了十年的芯片
说到伺服驱动,TMS320F28335是绕不开的一颗芯片。我在2014年第一次用它做项目,到现在还在用。为什么?因为它太适合电机控制了。
来看看它的关键参数:
| 参数 | 数值 | 我的评价 |
|---|---|---|
| 主频 | 150MHz | 够用,做双轴控制没问题 |
| Flash | 512KB | 放一个伺服算法绰绰有余 |
| SRAM | 68KB | 注意别把大数组放这里 |
| PWM通道 | 18路 | 控制三个电机都够 |
| ADC精度 | 12位 | 做电流采样刚好 |
| eQEP | 2个 | 接编码器用的,很关键 |
嗯,这里要注意一点:F28335是32位浮点DSP。这意味着你写PID的时候,直接用float算就行,不用像定点DSP那样做Q格式转换。我在第一个伺服项目里就吃了这个亏——一开始用定点DSP,Q15格式把我折腾得够呛。后来换成F28335,代码量直接砍了一半。
我的建议:新手入门伺服驱动,直接选F28335。别在定点DSP上浪费时间。浮点运算带来的便利性,远大于那点成本差异。
2.3 开发环境搭建——CCS的安装与配置
CCS全称Code Composer Studio,是TI官方的IDE。说实话,它不算好用,但没办法,F28335只能用这个。
安装步骤我快速过一遍:
- 去TI官网下载CCS,建议选v10或v12版本
- 安装时选择C2000系列支持
- 安装XDS100仿真器驱动
- 配置Workspace路径——我习惯用
D:\workspace\dsp
我曾经遇到过一个问题:装完CCS后连不上仿真器。折腾了两天,最后发现是USB驱动没装好。所以这里提醒大家:先装驱动,再开CCS。顺序反了容易出问题。
配置好之后,新建一个工程。选芯片型号时注意:F28335有好几个版本,比如PGFA、PGFQ。我一般选 TMS320F28335PGFA,这个最常用。
避坑指南:新建工程时,记得把 rts2800_fpu32.lib 加进去。这个库是浮点运算支持库,不加的话,float运算会出问题。我曾经因为这个库没加,查了整整一个下午的bug。
2.4 第一个LED闪烁程序
好了,环境搭好了,我们来写第一个程序。按照惯例,点个LED。
F28335的GPIO控制很简单。每个GPIO有3个寄存器:方向寄存器、数据寄存器、上拉寄存器。
看代码:
#include "DSP2833x_Device.h" // 头文件
#include "DSP2833x_Examples.h" // 例程库
void main(void)
{
// 1. 初始化系统
InitSysCtrl();
// 2. 关闭看门狗
EALLOW;
SysCtrlRegs.WDCR = 0x00AF;
EDIS;
// 3. 配置GPIO34为输出(开发板上的LED通常接这个引脚)
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO34 = 0; // 设置为普通IO
GpioCtrlRegs.GPADIR.bit.GPIO34 = 1; // 设置为输出
EDIS;
// 4. 主循环
while(1)
{
GpioDataRegs.GPASET.bit.GPIO34 = 1; // 拉高,LED亮
DELAY_US(500000); // 延时500ms
GpioDataRegs.GPACLEAR.bit.GPIO34 = 1; // 拉低,LED灭
DELAY_US(500000); // 延时500ms
}
}
代码很简单,但有几点我要强调:
- EALLOW和EDIS:这是保护机制。写某些关键寄存器前,必须先EALLOW解锁。我见过有人忘了这个,寄存器写不进去,查了半天。
- GPASET和GPACLEAR:用这两个寄存器操作IO,比直接写GPADATA更安全。因为它是原子操作,不会被中断打断。
- DELAY_US:这是TI提供的延时函数。注意参数单位是微秒,500000就是500ms。
重要提醒:第一次下载程序时,记得把仿真器设置为「擦除Flash并下载」。否则程序可能跑不起来。具体操作:在CCS的Debug配置里,选择 Erase Flash + Download。
2.5 本章知识体系
下面这张图,是我自己总结的DSP入门知识框架。你看一遍,心里就有数了。
这张图把本章内容串起来了。你从DSP概述开始,了解它为什么适合做伺服控制。然后熟悉F28335的硬件资源。接着搭建CCS环境。最后跑通第一个程序。每一步都是下一章的基础。
个人经验:我教过不少新人,发现最容易卡住的地方是CCS环境搭建。如果你遇到问题,别硬扛。去TI的E2E论坛搜一下,或者直接换一个CCS版本。有时候v12不行,v10反而稳得很。
好了,这一章就到这里。LED能亮起来,说明你的开发环境没问题,芯片也正常工作。下一章我们会深入GPIO,讲怎么用它来模拟通信协议。嗯,到时候你会看到,DSP的GPIO远不止点灯这么简单。
公众号:蓝海资料掘金营,微信deep3321