DSP28335 ADC驱动

0x00 概述

  ADC作为我入门DSP单片机的第一个外设,对我而言有着特殊的意义。本文结合TI官方ADC文档,详细对ADC做一个比较全面的介绍,也算是加深自己的理解。

0x01 什么是DSP?什么是ADC?

  DSP(Digital Signal Processor)即数字信号处理器。这里的DSP指TI公司的数字信号处理芯片,具体点就是-TMS320F28335单片机。相对于ST单片机,DSP单片机更贵,但是性能更强,适合作为电气电力核心数字处理器使用;而ST单片机接口丰富,价格优惠,低功耗等特点,更适合一般商业产品使用。

  ADC(Analog-to-Digital)即模数转换器,通过ADC,可把连续的模拟量转换为离散的数字量供数字处理器运算。DSP28335片上自带12位精度的16通道ADC外设,采集范围电压0~3V对应码值0~4095,转换速率12.5MHz。

0x03 ADC配置过程及注意事项

3.1 ADC框图

ADC框图

3.2 ADC特性

  • 支持16个通道循环采样(单序列发生器)或者两个8通道同时采样(双序列发生器),实际只有一个转换器,但是有两个采样保持器,所以可以同时采样两个信号,只是不能同时转换;
  • 支持EPWM、定时器、外部信号和软件触发,常用EPWM模块做触发源;
  • 转换结果支持DMA接口(未使用过);

