Embedded Systems - Ulster University

Download Report

Transcript Embedded Systems - Ulster University

Embedded Systems
Lecture 5: PIC32 development board,
Timers ADC and interrupts,
Ian McCrum
Room 5B18, Tel: 90 366364 voice mail on 6th ring
Email: [email protected] Web site: http://www.eej.ulst.ac.uk
Timers
PIC32MX1xx/2xx family have 5 (6 counting the internal core timer)
Core Timer
you can just read the 32 bit number that increments
automatically
There is a Plib function ReadCoreTimer(void); that
returns an unsigned int.
It runs at half the system frequency. Note figure 8-1
from the datasheet
Timers type A and type B;
TIMER1: Type A
a 16 bit counter that has a PR1 register allowing generating a trigger, either
when overflow occurs or when the count equals the value held in PR1.
It can use the system clock (actually the Peripheral clock PBCLK) either direct
or divided by 1,8,16 or 64.
Or it can use an external clock, either an input or an external crystal
Relevant register is T1CON. The trigger condition raises the T1IF Flag
Timers type B; (Timers 2,3 and Timers 4,5)
TMRx is even – timer 2 or 4
TMRy is odd – timer 3 or 5
X is the master timer, y is slave
Code for type A – 16 bit Timer1 - see next slide for T1CON again…
Using Interrupts with Timer 1 (plib calls)
Try this
code and
then do
the
exercises
at the
end…
Using the Analogue to Digital Convertor (ADC)
The 10-bit Analog-to-Digital Converter (ADC) includes the following features:
• Successive Approximation Register (SAR) conversion
• Up to 1 Msps conversion speed
• Up to 13 analog input pins
• External voltage reference input pins
• One unipolar, differential Sample and Hold Amplifier (SHA)
• Automatic Channel Scan mode
• Selectable conversion trigger source
• 16-word conversion result buffer
• Selectable buffer fill modes
• Eight conversion result format options
• Operation during Sleep and Idle modes
11.1.2 CONFIGURING ANALOG AND DIGITAL PORT PINS
The ANSELx register controls the operation of the analog port pins.
The port pins that are to function as analog inputs must have their corresponding
ANSEL and TRIS bits set.
ANSELA on
Our PIC
Overview of Operation
Analog sampling consists of two steps: acquisition and conversion
Sample start time can be controlled in software by setting the SAMP bit (AD1CON1<1>) or
controlled automatically by the ASAM bit (AD1CON1<2>)
Conversion time is the time required for the ADC to convert the voltage held by the SHA.
The ADC requires one ADC clock cycle (TAD) to convert each bit of the result, plus two
additional clock cycles. Therefore, a total of 12 TAD cycles are required to perform the
complete conversion. When the conversion time is complete, the result is written into
one of the 16 ADC result registers (ADC1BUF0 through ADC1BUFF).
The sum of the acquisition time and the analog-to-digital conversion time provides the
total sample time
The conversion trigger source SSRC<2:0> (AD1CON1<7:5>) ends the sampling time and
begins an ADC conversion. Taken from a variety of hardware sources, or can be
controlled manually in software by clearing the SAMP bit.
The Auto-Sample mode and auto-conversion trigger can be used together to provide
endless automatic conversions without software intervention.
The ADC can optionally switch between MUX A and MUX B configurations between
conversions. The ADC can also optionally scan through a series of analog inputs using a
single MUX.
Note, inputs can be
single or differential,
we can use external
Vref + and -
The DP32 board has AN9 wired to a Variable Resistor
AN9 is RB15/RPB15, pin 26 on the 28 pin device
Very
powerful
buffer
system
Note, inputs can be
single or differential,
we can use external
Vref + and -
The DP32 board has AN9 wired to a Variable Resistor
AN9 is RB15/RPB15, pin 26 on the 28 pin device
So you can repetitively sample a selected range of channels, the
values are stored in the buffer registers
An interrupt may be generated at the end of each sample sequence or multiple
sample sequences as determined by the value of the SMPI<3:0> bits
(AD1CON2<5:2>). The number of sample sequences between interrupts can vary
between 1 and 16. The user should note that the analog-to-digital conversion
buffer holds the results of a single conversion sequence.
ANSELB=0x0080
The DP32 board has AN9
wired to a Variable Resistor
AN9 is RB15/RPB15, pin 26 on
the 28 pin device
Redo this code for AN9
ANSELB = 0x0080
The DP32 board has AN9
wired to a Variable Resistor
AN9 is RB15/RPB15, pin 26 on
the 28 pin device
Redo this code for AN9
Bit 15 ON 1 = ADC is operating
Bit 13 SIDL only relevant in idle mode
Bit 10-8 FORM<2:0> 000 = 16 bit Data out – bottom 10 bits are the reading
Bit 7-5 SSRC<2:0> 000 = clearing SAMP bit ends sampling and starts conversion
Bit 4 CLRASAM 0 = normal, buffer get overwritten by next conversion sequence
Bit 2 ASAM 1 = sampling begins as soon as last conversion complete
0 = Sampling begins when SAMP bit is set
Bit 1 SAMP 1 = ADC sample and hold Amp is sampling
0 = ADC sample and hold Amp is holding
When ASAM = 0, writing ‘1’ to this bit starts sampling
When SSRC = 000, put ‘0’ in SAMP -ends sampling & starts conversion
Bit 0 DONE 1 = ADC conversion is done
Bit 15-13 VCFG<2:0> 000 = Vrefh = AVDD and Vrefl = Avss (3.3V and 0V)
Bit 12 OFFCAL 0 = disable input offset calibration
Bit 10 CSNA 0 = do not scan inputs {1 = scan inputs}
Bit 7 BUFS only valid if BUFM is ‘1’; 1 = ADC is filling buffer 8-F, you read 0-7
0 = ADC is filling buffer 0-7, you read 8-F
Bit 5-2 SMPI<3:0> 0000 = Interrupt at completion of conversion for each sample
Bit 1 BUFM 0 = Buffer configures as one 16 word buffer ADC1BUFF to ADC1BUF0
1 = Buffer configures as two 8 word buffers
Bit 0 ALTS 0 = Use Sample A input multiplexor settings {1=>alternate sample A/B)
bit 15
ADRC: ADC Conversion Clock Source bit
1 = Clock derived from FRC
0 = Clock derived from Peripheral Bus Clock (PBCLK)
bit 12-8 SAMC<4:0>: Auto-Sample Time bits <note 1>
11111 =31 T AD
00001 =1 TAD
00000 =0 TAD (Not allowed)
bit 7-0 ADCS<7:0>: ADC Conversion Clock Select bits <note 2>
11111111 =TPB • 2 • (ADCS<7:0> + 1) = 512 • TPB = TAD
•
•
•
00000001 =TPB • 2 • (ADCS<7:0> + 1) = 4 • TPB = TAD
00000000 =TPB • 2 • (ADCS<7:0> + 1) = 2 • TPB = TAD
bit 31 CH0NB
1 = Channel 0 negative input is AN1
0 = Channel 0 negative input is VREFL
bit 27-24 CH0SB<3:0>: Positive Input Select bits for Sample B
1111 = Channel 0 positive input is Open
1100 = Channel 0 positive input is AN12
•••
0001 = Channel 0 positive input is AN1
0000 = Channel 0 positive input is AN0
bit 23
CH0NA: Negative Input Select bit for Sample A Multiplexer Setting
1 = Channel 0 negative input is AN1
0 = Channel 0 negative input is VREFL
bit 19-16 CH0SA<3:0>: Positive Input Select bits for Sample A Mux Setting
1111 = Channel 0 positive input is Open
1110 = Channel 0 positive input is IVREF
1101 = Channel 0 positive input is CTMU temperature (CTMUT)
1100 = Channel 0 positive input is AN12
•••
0001 = Channel 0 positive input is AN1
0000 = Channel 0 positive input is AN0
http://umassamherstm5.org/tech-tutorials/pic32-tutorials/pic32mx220-tutorials/adc
The 10-bit ADC can be split into two sections: Acquisition and Conversion.
Manual Mode Configuration
In manual mode, the programmer must make an individual request every time the ADC starts a
sample. In the version presented here, the acquisition is started manually by
setting AD1CON1bits.SAMP HIGH.
Conversion will then start automatically after an amount of time specified in the AD1CON3 SFR.
When acquisition is finished, the SAMP bit will go LOW.
When conversion is done, the AD1CON1bits.DONE bit will go HIGH.
The result will be stored in one of the ADC1BUFx registers.
Since we’re only requesting the analog value of one pin at a time in this manual mode,
the result is always stored in the first buffer register or ADC1BUF0.
The AD1CHS is the channel select SFR.
Of importance to us is that AD1CHS<16:19> control which pin is being input to the ADC.
With this information, we can make a simple function that takes as input an analog pin number and
returns the 10-bit analog voltage as an int from 0-1023 as follows.
To configure for this mode, we set the conversion to trigger automatically after acquisition is
done by setting the SSRC bits found at AD1CON1<5:7>. Choosing manual mode is also found
in this register.
In AD1CON3, we will set the source of the ADC clock, how long a period (TAD) is, and how
many periods of this clock per acquisition. Conversion is always 12 TAD cycles long. We’ll set
the analog clock period to be four times the peripheral bus clock period which will be equal
to SYSCLK.
TAD = 4*TPB. At FPB = 50MHz, TAD = 4*TPB = 80ns. To be on the safe side, we’ll configure the
acquisition period as 15*TAD = 1.2us. Thus, the entire analog-to-digital conversion takes
27*TAD = 2.16us. The configuration is shown below.
Automatic Scan Configuration
In the automatic scan mode we’ll be using, the ADC peripheral will be sampling and converting a
specified number of analog pins as long as the ADC has power.
Whenever the processor then requests the 10-bit voltage representation of some of these pins, the
ADC peripheral will give the most recent completed conversion.
With this method, ADC call latency is severely reduced!
Once the ADC is configured and running, every additional pin request is as simple as a single
assignment line.
However, this method uses slightly more power as the ADC is constantly sampling and converting
voltages. Also, while the ADC call time is very short, there is a minimum time between calls to make
sure new analog voltages have been sampled.
We’re only talking a few microseconds and even this can be reduced by careful planning of the ADC
clock (TAD) and how many cycles are necessary for sampling in your particular application!
Please read the link below if you wish to understand this further
http://umassamherstm5.org/tech-tutorials/pic32-tutorials/pic32mx220-tutorials/adc
Working ADC Code on the DP32;
using AN9(RB15) and LEDs 3-0(RB0-3)
Modified from http://umassamherstm5.org/tech-tutorials/pic32-tutorials/pic32mx220-tutorials/adc
Modified from http://umassamherstm5.org/tech-tutorials/pic32-tutorials/pic32mx220-tutorials/adc
Modified from http://umassamherstm5.org/tech-tutorials/pic32-tutorials/pic32mx220-tutorials/adc
Exercises
1. Add a timedelay so that a reading is taken every 1/100th second.
2. Add a buffer so that data is continually filling a 1024 ring buffer
3. Output on the LEDs how full the buffer is
4. Convert the ADC routine so that it fills the buffer under interrupts and the only code
is main loops continually checking how full the buffer is,
These exercises prepare you for the mini-project.