DSP-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;//ResetSEQ1

AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;//ClearINTSEQ1bit PieCtrlRegs.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;//Setupperiodregister

EvbRegs.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这个引脚,在英文文档中他指定该引脚要

connecttoanalogGND!但是在很多实验板中这个引脚基本都是悬空,没有接地,这样会导致你可以采进去没有幅值变化的数据,但是一旦遇到有幅值变化的数据,这样没有办法完成数据的采集了。

②进行交流采样的的时候,由于数据在每个时刻都是不同的,一定要计算好采集的周波数以及在该周波内采集的采样点的个数。然后在配置相应的寄存器,配置

方法在该教程的最上面已经提出来了。可以参考以上论述。尤其是采样保持的脉冲宽度和AD得时钟的配合。

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

只要配置好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这些参数,这样的话可以定义一个结构体,其中结构体的成员有这些。这样程序定四个结构体成员就拥有了这里的所有的属性。这样的方法我觉得是很理想的。也是我也写程序过程中才发现的方法。

最后我也没有怎么说了,开始说明的就是液晶显示程序了。液晶显示程序是一个比较简单的,但是也不是那么容易了,我这里是已经集成的液晶模块的接口了,所以基本就没有花多少时间就解决了。 液晶用的常用的1602! 程序采用的是:

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