返回列表 发新帖

SAM4E-EK开发板代码解读12——lm75

[复制链接]

28

主题

45

帖子

1万

积分

允许发帖

积分
10186
发表于 2020-5-14 14:50:52 | 显示全部楼层 | 阅读模式
关键词:
Microchip Atmel  SAM4E SAM4E-EK  SAM4E16E 芯片 LM75A 温度



概述:简要介绍读取实时温度和LM75A



LM75A是一个高速I2C接口的温度传感器,可以在-55℃~+125℃的温度范围内将温度直接转换为数字信号,并可实现0.125℃的精度。MCU可以通过I2C总线直接读取其内部寄存器中的数据,并可通过I2C对4个数据寄存器进行操作,以设置成不同的工作模式。

LM75A有3个可选的逻辑地址管脚,使得同一总线上可同时连接8个器件而不发生地址冲突。LM75A可配置成不同的工作模式。它可设置成在正常工作模式下周期性地对环境温度进行监控,或进入关断模式来将器件功耗降至最低。OS输出有2 种可选的工作模式:OS比较器模式和OS中断模式,OS输出可选择高电平或低电平有效。

正常工作模式下,当器件上电时,OS工作在比较器模式,温度阈值为80℃,滞后阈值为75℃。

特点:
  • 提供环境温度对应的数字信息,直接表示温度;
  • 可以对某个特定温度作出反应,可以配置成中断或者比较器模式(OS输出);
  • 高速I2C总线接口,有A2-A0地址线,一条总线上最多可同时使用8个LM75A;
  • 低功耗设计,工作电流典型值为250uA,掉电模式为3.5uA;
  • 测量的温度最大范围为-55℃~+125℃;
  • 宽工作电压范围:2.8V~5.5V;
  • 提供了良好的温度精度(0.125℃);
  • 可编程温度阈值和滞后设定点。




  • 打开产品光盘SAM4E16E-EK/SAM4E16E-EK中文资料/softpack软件包/Atmel Studio 7,打开13b_TWI_MASTER_EXAMPLE_lm75例子。


