您的当前位置:首页DSP-AD学习心得

DSP-AD学习心得

2022-05-27 来源:爱问旅游网
DSP-AD模块学习的心得

1.AD采样的高级教程

经过这几天的忙碌,我感觉我对2812的AD模块又有了一些新的理解,感觉AD的框架已经被我架出,现在来说明这几天对其中的理解。1.1.AD的结构

首先还是要接受一下AD的基本结构吧!把几个容易混淆哦概念重新的定位,让大家看看我自己的理解,①双排序和级联工作模式②顺序采样和同步采样③启停/连续工作模式

这三个概念是我自己学习的时候容易混淆或是不知道如何才能很好运用的一个门槛

下面以一个图形来表示他们之间的关系

顺序采样启停工作模式AD工作模式连续工作模式双排序同步采样顺序采样同步采样双排序顺序采样同步采样级联顺序采样同步采样级联所以2812AD总共有8种工作方式可以实现,在实际运用中可以根据自己的需要选择合适的工作方式。

1.2.AD模块时钟问题的提出①高速时钟

②ADCLK-AD模块时钟

③事件管理器时钟(如果要用到EVA/B来触发AD启动的时候)

外接晶体振荡器时钟PLL锁相环控制系统输入时钟CPU系统输出时钟SOC脉冲发生高速预Cps=0订标器x14位时钟分频高速时钟输出ADCclk(1/4,1/2..1/30)x1/2Cps=1以上就是整个和系统、AD模块相关的所有时钟的信息。当然里面涉及很多寄存器,各个寄存器的设置可以查相关的资料得出自己想要的合适的时钟和相应的采样保持脉冲的宽度。

1.3几个基本概念

接下来解释几个常混的概念,但是都是本人个人的理解不一定准确。①AD采样频率②AD启动频率

③AD的采样保持宽度④AD的转换时间

以及这些跟ADCclk之间的联系?

首先来说明一下AD采样频率,我个人认为AD采样频率就是1S中采样多少个点,那么根据实际运用AD模块的经验,你自己启动几次AD模块,它就采样几次,意味着其实AD的采样频率就是AD的启动频率,如果你用事件管理器来触发的话,那么触发频率也同样是AD的采样频率,也就是你所用的通用定时器的定时时间。其次,AD的采样保持时间,这个是一定AD启动就马上开始采样,由于采样这个过程就是给电容充电的过程,那么就是意味着要需要一段的时间电容才可以电荷把电荷储存起来,采样保持时间就是起到这个作用的,但是和AD的启动频率有什么关系呢?个人认为AD的采样频率就是相邻两个采样点之间的时间间隔应该要大于采样保持器保持的时间,这样才可以保证在下一次采样触发到来之前把信号可靠的保持下来。最后讲到,AD的转换时间,这个就是采样保持后,要将保持的模拟量转换成数字量,就要通过内部的转换器,转换器的时间跟ADCclk有关。因为大家都知道AD转换器转换需要给他提供时钟,那么时钟频率越高,转换的速度越快,这样转换时间就越小。

这些关系希望大家可以理解清楚,不过以上都是本人自己的理解,希望可以帮我指出错误的地方。

⑤合理的安排计算这些频率和时间是AD采样的关键,比如一个正弦信号如果您要求他要在一个正弦波的一个周期内采样24个点,那么首先要确定AD

的启动频率也就是采样频率,即20毫秒内采样24点,那么就可以确定1秒内要采多少个点了,也就是可以确定相邻两个采样点之间的时间间隔,即20毫秒/24=0.8333毫秒;这样就可以根据EV事件管理器的时钟来确定通用定时器的周期寄存器的值(假设用周期匹配中断来触发)如果高速时钟的频率是75M赫兹,其中EV时钟的分频系数为x,那么就可以知道count=75*8333.3/x来确定计数值了

⑥就是合理的安排采样的保持时间也是关键啊!不过对以咱们所有的50

赫兹的低频来说在采样点很少的时候,比如几十个点可能会不重要,主要原因是如果高速时钟在75赫兹下,你把ADCCLKPS设为15,CPS设为1这样ADCCLK=75/(ADCCLKPS*2*(1+CPS))MHz,则对应的采样窗口宽度,你即使将ACQ_PS设为15,这样宽度也只有,25.6us,除非你降低高速时钟的频率,但是降低了也会影响AD的装换速度。但是在采样频率高的时候即采样的点数多的时候,这个就要考虑了,采样点数多了,意味着采样点之间的间隔缩小了,如果多到一定的程度时候,可能之间的间隔会达到uSs级别,这样你就要考虑采样的间隔要大于采样保持的时间,因为这样才可以保证可靠的保持数据,否者就会出现采样出错。

