这一节梳理如何使用C2000库中的ADC模块,从而实现采样;
先预留几个问题,逐步进行解决。
(1)在simulink中C2000的ADC采样模块设置是怎么样的?各个选项卡代表什么?
(2)ADC采样是如何被启动的?
(3)ADC采样回来的值是什么值?是浮点数还是12位AD代表的4096?
在库中搜索ADC采样模块,添加到模型中,其模块如下图所示:
双击后设置面板(1)如下图所示:
该选项指定要使用的DSP模块:
A——显示模块A中的ADC通道(ADCINA0到ADCINA7)。
B——显示模块B中的ADC通道(ADCINB0到ADCINB7)。
A和B——显示模块A和B中的ADC通道(ADCINA0到ADCINA7和ADCINB0到ADCINB7)。
用于信号的采样类型:
Sequential— 顺序采样:0-7或者0-15都是同一时间只转换一路信号?
simultaneous ——同步采样:0-7的一个通道和9-15的一个通道同时转换信号,但是必须要有相同的偏移量,比如ADCINA4和ADCINB4就可以,但是ADCINA7和ADCINB6就不能同一时刻转换
具体的可以参照我以前的ADC底层的博客;
F28335 ADC配置代码模块及其排序方式介绍-CSDN博客
触发转换开始的信号类型:
Software? ——来自软件的信号。转换值在每个采样时间更新。
ePWM#A/ePWM#B/ePWM#A_ePWM#B——? 转换的开始由用户定义的PWM事件控制。(必须配合ePWM模块同时使用,并且ePWM模块需要输出触发的事件)
XINT2_ADCSOC —— 转换的开始由XINT2_ADDCSOC外部信号引脚控制。
设置ADC采样时间。这是从结果寄存器中读取值的速率。
当选择该项为-1时,为异步模式;
值得注意的是:如果想要为不同组的ADC通道设置不同的采样时间,必须向模型中添加单独的ADC块,并为每个块设置所需的采样时间。
设置输出数据的类型,可以被设置的类为?auto
,?double
,?single
,?int8
,?uint8
,?int16
,?uint16
,?int32
, or?uint32
.?
对于DSP28335,其内置的ADC采样是12位的,但是实际数据是无符号16位的即uint16,在单片机编程时需要左移4位后再进行使用;simulink代码生成时会自动处理;
双击后设置面板(2)如下图所示,这个部分就比较简单,设置需要转换的通道数,并且配置第一个第二个或者更多对应的采样管脚;
值得注意的是:在过采样模式中,给定ADC通道处的信号可以在单个转换序列期间被采样多次。若要过采样,请为多个转换指定同一通道。转换后的样本将作为单个向量输出。也就是把多个通道配置为一个引脚;
还可以使用多个输出端口,如果使用多个ADC通道进行转换,则可以为每个输出使用单独的端口,并在块上显示输出端口。如果使用多个通道而不使用多个输出端口,则数据将以单个矢量输出。
这个点需要被重点关注,软件启动和外部触发启动都比较好理解,但是这种一般不常用,电机控制中最常用的还是ePWM模块的事情触发ADC采样,例如在载波的顶点或者在载波的0点;这个需要配合ePWM模块中的事件触发使用,这里提前先设置一下ePWM模块有关的地方,
如下图所示,则配置的是CTR = PRD即载波的顶点时输出事件,勾选Enable ADC start of conversion for module A 后即可在每次CTR = PRD时进行采样;一般选择在载波顶点采样,因此此时电压矢量为零矢量,采样所得电流基本为基波电流;
按照上面的阐述以及文件的说明,DSP28335,其内置的ADC采样是12位的,但是实际数据是无符号16位的即uint16,在单片机编程时需要左移4位后再进行使用;simulink代码生成时会自动处理;但是我觉得还是值得测试一下的;搭建一个这样的模型;设置ePWM1的TRPD = 8192。
假如确实采样模块的输出是以4096为最大值的12位无符号数,那么可以得到一个可预想的结果:假如供电电压是1.65V左右的值,那么此时输出应该是2048左右的值。如下所示,示波器的就不放了,CMPA已经与采样值同步了。
那么就得出结论,simulink代码生成中ADC输出的值即为12位ADC采样后结果寄存器中的值,并且已经完成了左移4位的操作;即 0 - 0 , 1.65 - 2048 , 3.3 - 3096?
上面仅为1路采样结果,配置3路后;结果如下所示;