int main(void)
{

int8_t temperature_int = 0;
uint32_t temperature_dec = 0;
sysclk_init();

board_init();

configure_console();

puts(STRING_HEADER);

printf("Configure system tick to get 1ms tick period.\n\r");
if (SysTick_Config(sysclk_get_cpu_hz() / 1000)) {
  printf("-E- Systick configuration error\n\r");
  while (1) {
  }
}

/*设置LM75配置。

* 2个故障队列周期;

*极性高戒备;

*中断模式下报警输出;

*禁用关机模式。

* /

lm75_init();  //初始化LM75驱动

lm75_set_configuration(

LM75_CONFIG_FAULT_QUEUE_2              |

LM75_CONFIG_ALERT_POLARITY_ACTIVE_HIGH |

LM75_CONFIG_INTERRUPT_MODE);


//设置温度限制,然后得到它
lm75_set_temperature_limit(TEMP_LIMIT_MAX, TEMP_LIMIT_DEC);
lm75_get_temperature_limit(&temperature_int, &temperature_dec);
printf("Temperature Limit:      %d.%04lu\r\n", temperature_int,
   (unsigned long)temperature_dec);
//设置温度滞后,然后得到它
lm75_set_temperature_hysteresis(TEMP_LIMIT_MIN, TEMP_LIMIT_DEC);
lm75_get_temperature_hysteresis(&temperature_int, &temperature_dec);
printf("Temperature Hysteresis: %d.%04lu\r\n", temperature_int,
   (unsigned long)temperature_dec);
while (1) {
//每秒钟检查温度并且打印出来
mdelay(1000);
if (TWI_SUCCESS !=
lm75_get_temperature(&temperature_int,
&temperature_dec)) {
  break;
}
printf("Ambient Temperature:    %d.%04lu\r\n", temperature_int,
(unsigned long)temperature_dec);
}
printf("TWI bus operation error!\r\n");
while (1) {
}
}

















回复

使用道具 举报

28

主题

45

帖子

1万

积分

允许发帖

积分
10186
发表于 2020-5-14 15:00:15 | 显示全部楼层
  1. //读取ul_reg_index指定的LM75寄存器
  2. static uint32_t lm75_read_register(uint32_t ul_reg_index,
  3.                 uint8_t *p_reg_value)
  4. {
  5.         twi_package_t rx = {
  6.                 .chip = BOARD_LM75_ADDR,
  7.                 .addr = {ul_reg_index},
  8.                 .addr_length = 1,
  9.                 .buffer = p_reg_value
  10.         };

  11.         if (ul_reg_index == LM75_CONF_REG) {
  12.                 rx.length = 1;
  13.         } else {
  14.                 rx.length = 2;
  15.         }

  16.         return twi_master_read(BOARD_LM75_TWI_INSTANCE, &rx);
  17. }

  18. //写ul_reg_index指定的theLM75寄存器。
  19. static uint32_t lm75_write_register(uint32_t ul_reg_index,
  20.                 uint8_t *p_reg_value)
  21. {
  22.         twi_package_t tx = {
  23.                 .chip = BOARD_LM75_ADDR,
  24.                 .addr = {ul_reg_index},
  25.                 .addr_length = 1,
  26.                 .buffer = p_reg_value
  27.         };

  28.         if (ul_reg_index == LM75_CONF_REG) {
  29.                 tx.length = 1;
  30.         } else {
  31.                 tx.length = 2;
  32.         }

  33.         return twi_master_write(BOARD_LM75_TWI_INSTANCE, &tx);
  34. }

  35. //将16进制值转换为温度的整数部分。
  36. static void lm75_hex_to_temperature_int(uint8_t uc_hex, int8_t *p_integer)
  37. {
  38.         *p_integer = (int8_t) uc_hex;
  39. }

  40. //将16进制值转换为温度的小数部分
  41. static void lm75_hex_to_temperature_dec(uint8_t uc_hex, uint32_t *p_decimal)
  42. {
  43.         *p_decimal = ((uint32_t) uc_hex >> 4) * LM75_DEC_UNIT;
  44. }

  45. //将温度的整数部分转换为十六进制值。
  46. static void lm75_temperature_to_hex_int(int8_t c_integer, uint8_t *p_hex)
  47. {
  48.         *p_hex = (uint8_t) c_integer;
  49. }

  50. //将温度的小数部分转换为十六进制值。
  51. static void lm75_temperature_to_hex_dec(uint32_t ul_decimal, uint8_t *p_hex)
  52. {
  53.         *p_hex = (uint8_t) ((ul_decimal / LM75_DEC_UNIT) << 4);
  54. }

  55. //初始化控制器的硬件接口
  56. static uint32_t lm75_interface_init(void)
  57. {
  58.         //TWI主初始化。
  59.         twi_master_options_t opt = {
  60.                 .speed = TWI_SPEED,
  61.                 .chip = BOARD_LM75_ADDR
  62.         };

  63.         //初始化TWI主驱动程序。       
  64. return twi_master_setup(BOARD_LM75_TWI_INSTANCE, &opt);
  65. }

  66. //获取环境温度
  67. static uint32_t lm75_get_temperature(int8_t *p_integer,
  68.                 uint32_t *p_decimal)
  69. {
  70.         uint8_t uc_ta[2] = { 0 };
  71.         uint32_t ul_retval = lm75_read_register(LM75_TEMP_REG, uc_ta);

  72.         if (ul_retval == TWI_SUCCESS) {
  73.                 lm75_hex_to_temperature_int(uc_ta[0], p_integer);
  74.                 lm75_hex_to_temperature_dec(uc_ta[1], p_decimal);
  75.         }

  76.         return ul_retval;
  77. }

  78. //设置温度限制
  79. static uint32_t lm75_set_temperature_limit(int8_t c_integer, uint32_t ul_decimal)
  80. {
  81.         uint8_t uc_tset[2] = { 0 };
  82.         lm75_temperature_to_hex_int(c_integer, &uc_tset[0]);
  83.         lm75_temperature_to_hex_dec(ul_decimal, &uc_tset[1]);

  84.         return lm75_write_register(LM75_LIMT_REG, uc_tset);
  85. }

  86. //获取温度限制
  87. static uint32_t  lm75_get_temperature_limit(int8_t *p_integer, uint32_t *p_decimal)
  88. {
  89.         uint8_t uc_tset[2] = { 0 };
  90.         uint32_t ul_retval = lm75_read_register(LM75_LIMT_REG, uc_tset);

  91.         if (ul_retval == TWI_SUCCESS) {
  92.                 lm75_hex_to_temperature_int(uc_tset[0], p_integer);
  93.                 lm75_hex_to_temperature_dec(uc_tset[1], p_decimal);
  94.         }

  95.         return ul_retval;
  96. }

  97. //设置温度滞后
  98. static uint32_t lm75_set_temperature_hysteresis(int8_t c_integer,
  99.                 uint32_t ul_decimal)
  100. {
  101.         uint8_t uc_thyst[2] = { 0 };
  102.         lm75_temperature_to_hex_int(c_integer, &uc_thyst[0]);
  103.         lm75_temperature_to_hex_dec(ul_decimal, &uc_thyst[1]);

  104.         return lm75_write_register(LM75_HYST_REG, uc_thyst);
  105. }

  106. //得到温度滞后
  107. static uint32_t lm75_get_temperature_hysteresis(int8_t *p_integer,
  108.                 uint32_t *p_decimal)
  109. {
  110.         uint8_t uc_thyst[2] = { 0 };
  111.         uint32_t ul_retval = lm75_read_register(LM75_HYST_REG, uc_thyst);

  112.         if (ul_retval == TWI_SUCCESS) {
  113.                 lm75_hex_to_temperature_int(uc_thyst[0], p_integer);
  114.                 lm75_hex_to_temperature_dec(uc_thyst[1], p_decimal);
  115.         }

  116.         return ul_retval;
  117. }

  118. //设置LM75配置。
  119. static uint32_t lm75_set_configuration(uint8_t uc_config)
  120. {
  121.         return lm75_write_register(LM75_CONF_REG, &uc_config);
  122. }

  123. //获取LM75配置。
  124. static uint32_t lm75_get_configuration(uint8_t *p_config)
  125. {
  126.         return lm75_read_register(LM75_CONF_REG, p_config);
  127. }

  128. //初始化传感器。
  129. static uint32_t lm75_init(void)
  130. {
  131.         return lm75_interface_init();
  132. }

  133. //启动传感器。
  134. static uint32_t lm75_enable(void)
  135. {
  136.         uint8_t uc_config_reg = 0;
  137.         uint32_t ul_retval = 0;

  138.         ul_retval = lm75_read_register(LM75_CONF_REG, &uc_config_reg);
  139.         if (ul_retval != TWI_SUCCESS) {
  140.                 return ul_retval;
  141.         }

  142.         uc_config_reg &= (uint8_t)(~LM75_CONFIG_SHUTDOWN_ENABLE);

  143.         return lm75_write_register(LM75_CONF_REG, &uc_config_reg);
  144. }

  145. //短暂关闭感应器。
  146. static uint32_t lm75_disable(void)
  147. {
  148.         uint8_t uc_config_reg = 0;
  149.         uint32_t ul_retval = 0;

  150.         ul_retval = lm75_read_register(LM75_CONF_REG, &uc_config_reg);
  151.         if (ul_retval != TWI_SUCCESS) {
  152.                 return ul_retval;
  153.         }

  154.         uc_config_reg &= (uint8_t)(LM75_CONFIG_SHUTDOWN_ENABLE);

  155.         return lm75_write_register(LM75_CONF_REG, &uc_config_reg);
  156. }


复制代码
回复 支持 反对

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表