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

smt172

Formler for å kalkulere temperatur

20190319_225256

SMT172 temperatur sensoren.

Oppsett

tempmeasurement_circuit

Figur 1 viser oppsettet mellom mikrokontrolleren og temperatur sensoren. Figur 2 viser koblingen mellom mikrokontrolleren og skjermen.

Måling

20190319_225546

Fullt oppsett.

Kode for å lese PWM

pwm_smt172

PWM sendt fra smt172 sensoren.

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.

20190319_225313

Temperaturen vises på LCD skjermen.

 

All kode for prosjektet kan lastes ned her.

Sendt av Kjetil Fjellheim