Målet er å lage ett digitalt termometer som henter temperaturinformasjon sendt som PWM fra en SMT172 og viser det på en skjerm.
Utstyr
- STM32F303K8 (Mikrokontroller)
- SMT172 (Temperatur sensor)
- 100nF kondensator
- 2 stk. 1uF kondensatorer
- 180 ohm motstand
- 8K ohm motstand
- EADOGS104W-A (Skjerm)
Formler

Oppsett

Måling

Kode for å lese PWM

TIM_SlaveConfigTypeDef sSlaveConfig = { 0 }; TIM_IC_InitTypeDef sConfigIC = { 0 }; TIM_MasterConfigTypeDef sMasterConfig = { 0 }; htim1.Instance = TIM1; htim1.Init.Prescaler = 0; htim1.Init.CounterMode = TIM_COUNTERMODE_UP; htim1.Init.Period = 65535; htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim1.Init.RepetitionCounter = 0xFFFF; htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; if (HAL_TIM_IC_Init(&htim1) != HAL_OK) { Error_Handler(); } sSlaveConfig.SlaveMode = TIM_SLAVEMODE_RESET; sSlaveConfig.InputTrigger = TIM_TS_TI1FP1; sSlaveConfig.TriggerPolarity = TIM_INPUTCHANNELPOLARITY_RISING; sSlaveConfig.TriggerPrescaler = TIM_ICPSC_DIV1; sSlaveConfig.TriggerFilter = 0; if (HAL_TIM_SlaveConfigSynchronization(&htim1, &sSlaveConfig) != HAL_OK) { Error_Handler(); } sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING; sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI; sConfigIC.ICPrescaler = TIM_ICPSC_DIV1; sConfigIC.ICFilter = 0; if (HAL_TIM_IC_ConfigChannel(&htim1, &sConfigIC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_FALLING; sConfigIC.ICSelection = TIM_ICSELECTION_INDIRECTTI; if (HAL_TIM_IC_ConfigChannel(&htim1, &sConfigIC, TIM_CHANNEL_2) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK) { Error_Handler(); } HAL_TIM_Base_Init(&htim1); HAL_TIM_Base_Start(&htim1); __HAL_RCC_TIM1_CLK_ENABLE() ;
Setter opp timer 1 med to kanaler som er synkronisert.
Kanal 1 er satt opp til å måle perioden. Den måler fra stigende puls til neste stigende puls.
Kanal 2 er satt opp til å måle fra stigende puls til fallende puls.
measurement_t totalMeasurement; totalMeasurement.period = 0; totalMeasurement.pulse = 0; for (int x=0;x<MEASUREMENTS;x++) { totalMeasurement.period += HAL_TIM_ReadCapturedValue(&htim1, TIM_CHANNEL_1); totalMeasurement.pulse += HAL_TIM_ReadCapturedValue(&htim1, TIM_CHANNEL_2); } return totalMeasurement;
Her gjør vi mange målinger for å beregne syklusen.
temperature_t temperature; temperature.celsius = 212.77 * ((double)measurement.pulse/(double)measurement.period) - 68.085; temperature.kelvin = temperature.celsius + 273.15; return temperature;
Her beregner vi celsius og kelvin temperaturene. Dette er den minst nøyaktige beregningsmetoden. Skal implementere den mest nøyaktige senere.

All kode for prosjektet kan lastes ned her.