Точнее - два дивайса. Выходы подаются на GPIO ноги, на которые можно назначить прерывания Rising/Falling edge. Микроконтроллер - lpc1768
Меряем одно время прихода Rising edge, меряем время прихода Falling edge, получаем два интервала времени, потом по формуле
Temp= CoeffSensorA + CoeffSensorB * td0 / dt1;
получаем температуру, и всё работает замечательно.
Только вот изредка меряется какая-то ерунда. Стал разбираться.
Сделал тест
Код
int TL[1000];
int TS[1000];
int tln=0;
void EINT3_IRQHandle(void)
{ int ti, v;
static int tiold=0;
ti = LPC_TIM1->TC;
if((LPC_GPIOINT->IO0IntStatR & 0x00000001) || (LPC_GPIOINT->IO0IntStatF & 0x0000001)) // это ШИМ с первого TMP03
{ v = (LPC_GPIOINT->IO0IntStatR & 0x00000001) | (((LPC_GPIOINT->IO0IntStatF & 0x0000001)<<1));
if(tln == 0)
TL[tln] = ti;
else
TL[tln] = ti - tiold;
tiold = ti;
TS[tln] =v;
tln++;
if(tln == 1000)
tln = 0;
LPC_GPIOINT->IO0IntClr =0x00000001;
}
if((LPC_GPIOINT->IO0IntStatR & 0x00000002) || (LPC_GPIOINT->IO0IntStatF & 0x0000002)) // это ШИМ с второго TMP03
{
LPC_GPIOINT->IO0IntClr =0x00000002;
}
}
int TS[1000];
int tln=0;
void EINT3_IRQHandle(void)
{ int ti, v;
static int tiold=0;
ti = LPC_TIM1->TC;
if((LPC_GPIOINT->IO0IntStatR & 0x00000001) || (LPC_GPIOINT->IO0IntStatF & 0x0000001)) // это ШИМ с первого TMP03
{ v = (LPC_GPIOINT->IO0IntStatR & 0x00000001) | (((LPC_GPIOINT->IO0IntStatF & 0x0000001)<<1));
if(tln == 0)
TL[tln] = ti;
else
TL[tln] = ti - tiold;
tiold = ti;
TS[tln] =v;
tln++;
if(tln == 1000)
tln = 0;
LPC_GPIOINT->IO0IntClr =0x00000001;
}
if((LPC_GPIOINT->IO0IntStatR & 0x00000002) || (LPC_GPIOINT->IO0IntStatF & 0x0000002)) // это ШИМ с второго TMP03
{
LPC_GPIOINT->IO0IntClr =0x00000002;
}
}
Смотрю на TS и вижу вот такое:
1
2
1
2
3 <== этого не может быть, потому что не может быть никогда
2
1
2
1
Т.е. одновременно приходит и Rising м Falling edge
причем, если смотреть на TL - никакого дребезга с небольшими временами не видно.
Одновременно Rising и Falling (3) получаются вроде бы точно вместо Rising (1), но это на небольшом интервале измерения. Причем, если Rising и Falling одновременно считать за Rising, то смотри начало - все меряется замечательно, кроме как изредка какая-то фигня. Причем эта фигня систематическая и не лечится усреднением. Связано ли это как-то с одновременным приходом Rising м Falling edge - пока неясно.