⑦在采样过程中,要想让AD准确并且按照要求的点数进行采样的话,一定要配置好AD的分频时钟,至少要对它进行一次分频,然后在ACQ_PS内设置相应的保持参数,当然分频数再增大也无妨。要想按照自己的点数进行采样,建议不要用到AD本身的中断来进行出来,本人试了许久发现用AD本身的中断来进行采样你会发现不管你是如何设置你的点数,基本都是5、6个,根本改变不小,看了些论坛上说了,利用中断进行AD转换了可能会有些振荡,中断进出栈需要时间,中断返回不能肯定信息的原始化,等等,导致产生的结果不是很令人满意,所以建议采用外部中断来触发置标志位,根据标志位了进行控制AD的采样进行了。

1.4.ADC的加电顺序

这个不用我来细说了,因为你翻开任意一本参考书,都会说明这个东西,其中特别要提示的一点,也是我自己在编程中忽略的,①如果你看了AD很多例程你就会发现,在配置AD寄存器,或是加电ADC模块之前,都要对AD模块进行一次软件复位,这个复位不是复位排序器而是整个AD模块进行一次复位,复位之后要进行一个小的延时,这是一个要注意的地方。②就是已经复位完成,已经开始配置寄存器后,尤其是加电的这些寄存器,以后就不能出现AD模块整体复位指令,否则你要重新进行AD的所有寄存器的配置,包括加电寄存器。我忽略的就是在配置完寄存器后,对AD的进行再次的复位,但是没有对加电、其他寄存器进行重新配置,导致进行AD转换的时候没有反应。

1.5关于AD的触发集和相应的中断操作

看过DSP书的人都知道,到底有AD中排序器的作用,它是TI的AD的一

大特色,排序起着指挥的作用,安排着AD的转换通道。

以上这个表格在任意一本DSP书都可以找到了,现在我要讨论的不是用那些来触发AD开始转换,我要说明了,这些信号发生后对于AD模块的很多寄存器是如何变化的,简单的说就是这些信号发生后,AD模块要如何进行动作,或是进行哪些必要的动作,在哪些情况下还可以进行另外什么其他的动作。

首先,我先说如果要用查询法来进行AD的转换的时候这部分的内容比不可少.原因就是很简单你不知道相应的动作你怎么去查找你的目标寄存器。

现在不管你用什么方法来触发AD的转换,一定一个触发信号触发了排序器,首先排序器的忙标志位置“1”(SEQ1_BUSY或是SEQ2_BUSY),然后AD开始转换,一开始忙标志位自动清零,在AD转换还没有完成时如果还有触发信号到来忙标志位继续置“1”,如果还有触发信号将被忽略。等待AD开始转换完毕,其中判断是否转换完毕还有一个标志位,就是排序器中断标志位,因为排序器完成一次全部的转换都会将中断标志位置“1”,如果使能中断则响应中断,否者不响应,所以如果用查询不用中断,那么就可以查询该位的状态INT_SEQ1/2来判断AD是否转换完毕。

以上说的都是在启停工作模式下

如果工作在连续工作模式下,那么忙标志位会一直为“1”;其他一样!

2.AD超高级教程

2.1采样幅值不变的直流信号(0~3V)确定ADCL0已经和DSP得板子的模拟地一起共接着!否者将采集不了数据。

先用AD模块采样幅值不变的直流信号,并且所要求的直流信号必须要

在0~3V之间可以输入到DSP本身内部集成的AD输入口。

利用AD进行采样输入的信号,一般都是想利用DSP的处理速度,这样

基本所有的AD转换都是以中断的方式进行的,一下实验过程就是以中断的方式进行不同触发方式下,不同的采样设置下,不同的通道下,等等,AD的工作情况的讨论。

其实,现在我对AD的认识是,在开始AD的过称中,你只要设置好以下几个寄存器或是其中的某些位即可。

以下记为我的实验过程(基本的初始化部分省略)

2.1.1利用事件管理器A

利用事件管理器A的通过定时器的下溢信号来触发中断(且AD排序

器工作在启停模式、采样模式为顺序采样、并且要求只对A1进行采样)。首先

要分析,这个实验要包括哪些内容,要对那些东西进行设定。

①要进行那个AD模块的复位

AdcRegs.ADCTRL1.bit.RESET=1;

之后延时一小段时间可以是10个空语句。

