该项目为数字麦克风通道测试板,采用了Atmel的AT90CAN128单片机,实现对数字麦克风的电流测试,CAN通讯,灵敏度测试等。上位机采用LabVIEW编写,与数字麦克风测试板通过CAN实现通讯,该通道板通过串口与自动分拣机的PLC通讯,实现测试与分拣的协同工作。原理图、PCB图及数据采集部分模块源程序见下图。
原理图
PCB图片
#include "adc.h"
#include "math.h"
#include "sys.h"
#include "uart0.h"
void InitInternalADC(void)
{
}
char Readdata(float *pVal)
{
U32 sdata;
ADC_CS = 0;
asm("nop");//
while(1)
{
ADC_CLK = 0;
asm("nop");
asm("nop");
ADC_CLK = 1;
asm("nop");
asm("nop");
if(ADC_SDA == 0) break;
}
sdata = 0;
for(U8 i = 0;i < 16;i++) //连续读入16位数据
{
sdata <<= 1;
ADC_CLK = 0;
asm("nop");
asm("nop");
ADC_CLK = 1;
if(ADC_SDA == 1)
{
sdata |= 0x1;
}
asm("nop");
asm("nop");
}
ADC_CS = 1;
sdata &= 0xffff;
*pVal = ((float)sdata*4096)/65536;
return 1;
}
char GetADCResult(float *pVal)
{
float fMin,fMax;
float fADC,fSum = 0.0;
PORTD_Bit0 =0;
fMin = 99999.0;
fMax = 0.0;
for( U16 i = 0;i <1002;i++)
{
// Delayms(1);
PORTD_Bit0 ^= 1;
while(!Readdata(&fADC));
fADC = fabs(fADC-2547.00); //2547
if(fADC < fMin) fMin = fADC;
if(fADC > fMax) fMax = fADC;
fSum = fSum + fADC*fADC;
//fSum = fSum + fADC;
};
*pVal = sqrt((fSum - fMax*fMax - fMin*fMin ) / 1000);
//*pVal = (fSum - fMax - fMin ) / 1000;
return 1; //取30次ADC转换的平均电压
}
以上是测试板中数据采集的部分程序。
以前此通道板为外部采购,价格昂贵,且后期维护升级成本较高。通过前期的调研和试验,决定采用Atmel CAN系列的单片机,通过后期的研发和试制,发现不管是在测试采集速度,通讯,稳定性,灵敏度,均能达到要求,且成本较外购低很多,适合大批量生产,结果证明,定型后的通道板在麦克风自动化测试线上使用效果很好,得到客户的高度评价。
这次项目也是第一次接触Atmel的单片机,且在项目中取得很好的效益,以后还会继续使用和关注Atmel的MCU产品。
|