|
@@ -25,6 +25,7 @@ float CalculateTemperature(uint16_t adc_value, float vref);
|
|
|
/* USER CODE END 0 */
|
|
|
|
|
|
ADC_HandleTypeDef hadc1;
|
|
|
+DMA_HandleTypeDef hdma_adc1;
|
|
|
|
|
|
/* ADC1 init function */
|
|
|
void MX_ADC1_Init(void)
|
|
@@ -110,6 +111,26 @@ void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
|
|
|
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
|
|
|
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
|
|
|
|
|
|
+ /* ADC1 DMA Init */
|
|
|
+ /* ADC1 Init */
|
|
|
+ hdma_adc1.Instance = DMA1_Channel1;
|
|
|
+ hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
|
|
|
+ hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
|
|
|
+ hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
|
|
|
+ hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
|
|
|
+ hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
|
|
|
+ hdma_adc1.Init.Mode = DMA_CIRCULAR;
|
|
|
+ hdma_adc1.Init.Priority = DMA_PRIORITY_LOW;
|
|
|
+ if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)
|
|
|
+ {
|
|
|
+ Error_Handler();
|
|
|
+ }
|
|
|
+
|
|
|
+ __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1);
|
|
|
+
|
|
|
+ /* ADC1 interrupt Init */
|
|
|
+ HAL_NVIC_SetPriority(ADC1_2_IRQn, 5, 0);
|
|
|
+ HAL_NVIC_EnableIRQ(ADC1_2_IRQn);
|
|
|
/* USER CODE BEGIN ADC1_MspInit 1 */
|
|
|
|
|
|
/* USER CODE END ADC1_MspInit 1 */
|
|
@@ -134,6 +155,11 @@ void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle)
|
|
|
*/
|
|
|
HAL_GPIO_DeInit(GPIOC, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2);
|
|
|
|
|
|
+ /* ADC1 DMA DeInit */
|
|
|
+ HAL_DMA_DeInit(adcHandle->DMA_Handle);
|
|
|
+
|
|
|
+ /* ADC1 interrupt Deinit */
|
|
|
+ HAL_NVIC_DisableIRQ(ADC1_2_IRQn);
|
|
|
/* USER CODE BEGIN ADC1_MspDeInit 1 */
|
|
|
|
|
|
/* USER CODE END ADC1_MspDeInit 1 */
|
|
@@ -184,12 +210,123 @@ void ApplyFilter(uint16_t raw_data, uint16_t* filtered_data, uint16_t* raw_data_
|
|
|
*buffer_index = (*buffer_index + 1) % FILTER_LENGTH; //指向最旧的
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+//#define R_NOMINAL 10000.0f // 注册时NTC热敏电阻的阻值
|
|
|
+//#define T_NOMINAL 298.15f // 注册时NTC热敏电阻的温度值,转化为开尔文温标
|
|
|
+//#define B_FACTOR 3950.0f // NTC热敏电阻的B参数
|
|
|
+//float CalculateTemperature(uint16_t adc_value, float vref)
|
|
|
+//{
|
|
|
+// float voltage = adc_value * vref / 4096.0f; // 根据ADC值计算输入电压
|
|
|
+// float resistance = R_NOMINAL * (voltage / (vref - voltage)); // 根据电压计算NTC热敏电阻阻值
|
|
|
+//
|
|
|
+// float steinhart = log(resistance / R_NOMINAL) / B_FACTOR + 1.0f / T_NOMINAL; // 根据瑞利恒式计算温度
|
|
|
+// float temperature = 1.0f / steinhart - 273.15f; // 转换为摄氏温度
|
|
|
+// return temperature;
|
|
|
+//}
|
|
|
+
|
|
|
+float array1[] = {-40, -39, -38, -37, -36, -35, -34, -33, -32, -31, -30,
|
|
|
+ -29, -28, -27, -26, -25, -24, -23, -22, -21, -20,
|
|
|
+ -19, -18, -17, -16, -15, -14, -13, -12, -11, -10,
|
|
|
+ -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3,
|
|
|
+ 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
|
|
|
+ 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,
|
|
|
+ 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
|
|
|
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
|
|
|
+ 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
|
|
|
+ 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,
|
|
|
+ 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
|
|
|
+ 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100,
|
|
|
+ 101, 102, 103, 104, 105};
|
|
|
+
|
|
|
+float array2[] = {340.9281f, 318.8772f, 298.3978f, 279.3683f, 261.6769f,
|
|
|
+ 245.2212f, 229.9072f, 215.6488f, 202.3666f, 189.9878f,
|
|
|
+ 178.4456f, 167.6783f, 157.6292f, 148.2460f, 139.4807f,
|
|
|
+ 131.2888f, 123.6294f, 116.4648f, 109.7600f, 103.4829f,
|
|
|
+ 97.6037f, 92.0947f, 86.9305f, 82.0877f, 77.5442f, 73.2798f,
|
|
|
+ 69.2759f, 65.5149f, 61.9809f, 58.6587f, 55.5345f, 52.5954f,
|
|
|
+ 49.8294f, 47.2253f, 44.7727f, 42.4620f, 40.2841f, 38.2307f,
|
|
|
+ 36.2940f, 34.4668f, 32.7421f, 31.1138f, 29.5759f, 28.1229f,
|
|
|
+ 26.7496f, 25.4513f, 24.2234f, 23.0618f, 21.9625f, 20.9218f,
|
|
|
+ 19.9364f, 19.0029f, 18.1184f, 17.2800f, 16.4852f, 15.7313f,
|
|
|
+ 15.0161f, 14.3375f, 13.6932f, 13.0815f, 12.5005f, 11.9485f,
|
|
|
+ 11.4239f, 10.9252f, 10.4510f, 10.0000f, 9.5709f, 9.1626f,
|
|
|
+ 8.7738f, 8.4037f, 8.0512f, 7.7154f, 7.3954f, 7.0904f, 6.7996f,
|
|
|
+ 6.5223f, 6.2577f, 6.0053f, 5.7645f, 5.5345f, 5.3150f, 5.1053f,
|
|
|
+ 4.9050f, 4.7136f, 4.5307f, 4.3558f, 4.1887f, 4.0287f, 3.8758f,
|
|
|
+ 3.7294f, 3.5893f, 3.4553f, 3.3269f, 3.2039f, 3.0862f, 2.9733f,
|
|
|
+ 2.8652f, 2.7616f, 2.6622f, 2.5669f, 2.4755f, 2.3879f, 2.3038f,
|
|
|
+ 2.2231f, 2.1456f, 2.0712f, 1.9998f, 1.9312f, 1.8653f, 1.8019f,
|
|
|
+ 1.7411f, 1.6826f, 1.6264f, 1.5723f, 1.5203f, 1.4703f, 1.4222f,
|
|
|
+ 1.3759f, 1.3313f, 1.2884f, 1.2471f, 1.2073f, 1.1690f, 1.1321f,
|
|
|
+ 1.0965f, 1.0623f, 1.0293f, 0.9974f, 0.9667f, 0.9372f, 0.9086f,
|
|
|
+ 0.8811f, 0.8545f, 0.8289f, 0.8042f, 0.7803f, 0.7572f, 0.7350f,
|
|
|
+ 0.7135f, 0.6927f, 0.6727f, 0.6533f, 0.6346f, 0.6165f, 0.5990f,
|
|
|
+ 0.5821f};
|
|
|
+float resArr[10];
|
|
|
+float tempArr[10];
|
|
|
+uint16_t temperature1 = 0;
|
|
|
+uint8_t temp = 0;
|
|
|
+
|
|
|
+void findIndexAndTemp(float resistance, float array1[], float array2[], int index2, int index1){
|
|
|
+
|
|
|
+ float resRange = (array2[index2] - array2[index2+1]) / 10.0f;
|
|
|
+ for(int i=0; i<10; i++){
|
|
|
+ resArr[i] = array2[index2+1] + i * resRange;
|
|
|
+ }
|
|
|
+ int index = -1;
|
|
|
+ float minDiff = 1000.0f;
|
|
|
+ for(int i=0; i<10; i++){
|
|
|
+ float diff = fabs(resistance - resArr[i]);
|
|
|
+ if(diff < minDiff){
|
|
|
+ minDiff = diff;
|
|
|
+ index = i;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for(int i = 0; i < 10; i++){
|
|
|
+ tempArr[i] = array1[index1] + i * 0.1;
|
|
|
+ }
|
|
|
+ temperature1 = tempArr[index];
|
|
|
+
|
|
|
+ if( resArr[index] < 0){
|
|
|
+ temp = fabs(tempArr[index]);
|
|
|
+ temperature1 = temp | 0x8000;
|
|
|
+ }
|
|
|
+ temperature1 *=10;
|
|
|
+}
|
|
|
+
|
|
|
+#define R_NOMINAL 10.0f // 注册时NTC热敏电阻的阻值
|
|
|
+#define T_NOMINAL 298.15f // 注册时NTC热敏电阻的温度值,转化为开尔文温标
|
|
|
+#define B_FACTOR 3950.0f // NTC热敏电阻的B参数
|
|
|
+float CalculateTemperature(uint16_t adc_value, float vref)
|
|
|
+{
|
|
|
+ float voltage = adc_value * vref / 4096.0f; // 根据ADC值计算输入电压
|
|
|
+ float resistance = R_NOMINAL * (voltage / (vref - voltage)); // 根据电压计算NTC热敏电阻阻值
|
|
|
+
|
|
|
+// printf("%.3f\n",resistance);
|
|
|
+
|
|
|
+// HAL_Delay(500);
|
|
|
+// printf("%.4f\n",array2[0]);
|
|
|
+// printf("%.4f\n",array2[0]);
|
|
|
+
|
|
|
+ for (int i = 0; i < sizeof(array2) - 1; i++) {
|
|
|
+ if (resistance >= array2[i+1] && resistance < array2[i]) {
|
|
|
+ findIndexAndTemp(resistance, array1, array2, i, i);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+// printf("%.3u\n",temperature1);//十进制
|
|
|
+// printf("%4x\n",temperature1);//十六进制
|
|
|
+ return temperature1;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
void GetADCResults(ADC_HandleTypeDef* hadc)
|
|
|
{
|
|
|
HAL_ADC_Start(&hadc1);
|
|
|
HAL_ADC_PollForConversion(&hadc1, 100);
|
|
|
uint16_t adc1_raw = HAL_ADC_GetValue(&hadc1);
|
|
|
- float temperature = CalculateTemperature(adc1_raw, 3.3) * 10 - 40;
|
|
|
+ uint16_t temperature = CalculateTemperature(adc1_raw, 3.3);
|
|
|
ApplyFilter((uint16_t)temperature, &adc1_filtered, adc1_raw_buffer, &adc1_raw_buffer_index);
|
|
|
|
|
|
HAL_ADC_Start(&hadc1);
|
|
@@ -209,24 +346,16 @@ void GetADCResults(ADC_HandleTypeDef* hadc)
|
|
|
adc3_raw += (Value_old_addr3 & 0x8000) ? Adc3_CalibrationValue : -Adc3_CalibrationValue;
|
|
|
}
|
|
|
ApplyFilter(adc3_raw, &adc3_filtered, adc3_raw_buffer, &adc3_raw_buffer_index);
|
|
|
-
|
|
|
+
|
|
|
adc1_byte1 = (uint8_t)(adc1_filtered >> 8);
|
|
|
adc1_byte2 = (uint8_t)(adc1_filtered);
|
|
|
adc2_byte1 = (uint8_t)(adc2_filtered >> 8);
|
|
|
adc2_byte2 = (uint8_t)(adc2_filtered);
|
|
|
adc3_byte1 = (uint8_t)(adc3_filtered >> 8);
|
|
|
adc3_byte2 = (uint8_t)(adc3_filtered);
|
|
|
+
|
|
|
}
|
|
|
|
|
|
|
|
|
-#define R_NOMINAL 10000.0f // 注册时NTC热敏电阻的阻值
|
|
|
-#define T_NOMINAL 298.15f // 注册时NTC热敏电阻的温度值,转化为开尔文温标
|
|
|
-#define B_FACTOR 3950.0f // NTC热敏电阻的B参数
|
|
|
-float CalculateTemperature(uint16_t adc_value, float vref)
|
|
|
-{
|
|
|
- float voltage = adc_value * vref / 4095.0f; // 根据ADC值计算输入电压
|
|
|
- float resistance = R_NOMINAL * (voltage / (vref - voltage)); // 根据电压计算NTC热敏电阻阻值
|
|
|
- float steinhart = log(resistance / R_NOMINAL) / B_FACTOR + 1.0f / T_NOMINAL; // 根据瑞利恒式计算温度
|
|
|
- return 1.0f / steinhart - 273.15f; // 转换为摄氏温度并返回
|
|
|
-}
|
|
|
+
|
|
|
/* USER CODE END 1 */
|