第1章:DSP基础与选型
大家好,我是你们的讲师。做了十几年伺服驱动,摸过的DSP芯片少说也有几十种。今天咱们聊聊DSP的基础和选型。这部分内容,说白了就是打好地基。地基不稳,后面盖多高的楼都悬。
1.1 DSP芯片概述
DSP,全称Digital Signal Processor,数字信号处理器。它跟普通MCU最大的区别在哪?我打个比方:MCU像个杂货铺老板,啥都能干一点,但干得不够快;DSP像个专业运动员,专攻数字信号处理这一件事,效率极高。
为什么会这样?因为DSP的架构是为信号处理量身定做的。它有个叫“乘累加器”的东西,能在单周期内完成一次乘法和一次加法。你想想看,在伺服控制里,PID运算、坐标变换、滤波器,哪个不是大量的乘加运算?
核心特点:
- 哈佛架构:程序和数据分开存储,取指令和取数据能同时进行
- 硬件乘累加器:单周期完成乘法+加法
- 流水线技术:指令执行像工厂流水线,效率翻倍
- 专门寻址方式:循环寻址、位反序寻址,处理数据块很方便
我记得刚入行那会儿,用普通MCU做伺服电流环,跑到10kHz就卡得不行。后来换成DSP,同样的算法跑到20kHz还绰绰有余。这就是架构带来的差距。
1.2 TI C2000系列DSP介绍
TI的C2000系列,在伺服驱动领域可以说是“标配”。为什么大家都选它?我总结了几点:
| 系列 | 典型型号 | 主频 | 适用场景 |
|---|---|---|---|
| Delfino | TMS320F28335 | 150MHz | 高性能伺服、多轴控制 |
| Piccolo | TMS320F28069 | 90MHz | 中低端伺服、步进电机 |
| 最新系列 | F28002x/F28003x | 100-200MHz | 集成FPU、CLA,性价比高 |
我个人习惯用F28335做原型验证。为什么?因为它的外设丰富,PWM模块、QEP编码器接口、ADC,基本覆盖了伺服驱动需要的所有外设。而且资料多,遇到问题网上搜一搜,基本都有答案。
小提示:如果你刚开始学,建议从F28069入手。价格便宜,开发板好买,而且性能足够跑一个完整的伺服算法。等做产品了再考虑换更高端的型号。
1.3 DSP选型要点
选型这事儿,我踩过不少坑。曾经有个项目,选了个主频很高的DSP,结果发现它的PWM分辨率不够,电流环精度上不去。嗯,这里要注意,选型不能只看主频。
我总结了几个关键点:
- 运算能力:主频、MIPS、是否带FPU。做浮点运算的话,带FPU的芯片能省不少事
- PWM模块:分辨率、死区配置、故障保护。伺服驱动对PWM要求很高
- ADC:采样率、分辨率、同步采样能力。电流采样需要同步触发
- 编码器接口:QEP、绝对值编码器支持。不同编码器协议差别很大
- 通信接口:CAN、SPI、SCI。多轴控制时CAN总线很常用
- 存储资源:Flash、RAM大小。算法复杂了,RAM很容易不够用
避坑指南:我曾经选了一款DSP,Flash只有64KB,结果算法优化了半天还是塞不下。最后只能换芯片,项目延期了一个月。所以,选型时Flash和RAM至少留30%的余量。
1.4 DSP最小系统设计
最小系统,就是让DSP能跑起来的最简电路。说白了,就是供电、时钟、复位、JTAG这四样。
我画个图给大家看看:
设计时要注意几点:
- 供电:DSP通常需要3.3V和1.8V两路电源。上电顺序有要求,一般是先内核后IO。我习惯用TPS767D301这种双路LDO,省事
- 时钟:外部晶振+内部PLL。F28335用30MHz晶振,内部PLL可以倍频到150MHz。注意晶振的负载电容要匹配
- 复位:上电复位电路,RC延时就行。但为了可靠,我建议加个复位芯片,比如MAX809
- JTAG:14针标准接口。注意信号线要加电阻匹配,不然调试时容易断连
经验之谈:JTAG接口的TCK信号,我习惯串一个22欧姆的电阻。这样能有效抑制信号反射,调试更稳定。以前没加这个电阻,经常出现“连接不上目标板”的报错,加了之后基本没再出过问题。
1.5 DSP开发环境CCS搭建
CCS,Code Composer Studio,TI官方的IDE。说实话,早期版本不太好用,但现在的CCS已经很成熟了。
搭建步骤很简单:
- 去TI官网下载CCS安装包,选择对应版本
- 安装时选择C2000系列支持
- 安装仿真器驱动,比如XDS100或XDS200
- 创建工程,选择芯片型号
- 配置编译器选项,优化等级选-O2
这里有个小坑:CCS的编译器版本和芯片型号要匹配。我遇到过用新版本编译器编译老芯片,结果生成的代码跑不起来。后来查了半天,发现是编译器版本太新,对老芯片支持有问题。
快速验证代码:
#include "F2833x_Device.h"
void main(void)
{
// 初始化系统控制
InitSysCtrl();
// 初始化GPIO
InitGpio();
// 关闭看门狗
ServiceDog();
// 主循环
while(1)
{
// 你的代码在这里
}
}
这段代码是最基本的框架。InitSysCtrl()会配置PLL、外设时钟。InitGpio()把GPIO设为默认状态。ServiceDog()是喂狗,防止看门狗复位。
我个人习惯,新建工程后第一件事就是跑个LED闪烁程序。为什么?因为这是验证硬件和软件环境是否正常的最快方法。灯亮了,说明最小系统没问题,CCS也能正常下载调试。
注意:第一次连接仿真器时,可能会提示“驱动未安装”。别慌,去TI官网下载XDS驱动包,手动安装一下就好。另外,仿真器的USB线要用带屏蔽的,不然调试时容易掉线。
好了,这一章的内容就到这里。DSP选型和最小系统设计,是伺服驱动开发的第一步。选对了芯片,搭好了硬件,后面的软件开发才能顺利进行。下一章我们聊聊FPGA的基础知识,敬请期待。
公众号:蓝海资料掘金营,微信deep3321