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.
Du må være logget inn for å legge inn en kommentar.