Governance by those who do the work.

Tuesday, July 14, 2015

Some Mysteries Solved


http://people.csail.mit.edu/jaffer/SimRoof/Convection/Measurements has been updated with photos of the new insulation, derivation of the model for the back surface, and measurements of natural convection.

In the first version of the electronics the plate and ambient temperature sensors had 3 times the variance of the back surface sensor.  I also noticed that, in most of the runs, the ambient temperature would have an initial ramp up in the first 5 minutes.

The LM35CZ temperature sensor datasheet warns of self-heating for sensors not attached to heatsinks.  So I added circuitry and modified the program to power on the sensor 2ms before it is read and turn it off after.  Surprisingly, it didn't eliminate the ramp, but it reduced the variance to a level comparable with the back surface sensor!

I checked the other components and found that the MPXH6115A6U atmospheric pressure sensor dissipates 30mW (and has a long warm-up time in its specification).  The LM35CZ was mounted next to the MPXH6115A6U on the same header; heat conduction through their leads was responsible for the warmup.  I moved the LM35CZ off of the header and connected it with thin wires, which solved the problem.

I am still left with the mystery of why the LM35CZ in the plate has the large variance.  If the thermal adhesive which fastens it in a hole in the aluminum plate is broken, is self-heating creating the variance?  Disassembling the insulation to examine it may damage the insulation, requiring it to be replaced; so I will leave it as it is for now.

With the upward natural convection measurement looking reasonably consistent with the model, it is time to mount the plate in the wind tunnel.

When I rebuilt the electronics, I improved the sensitivity of the opto-interrupter.  Its sensitivity is now high enough that it responds to reflection of the fan blade.  This allows the led and phtotransistor to be on the same side of the fan, which simplifies mounting.  The photo shows the blue board with the LED adjacent to the board with the phototransistor.

Sunday, June 21, 2015

Setbacks


Last month saw some setbacks.

While measuring a voltage, my probe slipped and shorted the 20 volt supply to a signal pin, burning out the STM32F3Discovery board and many of the electronic components.  The damaged components are now replaced; the electronics are working as before.

The analog-to-digital converters on the STM32F303 have multiple inputs.  While checking voltages on the repaired board, I noticed that for each ADC, the first input to be converted was converted accurately, but the others were not.  Increasing the converter sampling-time from ADC_SAMPLETIME_1CYCLES_5 to ADC_SAMPLETIME_19CYCLES_5 results in all readings being reasonably accurate.  The noise on converted signals is also reduced.

The other setback is more serious.

Heat flow measurements are of heat flow from both sides of the plate. To infer the undesired heat flow from measurements of total heat flow requires that the heat flow from the front of the plate be precisely known.  But the point of this experiment is to measure the heat flow from the front.

An insulating cover for the front of the plate turned out to interact strongly with the convection from the short sides.  The only option remaining is to analyze and estimate the heat flow through the back of the plate.

I am making progress in calculating this, but the estimates are significantly smaller than measured by the experimental apparatus.  I am rebuilding the insulation to match the estimate model.

Thursday, May 7, 2015

First Measurements

In "Insulating Both Sides", the large squares of (polyisocyanurate) foam insulation are faced with aluminum foil, but the borders were extruded polystyrene foam. Their unfaced surfaces would be subject to radiative transfer, which depends on the temperature of surfaces in the room, and is difficult to isolate from convection. I realized that by facing all the insulation with aluminum foil (with emissivity around .08), the radiative transfer would be cut to negligible levels. But there were unintended consequences which are discussed below.

This story will evolve at http://people.csail.mit.edu/jaffer/SimRoof/Convection/Measurements#Integration".

The physical quantities to be measured are:
symbolunitsdescription
TFKFluid (Air) Temperature
TSKPlate Surface Temperature
PPaFluid (Atmospheric) Pressure
Vm/sFluid Velocity
ΦPa/PaRelative Humidity
ΠHW=J/sHeater Power

