DSP内部ADC模块使用小例

TMS320LF2407A内有10位16路AD转换器,只需设置几个寄存器就可以实现AD采样工程,十分方便。
 
不过要注意的是AD输入电压要是正电压而且最大不超过3.3V,最后转换出的结果是无符号数
 
转换结果寄存器右移六位就可以得到AD采样、量化后的数字型数值。
 
不过AD采样的精度不够,对于精度要求很高的场合,仅仅使用内部的AD模块是达不到所需要的。可以外扩ADC采样芯片。
 
程序如下:已经在程序的关键部分添加注释,方便理解
 
#include "f2407.h"
void SystemInit ();
void Timer1Init ();
void AD_Sample ();
void Que ();
unsigned int numled = 500;
unsigned int t0 = 0, i = 0, j = 0;
unsigned int RESULT_0 = 0, RESULT_1 = 0, RESULT_2 =0, RESULT_3 = 0;
unsigned int AD0[18], AD1[18], AD_0, AD_1, AD_FLAG = 0;
float AD_SIG0 = 0.0, AD_SIG1 = 0.0;
void main()
{
SystemInit ();
*MCRC = 0X00FF;
*PFDATDIR = 0XFFFF;

Timer1Init ();
asm (" CLRC INTM ");

while ( 1 )
{
for ( i=0; i<18; i++) /*每个通道采样18个值,结果存入数组中 */


AD_Sample();
AD0[i] = RESULT_0;
AD1[i] = RESULT_1;

}
Que ();
NOP;
}
}
void SystemInit ()
{
asm (" SETC INTM");
asm (" CLRC SXM ");
asm (" CLRC CNF ");
asm (" CLRC OVM ");

*SCSR1 = 0X00FC;
*WDCR = 0X006F;

*IFR = 0XFFFF;
*IMR = 0X0000;
}
void AD_Sample ()
{
*ADCTRL1 = 0X4000; /*ADC模块软件复位 */

asm (" NOP "); 
*ADCTRL1 = 0X0020; /*高优先级中断,双排序器模式使用SEQ1 */
/*采样频率为CPU频率 */
*MAXCONV = 0X0003; /*最大转换通道数,设置的是转换两个通道*/
*CHSELSEQ1 = 0XBA98; /*输入通道选择,设置转换顺序是通道8-9 */
*ADCTRL2 = 0X4000; /*排序器SEQ1复位 */
*ADCTRL2 = 0X2000; /*软件启动AD转换,禁止AD中断 */

while ( ( *ADCTRL2 
& 0X1000 ) == 0X1000 );/*等待AD转换结束 */
asm (" NOP ");

RESULT_0 = *RESULT0>>6; /*AD转换结果寄存器右移6位保存*/ 
RESULT_1 = *RESULT1>>6; 
RESULT_2 = *RESULT2>>6;
RESULT_3 = *RESULT3>>6; 
}

void Que () /*排序滤波函数 */
{
unsigned int MaxAD0 = 0;
unsigned int MinAD0 = AD0[0];

unsigned int MaxAD1 = 0;
unsigned int MinAD1 = AD1[0];

unsigned int tempAD0 = 0;
unsigned int tempAD1 = 0;

for ( j=0; j<18; j++)
{
if ( AD0[j] > MaxAD0) /*找出通道8采样的18结果的最大值和最小值*/
{
MaxAD0 = AD0[j];
}
else if ( AD0[j] < MinAD0 )
{
MinAD0 = AD0[j];
}

if( AD1[j] >MaxAD1 ) /*找出通道9采样的18结果的最大值和最小值*/
{
MaxAD1 = AD1[j];

else if ( AD1[j] < MinAD1)
{
MinAD1 = AD1[j];
}
}

for ( j=0; j<18; j++)
{
tempAD0 = tempAD0 + AD0[j]; /*对通道8采样得到的18个值求和 */
tempAD1 = tempAD1 + AD1[j]; /*对通道9采样得到的18个值求和 */
}

AD_0 = (tempAD0 - MaxAD0 -MinAD0 )/16; /*减去最大值最小值后求平均滤波*/
AD_1 = (tempAD1 - MaxAD1 -MinAD1 )/16; 

AD_SIG0 = (AD_0 *3.39) /1023; /*计算所采的原电压值 */
AD_SIG1 = (AD_1 *3.39) /1023;

asm (" NOP ");

}
永不止步步 发表于03-25 14:45 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67410个|学分:308117个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号