⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adt700_impl.cpp

📁 ADT700的小程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			ErrorCode=11;
			WriteErrorMsg();
			return INVALID_HANDLE_VALUE;
		}
		ResumeThread( g_htIST );

		m_BaseAddr=hReAddress;
		m_nUseNumber++;
		ErrorCode=200;
		WriteErrorMsg();
		return hReAddress;
	}
	else
	{
		ErrorCode=12;
		WriteErrorMsg();
		return INVALID_HANDLE_VALUE;
	}
}

BOOL CADT700_Impl::ADT700_InitBoard()
{
	WRITE_PORT_UCHAR((PUCHAR)m_BaseAddr + CONFIG_BYTE, 0x00);
	WRITE_PORT_UCHAR((PUCHAR)m_BaseAddr + ENABLE_IRQ, 0x00);       //disable IRQ
//	WRITE_PORT_UCHAR((PUCHAR)m_BaseAddr + PPI_CTRL, 0x9B);      // Set PPI Port 0,1,and 2 for input
	WRITE_PORT_UCHAR((PUCHAR)m_BaseAddr + CHANNEL_RANGE, 0x00);  // select channel 0
	WRITE_PORT_UCHAR((PUCHAR)m_BaseAddr + START_CONVERSION, 0); // Start a Dummy conversion
	while ( (READ_PORT_UCHAR((PUCHAR)m_BaseAddr + STATUS_BUSY_INT) & 1) == 0){ }                                      /* Wait 'til conversion done */
	READ_PORT_UCHAR((PUCHAR)m_BaseAddr + READ_AD_DATA_LSB);
	READ_PORT_UCHAR((PUCHAR)m_BaseAddr + READ_AD_DATA_MSB);
	Sleep(5);                                 // delay until board is cleared
	
	return TRUE;
}

BOOL CADT700_Impl::ADT700_DevClose()
{
	m_nUseNumber--;
	if(m_nUseNumber<=0)
	{
		m_fRun=0;
		SetEvent(m_hISTInterruptEvent);
		WRITE_PORT_UCHAR((PUCHAR)m_BaseAddr+ENABLE_IRQ,0x00);
		InterruptDone(m_SysIntr);
		InterruptDisable(m_SysIntr);
		KernelIoControl( IOCTL_HAL_RELEASE_SYSINTR,
								&m_SysIntr,
								sizeof(m_SysIntr),
								NULL,
								0,
								NULL );
		CloseHandle(m_hISTInterruptEvent);
	}
	return TRUE;
}

/*
m_BaseAddr:从ADT700_DevLoad( )函数中返回的句柄
Range:模拟输入电压的量程,可输入10和20
Polarity:模拟输入电压的极性,0表示单极性,1表示双极性
*/
void CADT700_Impl::ADT700_ADSettings(float Range, char Polarity)
{
	m_VoltageRange = Range;
	m_ConversionFactor = m_VoltageRange / 4096.0;
	if(Polarity == BIPOLAR)
		m_Baseline = 0;
	else
		m_Baseline = 5.0;	
}

/*
m_BaseAddr:从ADT700_DevLoad( )函数中返回的句柄
DigitalValue:A/D变换的数据
*/
float CADT700_Impl::ADT700_DigitToSBS(int DigitalValue)
{
	return(DigitalValue * m_ConversionFactor + m_Baseline);
}

void CADT700_Impl::ADT700_ClearIRQ()
{
	WRITE_PORT_UCHAR((PUCHAR)m_BaseAddr+STATUS_BUSY_INT,0x00);
}

void CADT700_Impl::ADT700_SetChannel(unsigned int ChannelL, unsigned int ChannelH)
{
	WRITE_PORT_UCHAR((PUCHAR)m_BaseAddr + CHANNEL_RANGE, ((ChannelH * 16) & 0xf0) | (ChannelL & 0x0f));
}

