各位大虾,帮小弟看看问题出在在哪里?我用LPC2114自带的AD进行采样,再用max5306原样输出,当输入的频率达到1k以上以后,输出波形就失真很严重了,LPC2114自带的AD不可能那么差吧,程序在下面,希望各位大虾能帮忙看看
AD采样程序
AD程序初始化
void IntADInitialization(void)
{
//uint32 tmp1;
#if 0 // 复位即AD态
PINSEL1 = ( PINSEL1 & 0xFF3FFFFF ) | ( 0x01 << AD0 ); // P0.27 设为AD0口
PINSEL2 = ( PINSEL2 & 0xFFFFFFCF ) | ( 0x03 << 4); // 设置PINSEL[5:4]为11
PINSEL2 = ( PINSEL2 & 0xFF9FFF3F ) | ( 0x01 << AD4 ) | ( 0x01 << AD5 ) | ( 0x01 << AD6 ) |( 0x01 << AD7 );
#endif
/* 进行ADC模块设置,其中x<<n表示第n位设置为x(若x超过一位,则向高位顺延) */
ADCR = (1<<0) | // SEL = 1 ,选择通道0
(((Fpclk / 1000000 - 1)) << 8) | // CLKDIV = Fpclk / 1000000 - 1 ,即转换时钟为1MHz
(0 << 16) | // BURST = 0 ,软件控制转换操作
(0 << 17) | // CLKS = 0 ,使用11clock转换
(1 << 21) | // PDN = 1 , 正常工作模式(非掉电转换模式)
(0 << 22) | // TEST1:0 = 00 ,正常工作模式(非测试模式)
(1 << 24) | // START = 1 ,直接启动ADC转换
(0 << 27); // EDGE = 0 (CAP/MAT引脚下降沿触发ADC转换)
DelayNS(10);
ADDataA = ADDR; // 读取ADC结果,并清除DONE标志位
}
采样的程序
uint32 IntADSimple (uint8 Channel)
{
uint8 i;
uint8 tChannel;
uint32 ADC_Data;
tChannel=Channel;
ADCR = ( ADCR & 0x003EFF00 ) | tChannel | ( 1 << 24 ); // 设置第Channel通道,并进行第一次转换
while( ( ADDR & 0x80000000 ) == 0 ); // 等待转换结束
ADC_Data = ADDR; // 读取ADC结果
ADC_Data = ( ADC_Data>>6 ) & 0x3FF; // 提取AD转换值
return ADC_Data;
}
max5306 DA 程序
/*************************************************
名 称:5306输出数据
描 述:
命令字2=第1通道送数据; 命令字3=第2通道送数据;命令字4=第3通道送数据; 命令字5=第4通道送数据;
命令字6=第5通道送数据; 命令字7=第6通道送数据;命令字8=第7通道送数据; 命令字9=第8通道送数据;
命令字0x0A=第1~4通道同时送数据; 命令字0x0B=第5~8通道同时送数据?
修 改:
*************************************************/
void Max5306_Output(uchar Command,uint OutputData)
{
uchar i;
uint intbuf;
Command=Command&0x0f;
OutputData=OutputData&0x0fff;
intbuf=Command;
intbuf=intbuf*0x1000;
intbuf=intbuf&0xf000;
intbuf=intbuf+OutputData;
//Pin_5306_SCLK=1;
//Pin_5306_CS=0;
IO0SET=IO0SET |(1<<12);
IO1CLR=IO1CLR |(1<<22);
//DelayNS1(1);
//for(i=0; i<500; i++);
for (i=0;i<16;i++)
{
if((intbuf&0x8000)>>15)
{
IO0SET=IO0SET |(1<<13);
}
else
IO0CLR=IO0CLR|(1<<13);
IO0CLR=IO0CLR |(1<<12);
IO0SET=IO0SET |(1<<12);
intbuf<<=1;
}
IO1SET=IO1SET |(1<<22);
}
主函数
main()
{
Max5306_Output(0x01,IntADSimple(0x01));
}
当采样的频率超过1k以后,波形输出就严重失真了! |