Governance by those who do the work.

Showing posts with label stm32f3. Show all posts
Showing posts with label stm32f3. Show all posts

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.

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.