void CADT700_Impl::ADT700_StartConversion()
{
	WRITE_PORT_UCHAR((PUCHAR)m_BaseAddr + START_CONVERSION, 0);
}

char CADT700_Impl::ADT700_ConversionDone()
{
	unsigned char Status;
	Status = READ_PORT_UCHAR((PUCHAR)m_BaseAddr + STATUS_BUSY_INT);
	if((Status & 1) == 0)
		return 0;
	else
		return 1;
}

void CADT700_Impl::ADT700_EnableIRQ()
{
	WRITE_PORT_UCHAR((PUCHAR)m_BaseAddr+ENABLE_IRQ,0x04);
}

void CADT700_Impl::ADT700_DisableIRQ()
{
	WRITE_PORT_UCHAR((PUCHAR)m_BaseAddr+ENABLE_IRQ,0x00);
}

/*
IrqSou:
0:AD conversion done interrupt
1:0 Timer/counter interrupt
2:external interrupt
3:1 Timer/counter interrupt
*/
void CADT700_Impl::ADT700_SelIRQSource(unsigned char IrqSou)
{
	WRITE_PORT_UCHAR((PUCHAR)m_BaseAddr+ENABLE_IRQ,IrqSou);
}

/*
m_BaseAddr:从ADT700_DevLoad( )函数中返回的句柄
DAout:D/A输出置数方式选择。
置"0"时为单路置数(缺省)。
置"1"时为4路输出并行置数。
Timer5Con:A/D转换计数/定时器5(OUT5)触发使能控制。
置"0"时为不允许计数/定时器5(OUT5)触发(缺省)。
置"1"时为允许计数/定时器5(OUT5)触发。
DMACon: A/D转换DMA传送使能控制。
置"0"时为不允许DMA(缺省)。
置"1"时为允许DMA。
ADTrig:   A/D转换触发方式配置。
置"0"时为软件触发。
置"1"时为硬件触发。
GainCon:  可编程增益放大控制。
          置"1"时增益为1。
          置"2"时增益为2。
          置"4"时增益为4。
          置"8"时增益为8。
通过增益放大可对一些较弱信号进行采集,提高其精度。
*/
void CADT700_Impl::ADT700_ADDAConfig(unsigned char DAout, unsigned char Timer5Con, 
		                         unsigned char DMACon,unsigned char ADTrig,unsigned char GainCon)
{
	if(DAout!=0&&DAout!=1)
		return;
	if(Timer5Con!=0&&Timer5Con!=1)
		return;
	if(DMACon!=0&&DMACon!=1)
		return;
	if(ADTrig!=1&&ADTrig!=0)
		return;
	if(GainCon>3||GainCon<0)
		return;
	int nValue=DAout*128+Timer5Con*64+DMACon*32+ADTrig*16+GainCon;
	WRITE_PORT_UCHAR((PUCHAR)m_BaseAddr+CONFIG_BYTE,nValue);
}

void CADT700_Impl::ADT700_WriteDataDA(unsigned int DAChannel, int DigitalValue)
{
	int MSB, LSB;
	LSB = DigitalValue % 256;
	MSB = DigitalValue / 256 + DAChannel * 16;
	WRITE_PORT_UCHAR((PUCHAR)m_BaseAddr + WRITE_DA_DATA_MSB, MSB);
	WRITE_PORT_UCHAR((PUCHAR)m_BaseAddr + WRITE_DA_DATA_LSB, LSB);
}

void CADT700_Impl::ADT700_FourDAPalEn()
{
}

unsigned char CADT700_Impl::ADT700_ChannelSwitch()
{
	unsigned char chBusy=READ_PORT_UCHAR((PUCHAR)m_BaseAddr + STATUS_BUSY_INT);
	return chBusy;
}

unsigned char CADT700_Impl::ADT700_IRQStatus()
{
	unsigned char chBusy=READ_PORT_UCHAR((PUCHAR)m_BaseAddr + STATUS_BUSY_INT);
	return chBusy&0x02;
}