②要利用AD模块的中断进行AD的相应处理,则必须要给中断赋个入口地址,并且AD开中断,并且如果是受保护的,所以先要关闭保护,然后在进行赋值,最后在打开保护。

EALLOW;//ThisisneededtowritetoEALLOWprotectedregisterPieVectTable.ADCINT=&adc_isr;EDIS;//ThisisneededtodisablewritetoEALLOWprotectedregisters//EnableADCINTinPIE

PieCtrlRegs.PIEIER1.bit.INTx6=1;

IER|=M_INT1;//EnableCPUInterrupt1EINT;//EnableGlobalinterruptINTMERTM;

③要利用AD模块吧就要给AD的内核,带隙电路上电,要准确的采集信号也要对AD的参考电路进行上电该模块的上电顺序请详见书本。

④要利用AD模块,首先要对AD的输入通道的最大转换通道、采样模式、排序器的工作模式进行配置,然后要对AD的控制进行配置,比如用什么启动AD、AD的采样模式、AD的排序器的工作模式等等

在这里首先部分的配置如下:AdcRegs.ADCMAXCONV.all=0x0001;

AdcRegs.ADCCHSELSEQ1.bit.CONV00=0x01;AdcRegs.ADCCHSELSEQ1.bit.CONV01=0x01;

这里将该通道设置成为过采样的目的是,通过我自己的实验得出,如果采样的点数不多时,比如就几十个点,那么只用一次采样效果相当的令人不满意,但是利用了过采样那么效果基本可以达到满意程度,在该实验中我采样了12点,利用了过采样比没有利用过采样效果真是天壤之别,不信可以自己做。

然后就是然后得配置:

这里是利用EVA的T1进行触发AD采样:AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=1;

当EVA产生了触发信号,触发AD开始转换,等到转换完后需要有个中断进入中段子函数:

AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1;⑤已知说用EVA的通用定时器来触发AD的转换,那么EVA怎么配置才可以进行触发AD的转换呢?

配置:只要配置好以下四个寄存器即可EvaRegs.T1CMPR=0x0080;

EvaRegs.T1PR=0x10;

EvaRegs.GPTCONA.bit.T1TOADC=01;

EvaRegs.T1CON.all=0x1042;//配置并且启动定时器

⑥接下来就可以等待中断的产生了。可以用一个while的死循环。⑦中断产生后,其中断函数应该要做些什么事情呢?

1.首先要读出结果寄存器的内容,这样可以避免内容备下次转换的结果覆盖

Voltage2[ConversionCount]=AdcRegs.ADCRESULT1>>4;2.由于本身AD的设置的工作模式为Q启停工作模式,那么每次转换完就需要手动的复位。由于中断的标志位不会自动清零,为了下次可以正常的产生中断,也必须在函数内进行手动的清零,之后就是每个组的应答信号,应答信号在每次应答后变成高电平,即意味的下次不会进行应答、也就意味不会产生中断,为了产生中断,则必须要对改为写1来清零。AdcRegs.ADCTRL2.bit.RST_SEQ1=1;//ResetSEQ1AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;//ClearINTSEQ1bitPieCtrlRegs.PIEACK.all=PIEACK_GROUP1;这样的配置过程就可以实现实验的目的了。

2.1.2EVB的通用定时器

现在想利用EVB的通用定时器来产生AD的触发信号完成上述的要求。

首先EVA与EVB得功能没有什么区别,所以配置也很相似,将A同样的内容表示成在B中的表示方法即可。

首先要用EVB,则AD排序器的工作方式要修改,要改成级联模式。

AD复位下插入:AdcRegs.ADCTRL1.bit.SEQ_CASC=1;因为EVB只有在级联模式下才可以触发排序器1。

然后要修改的就是触发信号的产生:EVB可以利用3、4来产生,这里

用通用定时器3:

EvbRegs.T3CMPR=0x0080;//SetupT1comparevalueEvbRegs.T3PR=0x10;//SetupperiodregisterEvbRegs.GPTCONB.bit.T3TOADC=01;EvbRegs.T3CON.all=0x1042;接下来要修改的是:

排序器的EVB来触发SEQ1的允许为:AdcRegs.ADCTRL2.bit.EVB_SOC_SEQ=1;AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=0;

修改这些后程序就可以正常运行,并且完成要求的功能。

2.1.3利用软件写1来触发AD转换