Previous laboratory measurements of forced convection have been performed by starting the fluid flow and plate heater, waiting until the system reaches equilibrium (as indicated by a stable plate temperature), then recording the measurements of the physical quantities.

Because the heat flow for forced convection over a rough surface is expected to be larger than for a smooth surface, our test plate is more massive than previous experiments in order to maintain uniform temperature across the plate. This results in settling times of minutes in the best case and times approaching and hour at low airflow rates.

Radiative heat transfer is not directly measurable separately from convective heat transfer. The approach here is to minimize radiative transfer by making the test plate and its insulated backside have low emissivity (roughly 8%). The hR of the plate is estimated assuming that the emissive surfaces (mostly the inside of the wind-tunnel) are at ambient temperature. The insulated backside will be at a lower temperature than the plate. With a 5K temperature difference between the plate and ambient, the backside is about 1K above ambient in still air; in moving air this difference will be less. The small temperature difference the backside and ambient, combined with its low emissivity mean that its radiative transfer can be lumped with the backside convection UB(V).

The equation of state for the plate in forced convection is:
ΠH = h(V) ⋅ AS ⋅ (TSTF) + εS ⋅ εThRAs ⋅ (TSTF) + UB(V) ⋅ (TSTF) + C d TS

d t
symbolvalueunitsdescription
C4690J/KPlate Thermal Capacity
AS0.090m2Convecting Area
εS0.08Plate Surface Emissivity
εT0.95Tunnel Surface Emissivity
hR5.87W/(m2K)Radiative Surface Conductance
hW/(m2K)Convective Surface Conductance
UB(V)W/KBackside Surface Conductance (including radiative)

By collecting terms not dependent on TS into U(V), the equation of state is simplified:

U(V) = h(V) ⋅ AS + εS ⋅ εThRAs + UB(V)
ΠH = U(V) ⋅ (TSTF) + C d TS

d t
TS(t) = TF(t) + ΠH(t)

U(V) 
C 

U(V) 
d TS(t)

d t

This linear differential equation could be solved analytically, but because the independent variables are measured at discrete times, it make more sense to solve the analogous finite difference equation.

TS(t) = TF(t) + ΠH(t)

