久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 975|回復: 0
打印 上一主題 下一主題
收起左側

ICP10125的驅動程序

[復制鏈接]
跳轉到指定樓層
樓主
在嵌入式開發板上使用c語言采用IIC獲取ICP10125傳感器的有效值文件內含相關文檔及程序源碼

ICP10125.c
  1. #include <stdio.h>
  2. #include <sys/ioctl.h>
  3. #include <sys/types.h>
  4. #include <fcntl.h>
  5. #include <stdlib.h>
  6. #include <linux/i2c-dev.h>
  7. #include <i2c/smbus.h>
  8. #include <unistd.h>

  9. #define ICP_I2C_ID 0x63

  10. #define ICP_CMD_READ_ID 0xefc8
  11. #define ICP_CMD_SET_ADDR 0xc595
  12. #define ICP_CMD_READ_OTP 0xc7f7

  13. // Transmit T First
  14. #define ICP_CMD_MEAS_LP 0x609c
  15. #define ICP_CMD_MEAS_N 0x6825
  16. #define ICP_CMD_MEAS_LN 0x70df
  17. #define ICP_CMD_MEAS_ULN 0x7866

  18. // 壓力計算常數
  19. typedef struct inv_invpres
  20. {
  21.     int file;
  22.     u_int32_t min_delay_us;
  23.     u_int8_t pressure_en;
  24.     u_int8_t temperature_en;
  25.     float sensor_constants[4]; // OTP values
  26.     float p_Pa_calib[3];
  27.     float LUT_lower;
  28.     float LUT_upper;
  29.     float quadr_factor;
  30.     float offst_factor;
  31. } inv_invpres_t;

  32. int file_init()
  33. {
  34.     int file = 0;
  35.     file = open("/dev/i2c-1", O_RDWR);
  36.     if (file < 0)
  37.     {
  38.         printf("open error\n");
  39.         exit(1);
  40.     }

  41.     if (ioctl(file, I2C_SLAVE, ICP_I2C_ID) < 0)
  42.     {
  43.         printf("ioctl error\n");
  44.         exit(1);
  45.     }
  46.     return file;
  47. }

  48. void init_base(struct inv_invpres *s, short *otp)
  49. {
  50.     int i;
  51.     for (i = 0; i < 4; i++)
  52.     {
  53.         s->sensor_constants[i] = (float)otp[i];
  54.         // printf("sensor_constants[%d]:%.2f, ", i, s->sensor_constants[i]);
  55.     }
  56.     s->p_Pa_calib[0] = 45000.0;
  57.     s->p_Pa_calib[1] = 80000.0;
  58.     s->p_Pa_calib[2] = 105000.0;
  59.     s->LUT_lower = 3.5 * (1 << 20);
  60.     s->LUT_upper = 11.5 * (1 << 20);
  61.     s->quadr_factor = 1 / 16777216.0;
  62.     s->offst_factor = 2048.0;
  63.     // printf("\n");
  64. }

  65. int read_otp_from_i2c(struct inv_invpres *s, short *out)
  66. {
  67.     unsigned char data_write[10];
  68.     unsigned char data_read[10] = {0};
  69.     int ret;
  70.     int i;
  71.     // OTP Read mode
  72.     data_write[0] = 0xC5;
  73.     data_write[1] = 0x95;
  74.     data_write[2] = 0x00;
  75.     data_write[3] = 0x66;
  76.     data_write[4] = 0x9C;
  77.     ret = write(s->file, data_write, 5);
  78.     if (ret == 0)
  79.         return 1;
  80.     // Read OTP values
  81.     for (i = 0; i < 4; i++)
  82.     {
  83.         data_write[0] = 0xC7;
  84.         data_write[1] = 0xF7;
  85.         ret = write(s->file, data_write, 2);
  86.         if (ret == 0)
  87.             return 1;
  88.         ret = read(s->file, data_read, 3);
  89.         if (ret == 0)
  90.             return 2;
  91.         out[i] = data_read[0] << 8 | data_read[1];
  92.         // printf("%02x, %02x, %02x\n", data_read[0], data_read[1], data_read[2]);
  93.     }
  94.     return 0;
  95. }

  96. int inv_invpres_init(struct inv_invpres *s)
  97. {
  98.     short otp[4];
  99.     s->file = file_init();
  100.     read_otp_from_i2c(s, otp);
  101.     init_base(s, otp);
  102.     return 0;
  103. }

  104. // p_Pa -- List of 3 values corresponding to applied pressure in Pa
  105. // p_LUT -- List of 3 values corresponding to the measured p_LUT values at the applied pressures.
  106. void calculate_conversion_constants(struct inv_invpres *s, float *p_Pa,
  107.                                     float *p_LUT, float *out)
  108. {
  109.     float A, B, C;
  110.     C = (p_LUT[0] * p_LUT[1] * (p_Pa[0] - p_Pa[1]) +
  111.          p_LUT[1] * p_LUT[2] * (p_Pa[1] - p_Pa[2]) +
  112.          p_LUT[2] * p_LUT[0] * (p_Pa[2] - p_Pa[0])) /
  113.         (p_LUT[2] * (p_Pa[0] - p_Pa[1]) +
  114.          p_LUT[0] * (p_Pa[1] - p_Pa[2]) +
  115.          p_LUT[1] * (p_Pa[2] - p_Pa[0]));
  116.     A = (p_Pa[0] * p_LUT[0] - p_Pa[1] * p_LUT[1] - (p_Pa[1] - p_Pa[0]) * C) / (p_LUT[0] - p_LUT[1]);
  117.     B = (p_Pa[0] - A) * (p_LUT[0] + C);
  118.     out[0] = A;
  119.     out[1] = B;
  120.     out[2] = C;
  121. }

  122. // p_LSB -- Raw pressure data from sensor
  123. // T_LSB -- Raw temperature data from sensor
  124. int inv_invpres_process_data(struct inv_invpres *s, int p_LSB, int T_LSB,
  125.                              float *pressure, float *temperature)
  126. {
  127.     float t;
  128.     float s1, s2, s3;
  129.     float in[3];
  130.     float out[3];
  131.     float A, B, C;
  132.     t = (float)(T_LSB - 32768);
  133.     s1 = s->LUT_lower + (float)(s->sensor_constants[0] * t * t) * s->quadr_factor;
  134.     s2 = s->offst_factor * s->sensor_constants[3] + (float)(s->sensor_constants[1] * t * t) * s->quadr_factor;
  135.     s3 = s->LUT_upper + (float)(s->sensor_constants[2] * t * t) * s->quadr_factor;
  136.     in[0] = s1;
  137.     in[1] = s2;
  138.     in[2] = s3;
  139.     calculate_conversion_constants(s, s->p_Pa_calib, in, out);
  140.     A = out[0];
  141.     B = out[1];
  142.     C = out[2];
  143.     *pressure = A + B / (C + p_LSB);
  144.     // printf("%.2f, %.2f, %.2f, %d\n", A, B, C, p_LSB);
  145.     *temperature = -45.f + 175.f / 65536.f * T_LSB;
  146.     return 0;
  147. }

  148. void measure(struct inv_invpres *s, int32_t *raw_t, int32_t *raw_p)
  149. {
  150.         u_int8_t buf[2];
  151.         u_int8_t res_buf[12];
  152.         buf[0] = 0x68;
  153.         buf[1] = 0x25;
  154.         int ret = write(s->file, buf, 2);
  155.         if (ret != 2) {
  156.                 printf("i2c transaction failed %d\n", ret);
  157.         }
  158.         while(read(s->file, res_buf, 9) !=9 ) usleep(10*1000);
  159.         {
  160.                 // printf("contains the read byte \n");
  161.                 // for(int i=0;i<9;i++)
  162.                 // {
  163.                         // printf("%02x  ",res_buf[i]);
  164.                 // }
  165.                 // printf("\n");
  166.         }

  167.         *raw_t = (res_buf[0]<<8)|res_buf[1];
  168.         *raw_p = (res_buf[3]<<16)|(res_buf[4]<<8)|res_buf[6];
  169. }

  170. int main()
  171. {
  172.     int32_t raw_t;
  173.     int32_t raw_p;
  174.     float temperature;
  175.     float pressure;
  176.     inv_invpres_t obj;
  177.     inv_invpres_init(&obj);

  178.     measure(&obj, &raw_t, &raw_p);
  179.     // printf("raw_t: %02x, raw_p: %02x \n", raw_t, raw_p);

  180.     inv_invpres_process_data(&obj, raw_p, raw_t,
  181.                              &pressure, &temperature);
  182.     printf("%.3f,%.3f", temperature, pressure);

  183.     return 0;
  184. }
