热敏电阻传感器,其阻值随着温度的变化而变化,我们通过ADC采集热敏电阻上的电压值,再通过计算得到当前温度信息。
注意:请按照自己热敏电阻的属性,修改代码内对应内容!!!
temperature,c
1 /** 2 * @file temperature.c 3 * @brief 4 * @version 0.1 5 * @date 2019-06-28 6 * 7 * @copyright Copyright (c) 2019 Chipintelli Technology Co., Ltd. 8 * 9 */ 10 /*----------------------------------------------------------------------------- 11 include 12 -----------------------------------------------------------------------------*/ 13 #include "ci110x_adc.h" 14 #include "ci110x_scu.h" 15 #include "ci110x_uart.h" 16 #include "ci110x_adc.h" 17 #include "ci_misc.h" 18 #include "ci_sensor.h" 19 20 /*----------------------------------------------------------------------------- 21 define 22 -----------------------------------------------------------------------------*/ 23 #define RESISTOR (10 * 1000)/*!< 分压电阻阻值 */ 24 #define TEMPERATURE_ADC (HAL_ADC_BASE)/*!< ADC控制器 */ 25 #define TEMPERATURE_ADC_CHANNEL (ADC_CHANNEL_2)/*!< ADC通道 */ 26 #define TEMPERATURE_ADC_PAD (AIN2_PAD)/*!< ADC引脚 */ 27 28 /*----------------------------------------------------------------------------- 29 extern 30 -----------------------------------------------------------------------------*/ 31 extern void ADC_SetIOReuse(uint8_t channel); 32 33 /*----------------------------------------------------------------------------- 34 struct / enum / union 35 -----------------------------------------------------------------------------*/ 36 typedef struct 37 { 38 uint8_t temperature; 39 float min_r; 40 float max_r; 41 }R_SENSOR_RANG; 42 43 /*----------------------------------------------------------------------------- 44 global 45 -----------------------------------------------------------------------------*/ 46 /** 47 * @brief 电压-温度对应表 48 * 49 */ 50 R_SENSOR_RANG r_sensor_list[]= 51 { 52 {0,31.602,33.006 }, 53 {1,30.097,31.402 }, 54 {2,28.667,29.881 }, 55 {3,27.310,28.439 }, 56 {4,26.022,27.071 }, 57 {5,24.799,25.774 }, 58 {6,23.638,24.543 }, 59 {7,22.535,23.376 }, 60 {8,21.488,22.268 }, 61 {9,20.494,21.218 }, 62 {10,19.550,20.221 }, 63 {11,18.653,19.275 }, 64 {12,17.801,18.378 }, 65 {13,16.992,17.526 }, 66 {14,16.224,16.717 }, 67 {15,15.493,15.950 }, 68 {16,14.799,15.221 }, 69 {17,14.139,14.529 }, 70 {18,13.512,13.872 }, 71 {19,12.915,13.247 }, 72 {20,12.348,12.654 }, 73 {21,11.809,12.090 }, 74 {22,11.295,11.554 }, 75 {23,10.807,11.045 }, 76 {24,10.342,10.561 }, 77 {25,9.900,10.100 }, 78 {26,9.471,9.670 }, 79 {27,9.062,9.261 }, 80 {28,8.673,8.872 }, 81 {29,8.303,8.501 }, 82 {30,7.951,8.147 }, 83 {31,7.615,7.810 }, 84 {32,7.296,7.489 }, 85 {33,6.992,7.182 }, 86 {34,6.702,6.890 }, 87 {35,6.425,6.611 }, 88 {36,6.162,6.346 }, 89 {37,5.911,6.092 }, 90 {38,5.671,5.850 }, 91 {39,5.442,5.618 }, 92 {40,5.224,5.398 }, 93 {41,5.016,5.187 }, 94 {42,4.818,4.985 }, 95 {43,4.628,4.793 }, 96 {44,4.447,4.609 }, 97 {45,4.273,4.433 }, 98 {46,4.108,4.265 }, 99 {47,3.950,4.104 }, 100 {48,3.799,3.950 }, 101 {49,3.654,3.802 }, 102 {50,3.516,3.661 }, 103 }; 104 105 /*----------------------------------------------------------------------------- 106 declare 107 -----------------------------------------------------------------------------*/ 108 109 /*----------------------------------------------------------------------------- 110 function 111 -----------------------------------------------------------------------------*/ 112 113 /** 114 * @brief 读取温度值 115 * 116 * @param voltage 117 * @return unsigned char 118 */ 119 unsigned char Caculate_Temperature(float voltage) 120 { 121 float Resis = 0; 122 unsigned char Temprature = -1; 123 Resis = (RESISTOR * voltage) / (3.3 - voltage); 124 for(int i = 0;i < 51;i++) 125 { 126 float temp1 = (r_sensor_list[i].min_r)*1000; 127 float temp2 = (r_sensor_list[i].max_r)*1000; 128 if((Resis >= temp1) && (Resis <= temp2)) 129 { 130 Temprature = r_sensor_list[i].temperature; 131 break; 132 } 133 } 134 return Temprature; 135 } 136 137 /** 138 * @brief 初始化温度传感器 139 * 140 * @param irq_callback 中断回调 141 * @retval RETURN_OK 142 * @retval RETURN_ERR 143 */ 144 int32_t temperature_open(void) 145 { 146 #if 0 147 Scu_Setdiv_Parameter(TEMPERATURE_ADC,63); 148 Scu_SetDeviceGate(TEMPERATURE_ADC,1); 149 Scu_SetIOReuse(TEMPERATURE_ADC_PAD,FIRST_FUNCTION); 150 ADC_SetIOReuse(TEMPERATURE_ADC_CHANNEL); 151 adc_power_ctrl(ENABLE); 152 adc_continuons_convert(DISABLE); 153 adc_period_enable(ENABLE); 154 adc_period_monitor(TEMPERATURE_ADC_CHANNEL,ENABLE); 155 adc_chax_period(TEMPERATURE_ADC_CHANNEL,62); 156 adc_calibrate(DISABLE); 157 adc_int_sel(ADC_INT_MODE_TRANS_END); 158 adc_mask_int(DISABLE); 159 adc_convert_config(TEMPERATURE_ADC_CHANNEL,ADC_CLKCYCLE_1); 160 #else 161 adc_init_cycle_mode(TEMPERATURE_ADC_CHANNEL,4,NULL); 162 #endif 163 return RETURN_OK; 164 } 165 166 /** 167 * @brief 读取温度 168 * 169 * @param data 读到的数据 170 * @retval RETURN_OK 171 * @retval RETURN_ERR 172 */ 173 int32_t temperature_read(sensor_data_t *data) 174 { 175 float temp,adc_value; 176 int real_temperature; 177 temp = adc_get_result(TEMPERATURE_ADC_CHANNEL); 178 adc_value = ((temp/4096)*3.3); 179 real_temperature = Caculate_Temperature(adc_value); 180 if(0xFF != real_temperature) 181 { 182 sensor_data_inform(SENSOR_TYPE_TEMPERATURE); 183 data->temperature = real_temperature * 10; 184 } 185 return RETURN_OK; 186 } 187 188 /** 189 * @brief 温度传感器ops 190 * 191 */ 192 sensor_ops_t temperature_ops = 193 { 194 temperature_open, 195 temperature_read, 196 }; 197 198 /*----------------------------------------------------------------------------- 199 end of the file 200 -----------------------------------------------------------------------------*/
temperature,h
1 /** 2 * @file temperature.h 3 * @brief 温度传感器的头文件 4 * @version 0.1 5 * @date 2019-07-02 6 * 7 * @copyright Copyright (c) 2019 Chipintelli Technology Co., Ltd. 8 * 9 */ 10 11 #ifndef __TEMPERATURE_H__ 12 #define __TEMPERATURE_H__ 13 14 /** 15 * @ingroup third_device_driver 16 * @defgroup 热敏电阻 17 * @brief 热敏电阻传感器驱动 18 * @{ 19 */ 20 21 #ifdef __cplusplus 22 extern "C" { 23 #endif 24 25 /*----------------------------------------------------------------------------- 26 include 27 -----------------------------------------------------------------------------*/ 28 #include "ci_sensor.h" 29 30 /*----------------------------------------------------------------------------- 31 define 32 -----------------------------------------------------------------------------*/ 33 34 /*----------------------------------------------------------------------------- 35 extern 36 -----------------------------------------------------------------------------*/ 37 extern sensor_ops_t temperature_ops; 38 39 /*----------------------------------------------------------------------------- 40 struct / enum / union 41 -----------------------------------------------------------------------------*/ 42 43 /*----------------------------------------------------------------------------- 44 global 45 -----------------------------------------------------------------------------*/ 46 47 /*----------------------------------------------------------------------------- 48 function declare 49 -----------------------------------------------------------------------------*/ 50 51 #ifdef __cplusplus 52 } 53 #endif 54 55 /** 56 * @} 57 */ 58 59 #endif 60 61 /*----------------------------------------------------------------------------- 62 end of the file 63 -----------------------------------------------------------------------------*/