📄 adt700_impl.cpp
字号:
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 + -