软件写一得方式比较简单,那么要修改的地方如下信号是有软件写1的方式触发,这样以来事情管理器那一块的设置可以删去,并且要修改触发信号触发的允许,有事件管理器要禁止,而要更改为软件写一。AdcRegs.ADCTRL2.bit.SOC_SEQ1=0x0001;AdcRegs.ADCTRL2.bit.EVB_SOC_SEQ=0;AdcRegs.ADCTRL2.bit.EV1_SOC_SEQ1=1;然后排序器的工作模式可以任意选择

可以是级联也可以是双排序所以才可以采用默认值,或是自己设置

但是程序希望要一直进行采样,所以利用软件写一的时候要在AD的中断函数里面多加这么一句

AdcRegs.ADCTRL2.bit.EVB_SOC_SEQ=1;

每次一处理完中断又会产生置一,又会进行转换,这样j就可以周而复始的进行采样就可以完成任务。

2.2采样幅值按照一定频率变化的直流信号的采样

这个过程中我个人确实碰到了很多困难了,但是在高瑜高老师的指导下,我也学会的老师在遇到困难的时候他们解决问题的办法------尤其是高老师经过教导我们的两个字---摸索!

很多时候,你会发现你的问题很像论坛上很多人所说的,但是他们也没有解决的方案这回就要靠个人摸索了。以下是我在高老师的指导下的一些成果。

①交流采样的时候,一定要看看TI公司提供的英文文档,在里面可以看到有一个引脚的说明ADCL0这个引脚,在英文文档中他指定该引脚要connect

toanalogGND!但是在很多实验板中这个引脚基本都是悬空,没有接地,这

样会导致你可以采进去没有幅值变化的数据,但是一旦遇到有幅值变化的数据,这样没有办法完成数据的采集了。

②进行交流采样的的时候,由于数据在每个时刻都是不同的,一定要计算好采集的周波数以及在该周波内采集的采样点的个数。然后在配置相应的寄存器,配置方法在该教程的最上面已经提出来了。可以参考以上论述。尤其是采样保持的脉冲宽度和AD得时钟的配合。

③在DSP中交流采样实验程序代码的习惯性用法(优点已经在上面介绍过了)。我参考了很多交流采样的例程,从例程中可以看到一种思路:

配置EVA的T1在规定时间产生一次中断2.AD采样的高级教程进入中断函数后,配置下次T1中断的条件以及AD启动标志位根据置位的AD启动标志位进行一次AD转换,然后清除标志位在主函数继续等待中断只要配置好T1的时间就可以在规定时间出发一次,意味着就可以在规定时间进行一次AD转换。当然其中有很多细节没有列出来,比如进行转换完要把结果寄存器的内容读出,这样才可以避免内容被覆盖。

④为了观察方便我采用的程序流程也是上面的流程,但是我的要求的在工频正弦波内采集24个点,所以我要配置的时间间隔为20ms/24=0.8333ms,并且我在定时器中断内设定了,一定产生24点,就立马关掉定时器,即不使能定时器,这样就没有触发信号,这样也就不进行AD转换,那么在CCS的WatchWindow内观察的24点就是一个周波内的点,如果它对应的幅值是符合你输入的信号,并且有着正弦趋势,误差可以允许的话说明采样成功了。采样完成后你可以调用波形还原函数对才进来的数据进行还原,之后再对还原完的数据调用算法进行对其他参数的计算最后得到了实际电网的基本参数。

⑤改采所说的全部是把正弦信号处理过后,能输入到DSP--AD的信号

(0~3V)所以要把信号进行还原根据前面的硬件电路要把现在的直流信号还原成为真正的交流信号,这样才可以完成一次真实的模拟采样。这个过程的硬件电路可以参考模电书本,基本就是一个加法电路对模拟信号的幅值进行上抬,然后通过一级保护进入DSP的AD输入口。

现在我来说明一下这个交流采样的其他的一些东西。

首先确定一下腰研究的课题。

我现在要做一个测量电路,可以实时的观测电网的一些基本参数,比如UIPQScosAsinAU0I0等等。

首先要确定要知道每一相得这些参数,要明确测量的量是什么,以及实际中可以测量的量是那些?

首先要测量三相电网的UaUbUcIaIbIc然后要测量的就是零序电压和零序电流了,这样基本就完成了实验所需的参数了。

然后分析一下AD的输入通达数目,根据测量的信号时8路的信号,所以需要时8个通道进行处理。

然后在分析一下,AD的排序器需要怎么配置,我个人感觉可以配置成为启停、级联以及采样器工作在同步采样方式下就可以了,当然其他的配置只要满足要求就可以了,我不强求。