int CADT700_Impl::ADT700_ReadData()
{
	int MSB, LSB;

	MSB = READ_PORT_UCHAR((PUCHAR)m_BaseAddr + READ_AD_DATA_MSB);
	LSB = READ_PORT_UCHAR((PUCHAR)m_BaseAddr + READ_AD_DATA_LSB);
	m_Channel = MSB / 16;
	return((MSB & 0x0f ) * 256 + LSB - 2048);
}

/*
m_BaseAddr:从ADT700_DevLoad( )函数中返回的句柄
Chip: 1表示第一片82C54,2表示第二片82C54
Clock:82C54芯片的3个计数器/定时器,0表示计数器0,1表示计数器1,2表示计数器2
Mode:82C54芯片的工作方式,0~5分别表示方式0~方式5
*/
void CADT700_Impl::ADT700_ClockMode(unsigned char Chip,unsigned char Clock, unsigned char Mode)
{
	unsigned char StatusByte;

	if(Chip!=1&&Chip!=0)
		return;
	WRITE_PORT_UCHAR((PUCHAR)m_BaseAddr  + CONFIG_BYTE, Chip);
	StatusByte = (Clock * 64) + (Mode * 2) + 48;
	WRITE_PORT_UCHAR((PUCHAR)m_BaseAddr  + TIMER_CTRL, StatusByte);
}

/*
Chip:1-2
Clock:0-2
*/
void CADT700_Impl::ADT700_ClockDivisor(unsigned char Chip,unsigned char Clock, unsigned int Divisor)
{
	unsigned char MSB, LSB;
	PUCHAR PortID;

	if(Chip!=1&&Chip!=0)
		return;
	WRITE_PORT_UCHAR((PUCHAR)m_BaseAddr  + CONFIG_BYTE, Chip);
	PortID = (PUCHAR)m_BaseAddr + TIMER_0 + Clock;
	LSB = Divisor % 256;
	MSB = Divisor / 256;
	WRITE_PORT_UCHAR(PortID, LSB);
	WRITE_PORT_UCHAR(PortID, MSB);

	m_arrFrequency[(Chip-1)*3+Clock].nMaxCounter=Divisor;
}

/*
m_BaseAddr:从ADT700_DevLoad( )函数中返回的句柄
Chip: 1表示第一片82C54,2表示第二片82C54
Timer:82C54芯片的3个计数器/定时器,0表示计数器0,1表示计数器1,2表示计数器2
*/
unsigned int CADT700_Impl:: ADT700_ClockReadBack(unsigned char Chip,unsigned char Timer)
{
	unsigned int CounterValue;
	unsigned char LSB, MSB;


	if(Chip!=1&&Chip!=0)
		return 0;
	WRITE_PORT_UCHAR((PUCHAR)m_BaseAddr  + CONFIG_BYTE, Chip);

	WRITE_PORT_UCHAR((PUCHAR)m_BaseAddr + TIMER_CTRL, Timer * 64);
	LSB = READ_PORT_UCHAR((PUCHAR)m_BaseAddr + TIMER_0 + Timer);
	MSB = READ_PORT_UCHAR((PUCHAR)m_BaseAddr + TIMER_0 + Timer);
	CounterValue = (MSB * 256) + LSB;
	return CounterValue;
}

