Reply by Reginald Beardsley●October 10, 20122012-10-10
It's a bit surprising that they don't offer one already.
It would save a lot of hassle and board space. It probably needs some care to be
able to turn it on and off to keep power drain low. The high clock rate
for a switched capacitor filter could also be a significant power drain, forcing
TI to raise their power drain specs which they might not like doing. Data
sheets are a bit of an exercise in misleading the user.
The really pernicious aliases show up as noise at the same frequencies as your
data. There's no way to tell what's real and what's
not. I'm sure it's caused more than one PID controller to
intermittently fail in weird ways.
A spike in the ADC output caused by aliasing implies the presence of white noise
from Nyquist to 2x Nyquist.
I'd expect (but have not done an analysis) that the sample & hold filters
that to some degree.
An alpha trimmed mean is great for rejecting noise in many contexts, but rather
difficult to analyze from a DSP perspective. I've used it a lot, but
all the data was guaranteed not to be aliased by the acquisition system.
--- On Wed, 10/10/12, Onestone wrote:
From: Onestone
Subject: Re: [msp430] Re: Glitches with ADC12 internal temperature sensor
To: m...
Date: Wednesday, October 10, 2012, 4:20 AM
perhaps that should be the next peripheral that Ti include. A
programmable cut off low pass filter. It would be an excellent, and
perhaps obvious peripheral for any device with an A/D, and something I
don't think anyone else does as a peripheral for a micro, although they
are available as stand alone parts.
Al
On 10/10/2012 12:00 AM, Reginald Beardsley wrote:
> If you've not actually calculated the filter
response of averaging you should. There are several free MATLAB clones that
will do this for you.
>
> And yes, eliminating microvolt level noise is hard,
especially in an MCU design. Consider the requirements for the 24 bit
delta-sigma version of the 430, -144dB at Nyquist. That's seriously hard
to do. It's actually a strong argument for as many poles of analog filter
as you can reliably build, followed by oversampled conversion and additional
digital filtering and decimation.
perhaps that should be the next peripheral that Ti include. A
programmable cut off low pass filter. It would be an excellent, and
perhaps obvious peripheral for any device with an A/D, and something I
don't think anyone else does as a peripheral for a micro, although they
are available as stand alone parts.
Al
On 10/10/2012 12:00 AM, Reginald Beardsley wrote: > If you've not actually calculated the filter
response of averaging you should. There are several free MATLAB clones that
will do this for you.
>
> And yes, eliminating microvolt level noise is hard, especially in an MCU
design. Consider the requirements for the 24 bit delta-sigma version of the
430, -144dB at Nyquist. That's seriously hard to do. It's actually a
strong argument for as many poles of analog filter as you can reliably build,
followed by oversampled conversion and additional digital filtering and
decimation.
>
> Have Fun!
> Reg
>
>
>
>
Reply by Onestone●October 10, 20122012-10-10
One other thing I've discovered with the MSP430F149 (the only one I ever
used analog on) was that the standard Ti decoupling scheme of DVCC and
AVCC linked and decoupled with a 10uF and a 100nF is not optimal. I
found better performance by separating the supplies at the supply source
and also adding some additional filtering to the AVCC line, then
decoupling each supply locally with 10uF/100nF for the DVCC line and a
2u2/10nF on the AVCC line. this allowed me to use smaller ceranics for
the AVCC line.
Another thing I have found useful is to use a decimation filter. The
simplest one I use oversamples 6 times then rejects highest and lowest
readings and averages the remaining 4. Aliased noise in my experience
tends to be spiky in nature, so this method removes those spikes,
whereas averaging tends to produce humps around the spike.
Al
On 10/10/2012 12:00 AM, Reginald Beardsley wrote: > If you've not actually calculated the filter
response of averaging you should. There are several free MATLAB clones that
will do this for you.
>
> And yes, eliminating microvolt level noise is hard, especially in an MCU
design. Consider the requirements for the 24 bit delta-sigma version of the
430, -144dB at Nyquist. That's seriously hard to do. It's actually a
strong argument for as many poles of analog filter as you can reliably build,
followed by oversampled conversion and additional digital filtering and
decimation.
>
> Have Fun!
> Reg
>
>
>
>
Reply by old_cow_yellow●October 9, 20122012-10-09
Just a shoot in the dark. Could it be some other activities causing the glitch?
For example the UART?
You could try stop all other activities, do ADC only, and save a few dozens of
consecutive results in RAM. Then resume other activities and send the saved
results via UART. Do you still see abnormal results?
--- In m..., John Pitney wrote: >
> Hi all,
>
> I'm trying out the internal temperature sensor on an MSP430F449 with
the
> ADC12. Most of the samples I get are within a few counts of the median,
> but some, maybe less than 10%, are 15 counts off, usually low. The MSP430
> is on an Olimex development board, which seems to have all the recommended
> power and reference capacitors. I suspect I'm doing something wrong in
my
> code, so I'd appreciate any pointers on where I'm going wrong.
>
>
//*****************************************************************************
> // Olimex MSP430F449-STK
>
//*****************************************************************************
> // Compiled with msp430-gcc-4.5.3 -Os -mmcu=msp430f449
> // Example output (note 0x06AF and 0x06B5)
> // 06C7 06C6 06C6 06C7 06C6 06C6 06C5 06C6
> // 06C6 06C6 06C6 06C6 06C6 06AF 06C7 06C6
> // 06C5 06C6 06B5 06C6 06C6 06C8 06C6 06C6
> // 06C6 06C6 06C8 06C6 06C6 06C8 06C6 06C5
>
> #include
> #include
> #include #define N_RESULTS 8
> static uint16_t ADCresult[N_RESULTS];
>
> void tx(char c);
> size_t tx_string(char * Buf, size_t Bufsize);
> void itoa16(uint16_t x, char *s);
>
> void main(void)
> {
> volatile int i;
> char s;
> WDTCTL = WDT_ADLY_250; // 250ms interval timer
> FLL_CTL0 |= XCAP18PF; // Configure load caps
> IE1 |= WDTIE; // Enable WDT interrupt
> P4SEL |= 0x01 | 0x02; // P4.0,1 = USART1 TXD/RXD
> ME2 |= UTXE1 + URXE1; // Enable USART1 TXD/RXD
> U1CTL |= CHAR; // 8-bit character
> U1TCTL |= SSEL1; // UCLK = SMCLK
> U1BR0 = 0x6D; // 1MHz 9600
> U1BR1 = 0x00; // 1MHz 9600
> U1MCTL = 0x03; // modulation
> U1CTL &= ~SWRST; // Initialize USART state
> machine
> IE2 |= URXIE1; // Enable USART1 RX interrupt
> P4DIR |= 0x01; // P4.0 output direction
> ADC12CTL0 = ADC12ON+REFON+REF2_5V+MSC+SHT0_10;
> ADC12CTL1 = SHP+CONSEQ_1+ADC12DIV_7;
> ADC12MCTL0 = INCH_10+SREF_1;
> ADC12MCTL1 = INCH_10+SREF_1;
> ADC12MCTL2 = INCH_10+SREF_1;
> ADC12MCTL3 = INCH_10+SREF_1;
> ADC12MCTL4 = INCH_10+SREF_1;
> ADC12MCTL5 = INCH_10+SREF_1;
> ADC12MCTL6 = INCH_10+SREF_1;
> ADC12MCTL7 = INCH_10+SREF_1+EOS;
> ADC12IE = 1 << 7;
> ADC12CTL0 |= ENC;
> for(;;) {
> char buf[5];
> ADC12CTL0 = ADC12ON+REFON+REF2_5V+MSC+SHT0_10;
> ADC12CTL1 = SHP+CONSEQ_1;
> ADC12CTL0 |= ENC;
> for(i=0; i < 0x7200; i++) {
> } // no-op delay for reference stabilization
> ADC12CTL0 |= ADC12SC; // start conversion
> _BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
> // ADC12CTL0 &= !ADC12ON; // commented out, but problem
> remains
> s = ' ';
> for(i = 0; i < N_RESULTS; i++) {
> itoa16(ADCresult[i], buf);
> tx_string(buf, 4);
> tx(s);
> }
> s = '\n';
> tx(s);
> _BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
> }
> }
>
> // Watchdog Timer interrupt service routine
> __attribute__((interrupt(WDT_VECTOR)))
> void watchdog_timer(void)
> {
> _BIC_SR_IRQ(LPM0_bits); // Back to active mode
> }
>
> __attribute__((interrupt(ADC12_VECTOR)))
> void ADC12ISR(void) {
> ADCresult[0] = ADC12MEM0;
> ADCresult[1] = ADC12MEM1;
> ADCresult[2] = ADC12MEM2;
> ADCresult[3] = ADC12MEM3;
> ADCresult[4] = ADC12MEM4;
> ADCresult[5] = ADC12MEM5;
> ADCresult[6] = ADC12MEM6;
> ADCresult[7] = ADC12MEM7;
> _BIC_SR_IRQ(LPM0_bits); // Back to active mode
> }
>
> Thanks,
> John
>
>
Reply by Reginald Beardsley●October 9, 20122012-10-09
If you've not actually calculated the filter response of averaging you
should. There are several free MATLAB clones that will do this for you.
And yes, eliminating microvolt level noise is hard, especially in an MCU
design. Consider the requirements for the 24 bit delta-sigma version of the
430, -144dB at Nyquist. That's seriously hard to do. It's actually a
strong argument for as many poles of analog filter as you can reliably build,
followed by oversampled conversion and additional digital filtering and
decimation.
Have Fun!
Reg
Reply by lslonim2●October 9, 20122012-10-09
I agree. I am only using this to measure DC voltages, so averaging is the way to
go. It would be impossible for me to make a lowpass filter that was quiet down
to the microvolts in a real system.
Lloyd
--- In m..., "distantship101" wrote: >
>
> --- In m..., Reginald Beardsley wrote:
> >
> >
> > Averaging only works if you sample much faster than the signal you want and
then decimate after averaging.
>
> That's the case when measuring temperature, which is almost DC, and the
sampling frequency is several dozen kHz. Basically, everything that's not
DC is noise and can be averaged out.
>
Reply by distantship101●October 9, 20122012-10-09
--- In m..., Reginald Beardsley wrote: >
>
> Averaging only works if you sample much faster than the signal you want and
then decimate after averaging.
That's the case when measuring temperature, which is almost DC, and the
sampling frequency is several dozen kHz. Basically, everything that's not
DC is noise and can be averaged out.
Reply by Reginald Beardsley●October 8, 20122012-10-08
A very important element seems to be missing from this discussion: antialias
filtering.
It is absolutely essential to low pass filter the input to the ADC so that
frequencies at 1/2 the sample rate and above are adequately suppressed. In the
case of a 12 bit ADC this means -72dB of filtering at Nyquist. That's an
11 pole filter if you set the corner at 1/2 Nyquist (i.e. 1/4 the sampling
rate). If you ignore this you will get the crappy results you deserve no matter
what device you use. Averaging samples will not correct the problem. It will
only eliminate some of the aliased signal. Signals 1 Hz above Nyquist will
appear in the output at 1 Hz.
Averaging only works if you sample much faster than the signal you want and then
decimate after averaging. But you still need an adequate antialias filter at
the actual sampling rate. And averaging can still leave plenty of stopband
ripple to be aliased in the decimation. A properly designed low pass digital
filter will provide better results. Triangular weighted averaging will be better
than boxcar weights, but not as good as a proper filter.
Everything present on the input to the ADC matters. Just because the sensor
output is low bandwidth does not mean that the ADC input is low bandwidth. In
the vicinity of digital circuits running at several MHz there is lots of low
level, high frequency noise. If this is not filtered out, it will appear on the
ADC output as low frequency noise.
It's very hard to say what the internal temperature sensor input to the ADC
has. I suspect nothing as it's probably not expected to be a high
precision measurement. While thermal mass would make the thermistor output low
frequency, that does not preclude coupling noise above Nyquist from other parts
of the chip.
Have Fun!
Reg
Reply by Hardy Griech●October 8, 20122012-10-08
On 08.10.2012 18:25, lslonim2 wrote: > I've used the MSP430 series for 6 years, and
have always found the ADC
> to be noisy. I average at least 16 samples before using, and often it :
My hint is to use median (15 samples) instead of average. That's what
I'm actually using and my results are quite satisfying.
Hardy
Reply by Peter Johansson●October 8, 20122012-10-08
On Mon, Oct 8, 2012 at 12:25 PM, lslonim2 wrote:
> I've used the MSP430 series for 6 years, and
have always found the ADC to be noisy. I average at least 16 samples before
using, and often it takes more samples averaged to get a reading which is
repeatable. Sometimes I average 512 or 1024 samples.
>
> I don't know if this is considered a defect, considering that the LSBs
are typically in the microvolts. But anyway, it doesn't surprise me at
all.
I've noticed the same thing, but I have only been using the MSP430 for
about 18 months and I have little experience with the A/Ds of other
micros.
I have noticed that for low frequency DC on the ADC10, a cap on the
input makes a huge difference.
Last month I was playing with the SD16 on the F2013 and I was only
able to achieve about 12 usable bits. Now, in all fairness, this was
single-ended on a breadboard. I have been meaning to move the circuit
over to proto-board, switch to differential input, and eliminate all
other circuitry to see just what is causing the noise, or whether it
is inherent to the F2013.
I have some AFE253s to fall back on if I cannot get enough bits from
the F2013. I am guessing that the separate analog supply will help a
lot with the noise.
But I am curious what you have been doing to get the noise out of your
circuits, and what has and hasn't worked for you...