接下来就是程序的流程设计了,下面是我设计的流程图,当然程序时大家发挥的时候不一定要按照我的方法来,但是程序中一定要求包括的几个模块1.SCI通讯2.键盘模块

3.液晶显示4.AD转换程序5.AD转换触发程序

6.调用的算法计算参数子程序7.微机保护程序

可以参考我以下画的流程图:

该流程就是我程序设计的核心了,程序怎么写?

我这里介绍一种比较经典的方法,这也是我在实际的编程中总结

我该开始做程序是,用的是常规的,方法每一个变量定义一个,但是后来发现这样对于重复的代码代码太多,所以我将变量定义成为数组了,这样很多单独的想同的程序就可以以一个循环来实现了。后来我还想到了一个特别经典的,应该也是效率最好的,就是定义结构体了

每一相都有UIPSQcosAsinA这些参数,这样的话可以定义一个结构体,其中结构体的成员有这些。这样程序定四个结构体成员就拥有了这里的所有的属性。这样的方法我觉得是很理想的。也是我也写程序过程中才发现的方法。

开始系统时钟初始化PIE控制、向量表初始化AD模块初始化配置采样频率和采样窗口大小使能EVA的T1中断键盘、LCD液晶初始化AD采样流程图:调用键盘扫描程序Y发送初始化信息SCI通信?N使能定时器T1开始定时NT=0.83ms?YY定时器清零、启动ADN还要进行采样?N调用键盘扫描程序SCI通信、将数据发送到总站转换完没?Y读取AD结果寄存器的值采样点数=24?调用显示函数显示实时参数N调用均方根算法函数禁止EVA的T1、停止计数最后我也没有怎么说了,开始说明的就是液晶显示程序了。液晶显示程序是一个比较简单的,但是也不是那么容易了,我这里是已经集成的液晶模块的接口了,所以基本就没有花多少时间就解决了。液晶用的常用的1602!程序采用的是:

这里只是列举其中的写时序:

voidWriteLcdCom(unsignedcharc)//thetime-sequenceofwritingcommandtothelcd!{

*LCDRS=0;//切换到写命令*LCDData=c;*LCDE=1;*LCDE=0;

for(a=0;a<2000;a++);}

voidWriteLcdDat(unsignedchard)//thetime-sequenceoflcd!{

*LCDRS=1;//切换到写数据*LCDData=d;*LCDE=1;*LCDE=0;

for(a=0;a<2000;a++);}

writingdatatothe

第三大课题:AD的校正

这个课题的出现主要原因是,本人在做实验的过程中发现AD的采样精度并不是它所描述的12位精度,在没有进行相关校正的时候数据的精度很低误差在9%左右,由此又了AD的校正的课题研究。

(见附录AD的校正)

第四大课题:研究AD的采样频率与AD时钟、采样保持宽度的关系

这个主要是在做实验的过程中发现,如果这些参数设置不同的话,会有不同的效果,比如如果把CPS=0;ADCCLKPS=0;这样的话就可能造成AD采集不了数据,或者采集的数据是错误的,而如果你将改变以上两个变量,结果就出来了,

说明这些参数的设置也AD本身的这些参数是相关的,所有有必要进行一般研究。

第五大课题;浮点格式的转换!

在AD转换的运算中经常要遇到的是浮点的计算,这样就要考虑到2812定点的DSP如何才能在浮点预算中也占有一定的速度和精度呢?一般有两种方法一种是自己定标来确定数的精度,另一种就是利用TI公司本身提供的Q格式进行数据分转换这样可以提高数据的精度和速度。下面为该过程的简介:第六大课题:外扩AD、参考电路进行采样处理

该课题的提出主要是在本人在学习AD过程的一个练习,感觉利用DSP

本身的AD模块,而且利用的是内部参考电路,这样你对电压基准这一块的理解就不够到位,因为你没有自己实际做过这方面的电路,而且本身AD的精度都不是很好,外扩AD的可以提高精度,如果AD得质量好的话,当然代价是要花一些钱。不过这是实践过程中必须的课题。下面将以下几个步骤来完成:1.硬件电路

①基准电路、参考电路②AD的外接电路

③DSP/AD的保护电路④滤波去耦电路2.软件设计

①进行正常的采样②软件滤波

③调用均方根或是FFT进行数据处理④利用Q格式进行数据转换3.误差分析

①硬件本身的特性分析②基准电源的误差分析

③软件设计的浮点运算的误差分析4.误差校正

根据误差的来源进行相应的校正。

电气0603王传胜

指导老师:高瑜

因篇幅问题不能全部显示,请点此查看更多更全内容