U(V) 
C  ⋅ (TS(t) − TS(t'))

U(V)  ⋅ (tt')
TS(t) ⋅ C  + U(V)  ⋅ (tt')

U(V)  ⋅ (tt')
= TF(t) + ΠH(t)

U(V) 
+ TS(t') ⋅ C 

U(V)  ⋅ (tt')
TS(t) = ΠH(t) ⋅ (tt') + TS(t') ⋅ C  + TF(t) ⋅ U(V) ⋅ (tt')

C + U(V)  ⋅ (tt')

When data is sampled every second, this simplifies to:

TS(t) = ΠH(t) + TS(t') ⋅ C  + TF(t) ⋅ U(V)

C + U(V) 

I had originally planned that my controller program would servo the plate temperature in a narrow range. But when I saw the first datasets from the plate being heated, I realized that having the plate temperature slew through a temperature span enables me to separate the dynamics of heating from convection. On the basis of the heating slope I make slight adjustments to C to compensate for the addition and removal of insulation; I won't clutter this article with that detail.

The image to the right shows the calculated TS(t) (red) versus the measured TS(t) (blue) and ambient temperature (black). Clearly there is a delay between the application of heat starting at 60 seconds and the plate temperature.

Introducing a 15 second delay for ΠH makes for a much better fit.

TS(t) = ΠH(t−15) + TS(t') ⋅ C  + TF(t) ⋅ U(V)

C + U(V) 

The full equation of state could be solved for h(V), but division by TSTF makes analysis of the noisy signals complicated. As in the delay case, simulation and visualization yield insights more readily than statistics.

My first measurements are of natural convection because V=0 eliminates one of the variables; also because the formulas for natural convection are well established (assuming that it is the same for rough surfaces as for smooth). In the temperature ranges tested here the dependence of h(0) on TS is too weak to materially effect the finite difference equation.

Determining UB(V) is a bit involved. In order to not have insulation projecting out of the four sides of the plate, the back edges of the plate were beveled and this space filled with wedges of insulation. The heat flow through these sides of the plate is larger than the heat flow through the insulation on the backside of the plate; and theory is insufficient to calculate the heat flow through the sides. So it must be measured. But measurement can only be of the heat transfer from all of the plate. Theory does predict the convection from the front of the plate, but the point of this experiment is to measure that.


I constructed an insulated cover for the front of the plate. A rough estimate of its conductance is UT(0)=134 mW/K.

By adding a collar of insulation to the sides of the back (seen to the right), the plate is symmetrically encapsulated in insulation. The conductance through the insulation can be estimated by assuming that the conductance through each truncated pyramid (of insulation) is the same as the conductance through a brick of insulation having dimensions which are the means of the truncated pyramid dimensions.

For a fully insulated plate in moving air, the outer surface of the insulation should be close to ambient temperature. I estimate it should conduct 190 mW/K through its front and back and 117 mW/K through its 4 sides, for a total of 308 mW/K between the plate and the insulation envelope. In still air (V=0 in these first tests), the flow should be less.

If these estimates are good, then the heat flow through the front cover will be 43% of the measured heat flow through the full insulation. The value of UB(V) could then be found by measuring the heat flow with the collar removed and subtracting 43% of the symmetrically insulated heat flow.

But the estimates are not close; in order to match the measured U(0) (blue trace) of the fully insulated plate, the red line on the graph is simulated at U(0)=420 mW/K, which is 36% larger than estimated.

The graph above shows the heating and cooling of the plate symmetrically encased in insulation. The black trace is ambient temperature, green the envelope temperature underneath the plate, blue the measured plate temperature, and red the simulated plate temperature (the red trace overlays the blue).

The graph below shows the heating and cooling of the insulated plate facing down (shown in the photograph above). It cools slightly faster than when facing up, perhaps because of the unsealed seams facing upward. With the temperature sensor (visible in the photograph) being on top, its green trace is much closer to ambient because upward convection is more efficient than downward convection.

The graph below shows the heating and cooling of the insulated plate facing up with the top cover but without the collar. The simulated U(0)=470 mW/K line (red) shows a bit too much curvature.

The graph below shows the convection from the plate facing up (without the top cover). The simulation (subtracting 43% of the full-insulation heat flow from the top-cover heat flow) shows significantly less convection than measured.

So the estimates of conduction through the insulation were not good enough. However, if I simulate with UB(0)=0.47 mW/K, the plate with the measured top-cover conductance, the plate upward convection matches beautifully!

One explanation would be that the top cover reduces the convection from the (four) plate sides by the same amount as conduction through the top cover insulation. The top-cover overhanging the plate sides would somewhat obstruct convection. But coincidences are toxic to science experiments.

Covering the side insulation with aluminum tape (to reduce emissivity) provided a heat conduction path from the areas where the conduction is thinnest to the rest of the back. So I made a cut through the aluminum tape on the sides, and it reduces the full-insulation U(0) from 0.42 to 0.38 W/K (shown below), about 10%. Recall that adding the collar to the plate with top-cover reduced the conduction from 470 mW/K to 420 mW/K, about 11%. This lends support to the idea that the aluminum tape was spreading plate heat to the foil envelope.

The next step is to make a similar cut to the top-cover and additional cuts to the side insulation and rerun these measurements.

Friday, April 10, 2015

Temperature Sensor Calibration

Having gotten the digital-to-analog and analog-to-digital conversions working while connected to each other, I plugged the STM32F3DISCOVERY board into my apparatus and started to debug the program to do analog-to-digital conversions of the LM35CZ temperature sensors. The initial readings were quite noisy; I traced this back to power supply noise caused by current fluctuations from the STM32F3DISCOVERY LEDs being switched on and off. I changed the program to keep the LEDs off during conversions and improved the power supply conditioning. The STM32F3DISCOVERY board consumes about 90.mA while running.

I found that the plate heater was slightly heating even though my program had the DAC controlling it set to 0. It turns out that when its output buffer is enabled, the STM32F303VCTx isn't specified to drive that output below 0.2V. Disabling the buffer reduced the output to a few millivolts.

The next task was to calibrate the temperature sensors. The calculations for measurement of convection are most sensitive to the time-derivative of the plate temperature and the difference between temperatures of the plate and ambient air. I attached the two ambient sensors ("ambient" and "free") to the back of the plate with thermal adhesive so that they would be at the same temperature. The statistics of (triple) 621 samples taken once per second are:

nREPS = 1ambientplatefreeoffset
mean:1696.751667.321734.46-29
variance:15.5816.659.83
mean:1.37.V1.34.V1.40.V-24.mV
variance:13.mV13.mV7.9.mV
mean:20.84C20.47C21.30C-0.36C
variance:0.19C0.20C0.12C

The plate-ambient offset is about -29 LSB = -24.mV = -0.36C. The 13.mV variance is rather large and matches measurements made by a RMS voltmeter at the ADC inputs; this bodes ill for the time-derivative of the plate temperature.

Note that voltage is measuread at the ADC input. There is a voltage gain of 6.56 from each LM35CZ (10.mV/C) output to the ADC input.

The STM32F303VCTx datasheet specifies a total unadjusted error of +/-4.5 LSB for the single-ended ADC at 25C and with a 3.3V supply.

The 16 LSB variance is much larger than the ADC error; thus it will act as a dither and smooth discontinuities in the ADC transfer function. So I rewrote the program to sum the result of converting each signal 16 times (per second). The statistics of 943 readings averaged over 16 conversions apiece are:

nREPS = 1ambientplatefreeoffset
mean:1702.791669.571736.16-33
variance:3.043.031.47
mean:1.37.V1.35.V1.40.V-27.mV
variance:2.4.mV2.4.mV1.2.mV
mean:20.91C20.50C21.32C-0.41C
variance:0.04C0.04C0.02C

The variance is reduced by a factor of 5, which will greatly reduce the effect of noise on the time-derivative of plate temperature.

This time the plate-ambient offset is about -33 LSB = -27.mV = -0.41C. All three temperatures are higher in the averaged test than in the single conversion test. This and subsequent sample runs in a thermostatically controlled building show that ambient and plate temperatures change enough to hamper calibration. The problem was worse when the plate was heated because the ambient sensor had only a small contact area with the plate, causing a temperature gradient which would be indistinguishable from a gain error.

So I fitted some insulation over the temperature sensors to protect them from air currents. This reduced the plate-ambient offset by an order of magnitude!

nREPS = 1ambientplatefreeoffset
mean:2173.752170.442230.43-3
variance:2.853.802.65
mean:1.75.V1.75.V1.80.V-2.7.mV
variance:2.3.mV3.1.mV2.1.mV
mean:26.69C26.65C27.39C-0.04C
variance:0.04C0.05C0.03C

A (304s) run near 20C also shows an offset smaller than the variance and guaranteed minimum offsets of the components.

nREPS = 1ambientplatefreeoffset
mean:1596.041598.531665.272
variance:3.013.001.37
mean:1.29.V1.29.V1.34.V2.0.mV
variance:2.4.mV2.4.mV1.1.mV
mean:19.60C19.63C20.45C0.03C
variance:0.04C0.04C0.02C

So the measurement program will not need to apply offset and scale corrections to the plate-ambient temperature difference. The ambient and plate sensors came from the same lot, the free sensor from a different batch. To convert the free temperature to the equivalent ambient temperature, multiply by 1.023 and subtract 1.318C.

Sunday, March 22, 2015

Programming the STM32F3-Discovery

http://www.st.com/web/en/catalog/tools/FM116/SC959/SS1532/LN1848/PF254044?sc=stm32f3discovery is the STM32F3DISCOVERY evaluation board I purchased. http://www.st.com/st-web-ui/static/active/jp/resource/technical/document/user_manual/DM00063382.pdf is Feb 2013 "UM1570 User manual STM32F3DISCOVERY Discovery kit for STM32F303xx microcontrollers".

STMicroelectronics offers a MS-Windows software named ST32CubeMX which enables a designer to configure a STM microprocessor and generates C and assembly code for driving it. http://www.st.com/st-web-ui/static/active/en/resource/technical/document/user_manual/DM00104712.pdf is the Jan 2015 "UM1718 User manual STM32CubeMX for STM32 configuration and initialization C code generation".  In order to generate code for compilation with the Linux GCC toolchain, choose "TrueSTUDIO" as the toolchain.

When I purchased a STM32F3-discovery board last year, I downloaded ST32CubeMX version 1.0.  There are several projects using the Linux GCC toolchain to compile for STM processors which I found online.  But these projects use ST32CubeMX version 1.1.0; they are incompatible with the files generated by ST32CubeMX-1.0.  So I downloaded the latest ST32CubeMX, which turned out to be version 1.1.1.  The library functions have been renamed in ST32CubeMX-1.1.1 and the directories have been reorganized, so the code it generates is incompatible with both earlier versions.

STMicroelectronics has documentation for the microprocessor, the hardware abstraction layer (HAL), and "middlewares", but I can't figure how to navigate to them on their site.  Google search comes to the rescue.

http://www.st.com/web/en/resource/technical/document/reference_manual/DM00043574.pdf is the Jan 2015 manual for everything in the STM32F303xB/C/D/E, STM32F303x6/8, STM32F328x8, STM32F358xC, STM32F398xE chips other than the CPU, memory layout, and interrupts, which are documented (for STM32F3 and STM32F4) in May 2014 "PM0214 Programming manual" http://www.st.com/web/en/resource/technical/document/programming_manual/DM00046982.pdf

http://www.st.com/web/en/resource/technical/document/datasheet/DM00058181.pdf is the electrical and timing specifications for STM32F303xB and STM32F303xC.

http://www.st.com/st-web-ui/static/active/en/resource/technical/document/user_manual/DM00122016.pdf documents the hardware-abstraction-layer Feb 2015 "UM1786 User manual Description of STM32F3xx HAL drivers".  It corresponds to ST32CubeMX version 1.1.1.  Between this manual and the specifications, it should be possible to create firmware without starting from the ST32CubeMX (MS-Windows) program.

http://www.st.com/st-web-ui/static/active/jp/resource/technical/document/user_manual/DM00063382.pdf is Nov 2014 "UM1734 User manual STM32Cube USB device library".  It is not quite up-to-date with ST32CubeMX-1.1.1, referring to some function names (eg. Controllability()) which do not exist in version 1.1.1 or version 1.1.0.  Perhaps the code is in transition.  There are fields like _USBD_HandleTypeDef.dev_connection_status which are never referenced by the code and callbacks like HAL_PCD_ConnectCallback() which are never called.

The USB-CDC function CDC_Transmit_FS() is very useful; it sends a message over the USB to /dev/ttyACM0.  Its use has replaced the on-board LEDs for debugging my real-time program.

The toolchain I use is gcc-arm-embedded.  The version in Ubuntu-12.04 doesn't work with the STM32F3.  https://launchpad.net/gcc-arm-embedded has instructions for installing the current version of gcc-arm-embedded (which does work).

Openocd "Open On-Chip Debugger" is used to program and run gdb on the STM32F3DISCOVERY board.  The version of Openocd in Ubuntu-12.04 does not support the STM32F3DISCOVERY.  I downloaded and compiled from http://openocd.sourceforge.net/getting-openocd/.

https://github.com/mblythe86/stm32f3-discovery-basic-template is a 1.1.0 demonstration project for STM32F3.  It was helpful for creating Makefiles and gcc-arm-embedded linking.

Here is the process I used to port a project generated from the directory structure created by ST32CubeMX-1.1.1:

git clone https://github.com/cjheath/stm32f3-discovery-basic-template.git

In your project directory: Create "Device/ldscripts/" directory and copy "sections_flash.ld", "stm32f3discovery_def.ld", and "stm32f3.ld" from "stm32f3-discovery-basic-template/Device/ldscripts/" into "Device/ldscripts/".

Copy "Drivers/CMSIS/Device/ST/STM32F3xx/Source/Templates/gcc/startup_stm32f303xc.s" into "Device/".

Copy "Drivers/CMSIS/Device/ST/STM32F3xx/Source/Templates/system_stm32f3xx.c" into "Src/".

Copy Makefile from "stm32f3-discovery-basic-template/Libraries/Makefile" into directory "Drivers/".  In it set SRCS = to a list of all the files in "Drivers/STM32F3xx_HAL_Driver/Src/"

Copy "stm32f3-discovery-basic-template/Makefile" into project directory and modify for your file locations.
  


I am undoubtedly forgetting some of the other changes which were necessary.

The callbacks (and some other functions) have "__weak" definitions.  These are supposedly overridden by non-"__weak" function definitions.  I found that this was sometimes not happening.  Changing the link order did not fix the problem.  Removing the "__weak" definitions fixed it.

Even with the documentation, I was unable to get a differential analog-to-digital converter (ADC) to work correctly.  Instead, I convert the two channels separately and subtract.

Sunday, February 1, 2015

Insulating Both Sides


Because of edge effects, the heat leakage through the insulated back-of-the-plate is difficult to calculate.  It would be better to measure it; but that measurement must discount the heat transfer through the front side of the plate.  The .421 W which I estimate for leakage is less than the downward-facing convection (.525 W) for a plate at 5 K higher than ambient temperature.  Because the test surface of the plate is rough, I don't have confidence in convection calculations based on smooth plate measurements; and assuming what I am trying to measure means that I wouldn't be able to test the assertion that surface roughness has no effect on downward natural convection.

So I created insulation for the (rough) front surface of the plate. Constructed using the same materials and techniques as the backside insulation, its leakage should be roughly the same as the backside.

While cutting the extruded polystyrene foam I noticed that the board crowned in the center.  So I arranged the cut strips so that their centers pressed into the plate edges while the duct tape tensions their ends into corners.  It maintains a snug fit and doesn't need tape to seal it.  Because of the bevel, the backside foam is more complicated to cut; but I may at some point rebuild it using the same technique.

Because the expected downward-facing convection is close in magnitude to the leakage, the fully-insulated measurements should be made both level and at some inclinations (convection increases rapidly as the plate is tilted).

Friday, January 30, 2015

Insulating the Plate



The photo shows the thermal insulation for the aluminum plate's backside (covering the heaters).  The reflective square is 25 mm deep polyisocyanurate foam insulation (Dow TUFF-R) with foil on both sides.  The light green border is 19 mm thick extruded polystyrene foam which is beveled to match the back of the aluminum plate.  The corners and metal-to-foam seams are held together with duct tape.  The sensor cable and heater connections thread between the two types of insulation.  The pieces of insulation were machined using a radial-arm saw and a band-saw.  Knife cuts were not as clean.
While suspension by piano wire will be sufficient for performing forced convection measurements of a downward facing horizontal plate, we lack a way to support the plate with insulation at non-horizontal inclinations, which would allow interesting natural convection measurements.