/*
m_BaseAddr:从ADT700_DevLoad( )函数中返回的句柄
Chip: 1表示第一片82C54,2表示第二片82C54
Timer:82C54芯片的3个计数器/定时器,0表示计数器0,1表示计数器1,2表示计数器2
*/
char CADT700_Impl::ADT700_ReadPITStatus(unsigned char Chip,unsigned char Timer)
{
	unsigned char status;

	if(Chip!=1&&Chip!=0)
		return 0;
	WRITE_PORT_UCHAR((PUCHAR)m_BaseAddr  + CONFIG_BYTE, Chip);
	switch(Timer){
	case 0:
		{
		WRITE_PORT_UCHAR((PUCHAR)m_BaseAddr + TIMER_CTRL, 0xe2);
		break;
		}
	case 1:
		{
		WRITE_PORT_UCHAR((PUCHAR)m_BaseAddr + TIMER_CTRL, 0xe4);
		break;
		}
	default:
		{
		WRITE_PORT_UCHAR((PUCHAR)m_BaseAddr + TIMER_CTRL, 0xe8);
		break;
		}
	}
	status = READ_PORT_UCHAR((PUCHAR)m_BaseAddr + TIMER_0 + Timer);
	if(status & 0x80)
		return(HIGH);
	else
		return(LOW);
}

/*
m_BaseAddr:从ADT700_DevLoad( )函数中返回的句柄
InputPort:71055芯片的3个I/O口,0表示A口,1表示B口,2表示C口
返回从指定I/O口读出的值
*/
unsigned char CADT700_Impl::ADT700_ReadDigitIO(unsigned char InputPort)
{
	return(READ_PORT_UCHAR((PUCHAR)m_BaseAddr + PPI_0 + InputPort));
}

void CADT700_Impl::ADT700_WriteDigitIO(unsigned char OutputPort, unsigned char volt)
{
	WRITE_PORT_UCHAR((PUCHAR)m_BaseAddr + PPI_0 + OutputPort, volt);
}

/*
m_BaseAddr:从ADT700_DevLoad( )函数中返回的句柄
Port0:71055芯片的A口,1表示输入,0表示输出
Port1:71055芯片的B口,1表示输入,0表示输出
Port2:71055芯片的C口,1表示输入,0表示输出
*/
void CADT700_Impl::ADT700_ConfigIOPorts(unsigned char Port0, unsigned char Port1,unsigned char Port2H,unsigned char Port2L)
{
	unsigned char ControlByte;

	ControlByte = 128 + (Port0 * 16) + (Port1 * 2)+(Port2H * 8)+ Port2L;
	WRITE_PORT_UCHAR((PUCHAR)m_BaseAddr + PPI_CTRL, ControlByte);
}

BOOL CADT700_Impl::ADT700_CalAllTimerFrequency()
{
	short nChip,nClock;
	int nValue=0;
	for(int i=0;i<6;i++)
	{
		nChip=i/3;//+1;
		nClock=i%3;
		nValue=ADT700_ClockReadBack(nChip,nClock);
		if(m_arrFrequency[i].nLastNum!=-1)
		{
			if(m_arrFrequency[i].nLastNum<nValue)
				m_arrFrequency[i].nLastNum=m_arrFrequency[i].nLastNum+m_arrFrequency[i].nMaxCounter;
			m_arrFrequency[i].fFrequency=(float)((float)(m_arrFrequency[i].nLastNum-nValue)/(GetTickCount()-m_arrFrequency[i].nLastTime))*1000.;
		}
		m_arrFrequency[i].nLastNum=nValue;
		m_arrFrequency[i].nLastTime=GetTickCount();
	}
	return TRUE;
}

BOOL CADT700_Impl::AverageOneData(int nIndex, float &fReValue)
{
	float fData=0;
	float fMax,fMin;
	fMax=m_fGatheredVolt[0][nIndex];
	fMin=m_fGatheredVolt[0][nIndex];
	fData=m_fGatheredVolt[0][nIndex];
	for(int j=1;j<GATHERNUM;j++)
	{
		fData+=m_fGatheredVolt[j][nIndex];
		if(fMax<m_fGatheredVolt[j][nIndex])
			fMax=m_fGatheredVolt[j][nIndex];
		if(fMin>m_fGatheredVolt[j][nIndex])
			fMin=m_fGatheredVolt[j][nIndex];
	}
	//digit
	fData=(fData-fMax-fMin)/(GATHERNUM-2);
	//convert to volt
	fReValue=ADT700_DigitToSBS((int)fData);
	return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -