DSP-AD学习心得(精)_第1页
DSP-AD学习心得(精)_第2页
DSP-AD学习心得(精)_第3页
DSP-AD学习心得(精)_第4页
DSP-AD学习心得(精)_第5页
免费预览已结束,剩余7页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、DSP-AD模块学习的心得1 .AD采样的高级教程AD经过这几天的忙碌,我感觉我对 2812的AD模块又有了一些新的理解,感觉 的框架已经被我架出,现在来说明这几天对其中的理解。1.1. AD的结构首先还是要接受一下AD的基本结构吧!把几个容易混淆哦概念重新的定位,让 大家看看我自己的理解,双排序和级联工作模式顺序采样和同步采样启停/连续工作模式这三个概念是我自己学习的时候容易混淆或是不知道如何才能很好运用的一个门槛下面以一个图形来表示他们之间的关系所以2812AD总共有8种工作方式可以实现,在实际运用中可以根据自己的需要 选择合适的工作方式。1.2. AD模块时钟问题的提出高速时钟ADCLK

2、-AD模块时钟事件管理器时钟(如果要用到EVA/B来触发AD启动的时候)以上就是整个和系统、AD模块相关的所有时钟的信息。当然里面涉及很多寄存 器,各个寄存器的设置可以查相关的资料得出自己想要的合适的时钟和相应的采 样保持脉冲的宽度。1.3. 个基本概念接下来解释几个常混的概念,但是都是本人个人的理解不一定准确。AD采样频率AD启动频率AD的采样保持宽度AD的转换时间以及这些跟ADCclk之间的联系?首先来说明一下AD采样频率,我个人认为 AD采样频率就是1S中采样多少个 点,那么根据实际运用AD模块的经验,你自己启动几次 AD模块,它就采样几 次,意味着其实AD的采样频率就是AD的启动频率,

3、如果你用事件管理器来触 发的话,那么触发频率也同样是 AD的采样频率,也就是你所用的通用定时器的 定时时间。其次,AD的采样保持时间,这个是一定 AD启动就马上开始采样, 由于采样这个过程就是给电容充电的过程,那么就是意味着要需要一段的时间电 容才可以电荷把电荷储存起来,采样保持时间就是起到这个作用的,但是和AD的启动频率有什么关系呢?个人认为 AD的采样频率就是相邻两个采样点之间的 时间间隔应该要大于采样保持器保持的时间,这样才可以保证在下一次采样触发 到来之前把信号可靠的保持下来。最后讲到,AD的转换时间,这个就是采样保持后,要将保持的模拟量转换成数字量,就要通过内部的转换器,转换器的时间

4、 跟ADCclk有关。因为大家都知道 AD转换器转换需要给他提供时钟,那么时钟 频率越高,转换的速度越快,这样转换时间就越小。这些关系希望大家可以理解清楚,不过以上都是本人自己的理解,希望可以帮我 指出错误的地方。合理的安排计算这些频率和时间是 AD采样的关键,比如一个正弦信号如果您 要求他要在一个正弦波的一个周期内采样 24个点,那么首先要确定AD的启动频率也就是采样频率,即 20毫秒内采样24点,那么就可以确定1秒内要 采多少个点了,也就是可以确定相邻两个采样点之间的时间问隔,即20毫秒/24=0.8333毫秒;这样就可以根据EV事件管理器的时钟来确定通用定时器的周 期寄存器的值(假设用周

5、期匹配中断来触发)如果高速时钟的频率是75M赫兹,其中EV时钟的分频系数为x,那么就可以知道count=75*8333.3/x来确定计数值就是合理的安排采样的保持时间也是关键啊!不过对以咱们所有的50赫兹的低频来说在采样点很少的时候,比如几十个点可能会不重要,主要原因是如果高 速时钟在75赫兹下,你把ADCCLKPS设为15, CPS设为1这样 ADCCLK=75/(ADCCLKPS*2*(1+CPS)MHz,贝U对应的采样窗口宽度,你即使将 ACQ_PS设为15,这样宽度也只有,25.6us除非你降低高速时钟的频率,但是降 低了也会影响AD的装换速度。但是在采样频率高的时候即采样的点数多的时

6、 候,这个就要考虑了,采样点数多了,意味着采样点之间的间隔缩小了,如果多 到一定的程度时候,可能之间的间隔会达到 uSs级别,这样你就要考虑采样的问 隔要大于采样保持的时间,因为这样才可以保证可靠的保持数据,否者就会出现 采样出错。在采样过程中,要想让 AD准确并且按照要求的点数进行采样的话,一定要配 置好AD的分频时钟,至少要对它进行一次分频,然后在 ACQ_PS内设置相应的 保持参数,当然分频数再增大也无妨。要想按照自己的点数进行采样,建议不要 用到AD本身的中断来进行出来,本人试了许久发现用 AD本身的中断来进行采 样你会发现不管你是如何设置你的点数,基本都是5、6个,根本改变不小,看了

7、些论坛上说了,利用中断进行 AD转换了可能会有些振荡,中断进出栈需要时 问,中断返回不能肯定信息的原始化,等等,导致产生的结果不是很令人满意, 所以建议采用外部中断来触发置标志位,根据标志位了进行控制AD的采样进行了。1.4. ADC的加电顺序这个不用我来细说了,因为你翻开任意一本参考书,都会说明这个东西,其中特 别要提示的一点,也是我自己在编程中忽略的,如果你看了AD很多例程你就会发现,在配置AD寄存器,或是加电ADC模块之前,都要对AD模块进行一次 软件复位,这个复位不是复位排序器而是整个 AD模块进行一次复位,复位之后 要进行一个小的延时,这是一个要注意的地方。就是已经复位完成,已经开始

8、 配置寄存器后,尤其是加电的这些寄存器,以后就不能出现AD模块整体复位指令,否则你要重新进行 AD的所有寄存器的配置,包括加电寄存器。我忽略的就 是在配置完寄存器后,对 AD的进行再次的复位,但是没有对加电、其他寄存器 进行重新配置,导致进行 AD转换的时候没有反应。1.5. 于AD的触发集和相应的中断操作看过DSP书的人都知道,到底有 AD中排序器的作用,它是TI的AD的一 大特色,排序起着指挥的作用,安排着 AD友-之电工件穰式制津收1件模大比接特性单 日慎苗呼啊* g优点序,&* H K (5HJ25an 1«状毒 序”步安总(SBQ)iIt*哥玄£肌 幡:件

9、】*11W球1如 球Aift花:即学M长度Ifi离库w童总t0*不瞰再,3醇修讨“奇小母椁K。-Ta - itr 15犯1左式3片或区争叫指4电eras - iiiwoT的转换通道。以上这个表格在任意一本 DSP书都可以找到了,现在我要讨论的不是用那些来触 发AD开始转换,我要说明了,这些信号发生后对于 AD模块的很多寄存器是如 何变化的,简单的说就是这些信号发生后, AD模块要如何进行动作,或是进行 哪些必要的动作,在哪些情况下还可以进行另外什么其他的动作。首先,我先说如果要用查询法来进行 AD的转换的时候这部分的内容比不可少.原 因就是很简单你不知道相应的动作你怎么去查找你的目标寄存器。现

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

11、式下,那么忙标志位会一直为“1:其他一样!2 .AD超高级教程2.1. 采样幅值不变的直流信号(03V)确定ADCL0已经和DSP得板子的模拟地 一起共接着!否者将采集不了数据。先用AD模块采样幅值不变的直流信号,并且所要求的直流信号必须要在03V之间可以输入到DSP本身内部集成的AD输入口。利用AD进行采样输入的信号,一般都是想利用 DSP的处理速度,这样基本所有 的AD转换都是以中断的方式进行的,一下实验过程就是以中断的方式进行不同 触发方式下,不同的采样设置下,不同的通道下,等等, AD的工作情况的讨 论。其实,现在我对AD的认识是,在开始AD的过称中,你只要设置好以下几个寄 存器或是其

12、中的某些位即可。以下记为我的实验过程(基本的初始化部分省略)2.1.1 利用事件管理器A利用事件管理器A的通过定时器的下溢信号来触发中断(且 AD排序器工作在启停模式、采样模式为顺序采样、并且要求只对A1进行采样)。首先要分析,这个实验要包括哪些内容,要对那些东西进行设定。要进行那个AD模块的复位AdcRegs.ADCTRL1.bit.RESET=1;之后延时一小段时间可以是10个空语句。要利用AD模块的中断进行AD的相应处理,则必须要给中断赋个入口地址, 并且AD开中断,并且如果是受保护的,所以先要关闭保护,然后在进行赋值,最 后在打开保护。EALLOW;/Thisisneededtowri

13、tetoEALLOWprotectedregister PieVectTable.ADCINT=&adc_isr;EDIS;/ThisisneededtodisablewritetoEALLOWprotectedregisters/EnableADCINTinPI EPieCtrlRegs.PIEIER1.bit.INTx6=1;IER|=M_INT1;EnableCPUInterrupt1EINT;EnableGlobalinterruptINTM ERTM;要利用AD模块吧就要给AD的内核,带隙电路上电,要准确的采集信号也要对AD的参考电路进行上电该模块的上电顺序请详见书本。要利用

14、AD模块,首先要对AD的输入通道的最大转换通道、采样模式、排序 器的工作模式进行配置,然后要对 AD的控制进行配置,比如用什么启动 AD、 AD的采样模式、AD的排序器的工作模式等等 在这里首先部分的配置如下:AdcRegs.ADCMAXCONV.all=0x0001;AdcRegs.ADCCHSELSEQ1.bit.CONV00=0x01;AdcRegs.ADCCHSELSEQ1.bit.CONV01=0x01;这里将该通道设置成为过采样的目的是,通过我自己的实验得出,如果采样的点 数不多时,比如就几十个点,那么只用一次采样效果相当的令人不满意,但是利 用了过采样那么效果基本可以达到满意程度

15、,在该实验中我采样了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.

16、GPTCONA.bit.T1TOADC=01;EvaRegs.T1CON.all=0x1042;/M已置并且启动定时器接下来就可以等待中断的产生了。可以用一个while的死循环。中断产生后,其中断函数应该要做些什么事情呢?1 .首先要读出结果寄存器的内容,这样可以避免内容备下次转换的结果覆盖 Voltage2ConversionCount=AdcRegs.ADCRESULT1>>4;2 .由于本身AD的设置的工作模式为Q启停工作模式,那么每次转换完就需要手 动的复位。由于中断的标志位不会自动清零,为了下次可以正常的产生中断,也 必须在函数内进行手动的清零,之后就是每个组的应答信号,

17、应答信号在每次应 答后变成高电平,即意味的下次不会进行应答、也就意味不会产生中断,为了产 生中断,则必须要对改为写1来清零。AdcRegs.ADCTRL2.bit.RST_SEQ1=1;/ResetSEQ1AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;ClearINTSEQ1bit PieCtrlRegs.PIEACK.all=PIEACK_GROUP1;这样的配置过程就可以实现实验的目的了。3 .1.2EVB的通用定时器现在想利用EVB的通用定时器来产生AD的触发信号完成上述的要求。首先EVA与EVB得功能没有什么区别,所以配置也很相似,将A同样的内容表示成在B中的表示方

18、法即可。首先要用EVB,则AD排序器的工作方式要修改,要改成级联模式。AD 复位下插入:AdcRegs.ADCTRL1.bit.SEQ_CASC=1;因为EVB只有在级联模式下才可以触发排序器 1。然后要修改的就是触发信号的产生:EVB可以利用3、4来产生,这里用通用定 时器3:EvbRegs.T3CMPR=0x0080;SetupT1comparevalueEvbRegs.T3PR=0x10;Setupperio dregisterEvbRegs.GPTCONB.bit.T3TOADC=01;EvbRegs.T3CON.all=0x1042;接下来要修改的是:排序器的EVB来触发SEQ1的允

19、许为:AdcRegs.ADCTRL2.bit.EVB_SOC_SEQ=1;AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=0;修改这些后程序就可以正常运行,并且完成要求的功能。4 .1.3利用软件写1来触发AD转换软件写一得方式比较简单,那么要修改的地方如下信号是有软件写1的方式触发,这样以来事情管理器那一块的设置可以删去,并 且要修改触发信号触发的允许,有事件管理器要禁止,而要更改为软件写一。AdcRegs.ADCTRL2.bit.SOC_SEQ1=0x0001;AdcRegs.ADCTRL2.bit.EVB_SOC_SEQ=0;AdcRegs.ADCTRL2.bit.EV

20、1_SOC_SEQ1=1;然后排序器的工作模式可以任意选择可以是级联也可以是双排序所以才可以采用默认值,或是自己设置但是程序希望要一直进行采样,所以利用软件写一的时候要在AD的中断函数里面多加这么一句AdcRegs.ADCTRL2.bit.EVB_SOC_SEQ=1;每次一处理完中断又会产生置一,又会进行转换,这样j就可以周而复始的进行采样就可以完成任务。2.2采样幅值按照一定频率变化的直流信号的采样这个过程中我个人确实碰到了很多困难了,但是在高瑞高老师的指导下,我也学 会的老师在遇到困难的时候他们解决问题的办法 -尤其是高老师经过教导我们 的两个字-摸索!很多时候,你会发现你的问题很像论坛上

21、很多人所说的,但是他们也没有解决的 方案这回就要靠个人摸索了。以下是我在高老师的指导下的一些成果。交流采样的时候,一定要看看 TI公司提供的英文文档,在里面可以看到有一 个引脚的说明ADCL0这个引脚,在英文文档中他指定该引脚要 connecttoanalogGND!但是在很多实验板中这个引脚基本都是悬空,没有接地,这 样会导致你可以采进去没有幅值变化的数据,但是一旦遇到有幅值变化的数据, 这样没有办法完成数据的采集了。进行交流采样的的时候,由于数据在每个时刻都是不同的,一定要计算好采集 的周波数以及在该周波内采集的采样点的个数。然后在配置相应的寄存器,配置方法在该教程的最上面已经提出来了。可

22、以参考以上论述。尤其是采样保持的脉 冲宽度和AD得时钟的配合。在DSP中交流采样实验程序代码的习惯性用法(优点已经在上面介绍过了)。 我参考了很多交流采样的例程,从例程中可以看到一种思路:配N EVA irj T1。嶷冗 网阳产生一次中船MKWfy的AD启动标上除选行-AD料检.一后箱除M上位 衽主菱看靠城等待中断只要配置好T1的时间就可以在规定时间出发一次,意味着就可以在规定时间进 行一次AD转换。当然其中有很多细节没有列出来,比如进行转换完要把结果寄 存器的内容读出,这样才可以避免内容被覆盖。为了观察方便我采用的程序流程也是上面的流程,但是我的要求的在工频正弦 波内采集24个点,所以我要配

23、置的时间间隔为 20ms/24=0.8333m§并且我在定 时器中断内设定了,一定产生24点,就立马关掉定时器,即不使能定时器,这 样就没有触发信号,这样也就不进行 AD转换,那么在CCS的WatchWindow内 观察的24点就是一个周波内的点,如果它对应的幅值是符合你输入的信号,并 且有着正弦趋势,误差可以允许的话说明采样成功了。采样完成后你可以调用波 形还原函数对才进来的数据进行还原,之后再对还原完的数据调用算法进行对其 他参数的计算最后得到了实际电网的基本参数。改采所说的全部是把正弦信号处理过后,能输入到DSP-AD的信号(03V)所以要把信号进行还原根据前面的硬件电路要把现

24、在的直流信号还原成 为真正的交流信号,这样才可以完成一次真实的模拟采样。这个过程的硬件电路 可以参考模电书本,基本就是一个加法电路对模拟信号的幅值进行上抬,然后通 过一级保护进入DSP的AD输入口。现在我来说明一下这个交流采样的其他的一些东西。首先确定一下腰研究的课题。我现在要做一个测量电路,可以实时的观测电网的一些基本参数,比如 UIPQScosAsinAU0I0 等等。首先要确定要知道每一相得这些参数,要明确测量的量是什么,以及实际中可以 测量的量是那些?首先要测量三相电网的UaUbUcIaIbIc然后要测量的就是零序电压和零序电流 了,这样基本就完成了实验所需的参数了。然后分析一下AD的

25、输入通达数目,根据测量的信号时 8路的信号,所以需要时 8个通道进行处理。然后在分析一下,AD的排序器需要怎么配置,我个人感觉可以配置成为启停、级联以及采样器工作在同步采样方式下就可以了,当然其他的配置只要满 足要求就可以了,我不强求。接下来就是程序的流程设计了,下面是我设计的流程图,当然程序时大家发挥的 时候不一定要按照我的方法来,但是程序中一定要求包括的几个模块1.SCI通讯2 .键盘模块3 .液晶显小4 .AD转换程序5 .AD转换触发程序6 .调用的算法计算参数子程序7 .微机保护程序可以参考我以下画的流程图:该流程就是我程序设计的核心了,程序怎么写?我这里介绍一种比较经典的方法,这也

26、是我在实际的编程中总结我该开始做程序是,用的是常规的,方法每一个变量定义一个,但是后来发现这 样对于重复的代码代码太多,所以我将变量定义成为数组了,这样很多单独的想 同的程序就可以以一个循环来实现了。后来我还想到了一个特别经典的,应该也 是效率最好的,就是定义结构体了每一相都有UIPSQcosAsinA这些参数,这样的话可以定义一个结构体,其中结构 体的成员有这些。这样程序定四个结构体成员就拥有了这里的所有的属性。这样 的方法我觉得是很理想的。也是我也写程序过程中才发现的方法。系蝴片仲初始牝问单人蚓归化AD模境村好化配丁士"34束,叶飘I门、小欠佬 EVAffjTl 'PM片

27、扑成F;田”西包始牝£毡使他;l驰惠T1 ”始定时理量班打累作神发是没f汹用烧盘抬播程序SCI 通 J筑送到兑站*阳以小画数显承实M,施胡川均方IHH法函H程序采用的是:这里只是列举其中的写时序立时器祗*J;动人D优3 LCD 酒;.:tJj4fi(t啊用谁CH嚼程序液晶用的常用的1602!比较简单的,但是也不是那么容易了,我这里是已经集成的液晶模块的接口了 所以基本就没有花多少时间就解决了。voidWhteLcdCom(unsignedcharc)/thetime-sequenceofwritingcommandtothelcd!*LCDRS=0;/切换至I写命令*LCDData=c;*LCDE=1;*LCDE=0;for(a=0;a<2000;a+);voidWriteLcdDat(unsignedch

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论