復制代碼

pdf下載: ICP-101251.2.zip (1.28 MB, 下載次數: 8)

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91在线视频精品 | 在线播放亚洲 | 日韩高清www | 日本欧美在线观看视频 | 四虎海外 | 中文字幕日韩专区 | 午夜性色a√在线视频观看9 | 欧美精品久久久久 | 国产美女黄色 | 免费三级黄 | 日韩欧美国产一区二区三区 | 真人一级毛片 | 999免费观看视频 | 日本人爽p大片免费看 | 浮生影院免费观看中文版 | 久久久精彩视频 | 国产免费拔擦拔擦8x高清 | 九九综合 | 日韩精品免费一区二区在线观看 | 亚洲一av| 亚洲欧美日韩精品久久亚洲区 | 四虎影院新地址 | 国产欧美精品一区二区色综合 | 久久一区二区三区电影 | 天堂一区二区三区 | 在线看中文字幕 | 精品久久国产视频 | 久久最新| 999久久久 | aaa一区 | 欧美日韩高清在线一区 | 黄免费观看 | 国产精品久久久久婷婷二区次 | 国产高清一区二区三区 | 国产精品色哟哟网站 | 亚洲午夜精品一区二区三区他趣 | 综合久久av | 日韩精品一区二区三区中文在线 | 天天人人精品 | 午夜精品一区二区三区三上悠亚 | sese视频在线观看 |