Re: датчик давления HP02S
Добавлено: Вт май 17, 2011 20:57:21
Упустил - HP03Ser60 писал(а):Кстати, о каком датчике идет речь?
Здесь можно немножко помяукать :)
https://radiokot.ru:443/forum/
Упустил - HP03Ser60 писал(а):Кстати, о каком датчике идет речь?
Код: Выделить всё
//----------------------------------------------------------------------------
//Модуль обслуживания датчика давления HP02S
//----------------------------------------------------------------------------
#include "Main.h"
#include "HP02S.h"
#include "I2C.h"
//---------------- Используемые модулем аппаратные ресурсы: ------------------
//Датчик давления использует тактовую частоту, которую формирует таймер 1
//на выходе OC1A. Для обмена данными с датчиком используется порт I2C,
//реализованный программно.
//----------------------------- Константы: -----------------------------------
#define F_MCLK 32768 //тактовая частота датчика, Гц
#define TADC 50 //время преобразования АЦП, мс
#define TIDLE 900 //время ожидания следующего преобразования, мс
#define T1VAL (F_CLK * 5E5 / F_MCLK + 0.5)
enum { //коды состояний измерителя
HP_IDLE, //измеритель в состоянии ожидания
HP_MEASD, //измерение давления
HP_MEAST, //измерение температуры
HP_CALC //вычисление давления
};
//----------------------------- Переменные: ----------------------------------
static char State; //состояние измерителя
static unsigned int Hp_D0; //калибровочный коэффициент D0
static unsigned int Hp_T0; //калибровочный коэффициент T0
static unsigned int Hp_P0; //калибровочный коэффициент P0
static unsigned int Hp_S; //калибровочный коэффициент S
static unsigned int Hp_C; //калибровочный коэффициент C
static unsigned int Hp_D1; //измеренный код давления D1
static unsigned int Hp_T1; //измеренный код температуры T1
static int Pressure; //текущее значение давления
//------------------ Инициализация подсистемы измерителя: --------------------
void HP02S_Init(void)
{
TCCR1A = (1 << COM1A0); //toggle OC1A on compare
TCCR1B = (1 << WGM12) | (1 << CS10); //CTC, CK/1
OCR1A = T1VAL - 1;
//чтение калибровочных коэффициентов:
I2C_Start(); //start
I2C_Wr(0xA0); //address
I2C_Wr(2); //subaddress
I2C_Stop(); //stop
I2C_Start(); //start
I2C_Wr(0xA0 | I2C_RD); //address + read
Hp_D0 = I2C_RdAck() << 8; //D0 (MSB)
Hp_D0 = Hp_D0 | I2C_RdAck(); //D0 (LSB)
Hp_T0 = I2C_RdAck() << 8; //T0 (MSB)
Hp_T0 = Hp_T0 | I2C_RdAck(); //T0 (LSB)
Hp_P0 = I2C_RdAck() << 8; //P0 (MSB)
Hp_P0 = Hp_P0 | I2C_RdAck(); //P0 (LSB)
Hp_S = I2C_RdAck() << 8; //S (MSB)
Hp_S = Hp_S | I2C_RdAck(); //S (LSB)
Hp_C = I2C_RdAck() << 8; //C (MSB)
Hp_C = Hp_C | I2C_RdNak(); //C (LSB) + NAK
I2C_Stop(); //stop
State = HP_IDLE;
}
//------------------------- Процесс измерения: -------------------------------
void HP02S_Exe(bool t)
{
static int Interval = 0; //измерительный интервал
if(t)
{
if(Interval)
{
Interval--;
}
else
{
switch(State)
{
case HP_IDLE:
{
//запуск измерения давления:
Port_XCLR_1;
I2C_Start();
I2C_Wr(0xEE);
I2C_Wr(0xFF);
I2C_Wr(0xF0);
I2C_Stop();
Interval = ms2sys(TADC);
State = HP_MEASD;
break;
}
case HP_MEASD:
{
//чтение измеренного кода давления:
I2C_Start();
I2C_Wr(0xEE);
I2C_Wr(0xFD);
I2C_Stop();
I2C_Start();
I2C_Wr(0xEE | I2C_RD);
Hp_D1 = I2C_RdAck() << 8;
Hp_D1 = Hp_D1 | I2C_RdNak();
I2C_Stop();
//запуск измерения температуры:
I2C_Start();
I2C_Wr(0xEE);
I2C_Wr(0xFF);
I2C_Wr(0xE8);
I2C_Stop();
Interval = ms2sys(TADC);
State = HP_MEAST;
break;
}
case HP_MEAST:
{
//чтение измеренного кода температуры:
I2C_Start();
I2C_Wr(0xEE);
I2C_Wr(0xFD);
I2C_Stop();
I2C_Start();
I2C_Wr(0xEE | I2C_RD);
Hp_T1 = I2C_RdAck() << 8;
Hp_T1 = Hp_T1 | I2C_RdNak();
I2C_Stop();
Port_XCLR_0;
State = HP_CALC;
break;
}
case HP_CALC:
{
//вычисление давления:
long dUP = (long)Hp_D1 - (long)Hp_D0;
long dT = (long)Hp_T1 - (long)Hp_T0;
long dUT = (((dT * 29L) / 50L - (dT * dT) / 76666L) * (long)Hp_S) / (long)Hp_C;
Pressure = (long)Hp_P0 + ((dUP + dUT) * 100L) / (long)Hp_S;
Interval = ms2sys(TIDLE);
State = HP_IDLE;
break;
}
}
}
}
}
//--------------- Считывание текущего значения давления: ---------------------
int HP02S_GetP(void)
{
return(Pressure);
}
//----------------------------------------------------------------------------
Спасибо, ошибка была вызвана скорее невнимательностью: не привел тип unsigned к signed до вычислений, оставив это компилятору (avr-gcc).Ser60 писал(а):Успеха в отладке! Напишите потом в чем была проблема.
сама отвалиласьSer60 писал(а):Кстати, вы сняли с него защитную пленку?
С?Ничегонеработает писал(а):У меня так:
Код: Выделить всё
//---------------------------------------------------------------------------- //Модуль обслуживания датчика давления HP02S //---------------------------------------------------------------------------- #include "Main.h" #include "HP02S.h" #include "I2C.h" //---------------- Используемые модулем аппаратные ресурсы: ------------------ //Датчик давления использует тактовую частоту, которую формирует таймер 1 //на выходе OC1A. Для обмена данными с датчиком используется порт I2C, //реализованный программно. //----------------------------- Константы: ----------------------------------- #define F_MCLK 32768 //тактовая частота датчика, Гц #define TADC 50 //время преобразования АЦП, мс #define TIDLE 900 //время ожидания следующего преобразования, мс #define T1VAL (F_CLK * 5E5 / F_MCLK + 0.5) enum { //коды состояний измерителя HP_IDLE, //измеритель в состоянии ожидания HP_MEASD, //измерение давления HP_MEAST, //измерение температуры HP_CALC //вычисление давления }; //----------------------------- Переменные: ---------------------------------- static char State; //состояние измерителя static unsigned int Hp_D0; //калибровочный коэффициент D0 static unsigned int Hp_T0; //калибровочный коэффициент T0 static unsigned int Hp_P0; //калибровочный коэффициент P0 static unsigned int Hp_S; //калибровочный коэффициент S static unsigned int Hp_C; //калибровочный коэффициент C static unsigned int Hp_D1; //измеренный код давления D1 static unsigned int Hp_T1; //измеренный код температуры T1 static int Pressure; //текущее значение давления //------------------ Инициализация подсистемы измерителя: -------------------- void HP02S_Init(void) { TCCR1A = (1 << COM1A0); //toggle OC1A on compare TCCR1B = (1 << WGM12) | (1 << CS10); //CTC, CK/1 OCR1A = T1VAL - 1; //чтение калибровочных коэффициентов: I2C_Start(); //start I2C_Wr(0xA0); //address I2C_Wr(2); //subaddress I2C_Stop(); //stop I2C_Start(); //start I2C_Wr(0xA0 | I2C_RD); //address + read Hp_D0 = I2C_RdAck() << 8; //D0 (MSB) Hp_D0 = Hp_D0 | I2C_RdAck(); //D0 (LSB) Hp_T0 = I2C_RdAck() << 8; //T0 (MSB) Hp_T0 = Hp_T0 | I2C_RdAck(); //T0 (LSB) Hp_P0 = I2C_RdAck() << 8; //P0 (MSB) Hp_P0 = Hp_P0 | I2C_RdAck(); //P0 (LSB) Hp_S = I2C_RdAck() << 8; //S (MSB) Hp_S = Hp_S | I2C_RdAck(); //S (LSB) Hp_C = I2C_RdAck() << 8; //C (MSB) Hp_C = Hp_C | I2C_RdNak(); //C (LSB) + NAK I2C_Stop(); //stop State = HP_IDLE; } //------------------------- Процесс измерения: ------------------------------- void HP02S_Exe(bool t) { static int Interval = 0; //измерительный интервал if(t) { if(Interval) { Interval--; } else { switch(State) { case HP_IDLE: { //запуск измерения давления: Port_XCLR_1; I2C_Start(); I2C_Wr(0xEE); I2C_Wr(0xFF); I2C_Wr(0xF0); I2C_Stop(); Interval = ms2sys(TADC); State = HP_MEASD; break; } case HP_MEASD: { //чтение измеренного кода давления: I2C_Start(); I2C_Wr(0xEE); I2C_Wr(0xFD); I2C_Stop(); I2C_Start(); I2C_Wr(0xEE | I2C_RD); Hp_D1 = I2C_RdAck() << 8; Hp_D1 = Hp_D1 | I2C_RdNak(); I2C_Stop(); //запуск измерения температуры: I2C_Start(); I2C_Wr(0xEE); I2C_Wr(0xFF); I2C_Wr(0xE8); I2C_Stop(); Interval = ms2sys(TADC); State = HP_MEAST; break; } case HP_MEAST: { //чтение измеренного кода температуры: I2C_Start(); I2C_Wr(0xEE); I2C_Wr(0xFD); I2C_Stop(); I2C_Start(); I2C_Wr(0xEE | I2C_RD); Hp_T1 = I2C_RdAck() << 8; Hp_T1 = Hp_T1 | I2C_RdNak(); I2C_Stop(); Port_XCLR_0; State = HP_CALC; break; } case HP_CALC: { //вычисление давления: long dUP = (long)Hp_D1 - (long)Hp_D0; long dT = (long)Hp_T1 - (long)Hp_T0; long dUT = (((dT * 29L) / 50L - (dT * dT) / 76666L) * (long)Hp_S) / (long)Hp_C; Pressure = (long)Hp_P0 + ((dUP + dUT) * 100L) / (long)Hp_S; Interval = ms2sys(TIDLE); State = HP_IDLE; break; } } } } } //--------------- Считывание текущего значения давления: --------------------- int HP02S_GetP(void) { return(Pressure); } //----------------------------------------------------------------------------
Да, Си.Макс электронщик писал(а):С?
Так исходник же перед Вами. Что конкретно не понятно?Макс электронщик писал(а):объясните пожалуйста как разговаривать с HP03-02
Что такое исходник!Ничегонеработает писал(а):Макс электронщик писал(а): Так исходник же перед Вами. Что конкретно не понятно?
Как красиво послал!
Спасибо.