3.3 ADC配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
//!中断函数声明  
__interrupt void adc_isr(void);
void ADCInit(void)
{
//! 关闭写保护
EALLOW;
//!150MHz系统时钟,高速外设时钟(HSPCLK)分频到25MHz
SysCtrlRegs.HISPCP.all = 3;
//! ADC时钟25MHz
AdcRegs.ADCTRL1.bit.CPS = 0;
//!ADC采样保持器时钟12.5MHz,这也是ADC数据采样速率
AdcRegs.ADCTRL3.bit.ADCCLKPS = 0;
//!开启ADC外设时钟
SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;
//!TI官方给出的ADC校正函数
ADC_cal();
//! 开启ADC参考和电路
AdcRegs.ADCTRL3.all = 0x00E0;
//!延时等待ADC启动完成
DELAY_US(5000L);
//!连续模式
AdcRegs.ADCTRL1.bit.CONT_RUN = 1;
//!最大转换通道数16
AdcRegs.ADCMAXCONV.all = 0xf;
//!序列发生器,就是每次触发时,ADC转换器转换16个输入通道的顺序,可以自由配置输入通道的顺序,这里配置序列发生器依次为A0~A7,B0~B7。
//! 序列发生器第一个选ADCINA0通道
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;
//! 序列发生器第二个选ADCINA1通道
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1;
//! 序列发生器第三个选ADCINA2通道
AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x2;
//! 序列发生器第四个选ADCINA3通道
AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x3;
//! 序列发生器第五个选ADCINA4通道
AdcRegs.ADCCHSELSEQ2.bit.CONV00 = 0x4;
//! 序列发生器第六个选ADCINA5通道
AdcRegs.ADCCHSELSEQ2.bit.CONV01 = 0x5;
//! 序列发生器第七个选ADCINA6通道
AdcRegs.ADCCHSELSEQ2.bit.CONV02 = 0x6;
//! 序列发生器第八个选ADCINA7通道
AdcRegs.ADCCHSELSEQ2.bit.CONV03 = 0x7;
//! 序列发生器第九个选ADCINB0通道
AdcRegs.ADCCHSELSEQ3.bit.CONV00 = 0x8;
//! 序列发生器第十个选ADCINB1通道
AdcRegs.ADCCHSELSEQ3.bit.CONV01 = 0x9;
//! 序列发生器第十一个选ADCINB2通道
AdcRegs.ADCCHSELSEQ3.bit.CONV02 = 0xa;
//! 序列发生器第十二个选ADCINB3通道
AdcRegs.ADCCHSELSEQ3.bit.CONV03 = 0xb;
//! 序列发生器第十三个选ADCINB4通道
AdcRegs.ADCCHSELSEQ4.bit.CONV00 = 0xc;
//! 序列发生器第十四个选ADCINB5通道
AdcRegs.ADCCHSELSEQ4.bit.CONV01 = 0xd;
//! 序列发生器第十五个选ADCINB5通道
AdcRegs.ADCCHSELSEQ4.bit.CONV02 = 0xe;
//! 序列发生器第十六个选ADCINB6通道
AdcRegs.ADCCHSELSEQ4.bit.CONV03 = 0xf;
//!允许EPWM模块的SOCA信号触发ADC开始转换
AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1;
//!每次转换完成后产生中断
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;
//!注册ADC中断服务函数
PieVectTable.ADCINT = &ISR_ADC;
//! 使能PIE中断
PieCtrlRegs.PIEIER1.bit.INTx6 = 1;
//!使能CPU中断
IER |= M_INT1;
//!使能全局中断
EINT;
ERTM;
//!开启EPWM1时钟
SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1;
//!触发源配置为EPWM1SOCA
EPwm1Regs.ETSEL.bit.SOCAEN = 1;
//!计数器CTRU等于TBPRD时产生SOCA触发信号
EPwm1Regs.ETSEL.bit.SOCASEL = 2;
//!每产生一次就传递信号到ADC模块
EPwm1Regs.ETPS.bit.SOCAPRD = 1;
//!PWM计数周期,决定ADC转换速度,这里转换速度为10K,周期100us;
EPwm1Regs.TBPRD = 15000;
//!向上计数模式
EPwm1Regs.TBCTL.bit.CTRMODE = 0;
//!开启写保护
EDIS;
}
//! 中断服务函数主体
__interrupt void ISR_ADC(void)
{
//! 十六个通道的转换结果,低4位无效,需右移处理。
AdcRegs.ADCRESULT0 >>4;
AdcRegs.ADCRESULT1 >>4;
AdcRegs.ADCRESULT2 >>4;
AdcRegs.ADCRESULT3 >>4;
AdcRegs.ADCRESULT4 >>4;
AdcRegs.ADCRESULT5 >>4;
AdcRegs.ADCRESULT6 >>4;
AdcRegs.ADCRESULT7 >>4;
AdcRegs.ADCRESULT8 >>4;
AdcRegs.ADCRESULT9 >>4;
AdcRegs.ADCRESULT10 >>4;
AdcRegs.ADCRESULT11 >>4;
AdcRegs.ADCRESULT12 >>4;
AdcRegs.ADCRESULT13 >>4;
AdcRegs.ADCRESULT14 >>4;
AdcRegs.ADCRESULT15 >>4;
//!清理中断标志
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;
//!中断应答,表示中断已经被处理过
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;

return;
}

3.4 注意事项

  • 注意原理图上参考电压选取问题,ADCREFSEL寄存器可配置参考电压,默认内部参考。
  • 序列发生器可配置为双序列同时采样或者单序列连续采样,可根据实际需要配置。
  • 主要通道和转换结果读取之间的关系,转换结果寄存器值是按照序列发生器顺序放置的,不一定A0通道就是对应T0寄存器。
  • 如果EPWM外设被使用,此时应注意配置PWM时会不会影响ADC的触发。
  • ADC通道模拟信号建议电压范围-0.3V到3.3V,可用钳位二极管做保护,过高的正负电压可能会导致芯片损坏。

0x04 其他本人使用过的ADC

  • TMS320F28035芯片片上ADC有3个模拟比较器,并且比较器和模数转换功能可以同时使用,比较器功能可以和EPWM模块联合使用,在故障保护或者逐周期斩波限流可以很方便的配置,斩波限流还需要用到比较器的斜坡补偿功能。
  • AD7606芯片,16位双极性ADC,±5V或者±10V电压采集,支持16线并口,4线SPI等接口和处理器连接。
-------------本文结束感谢您的阅读-------------