Title: Taking timing further
1Taking timing further
2Outline
- Timer 1
- Timer 2
- Capture/Compare/PWM
- Pulse Width Modulation (PWM)
- Digital to Analog Conversion (DAC)
- Summary
3Timing Issues
- Maintaining continuous counting functions
- Recording (capturing) in timer hardware the
time an event occurs - Triggering events at particular times
- Generating repetitive time-based events
- Measuring frequency, e.g., motor speed
4The PIC 16 Series
Device Pins Features
16F84A 18 1 8-bit timer 1 5-bit port 1 8-bit port
16F873A 16F876A 28 3 parallel ports, 3 counter/timers, 2 capture/compare/PWM, 2 serial, 5 10-bit ADC, 2 comparators
16F874A 16F877A 40 5 parallel ports, 3 counter/timers, 2 capture/compare/PWM, 2 serial, 8 10-bit ADC, 2 comparators
5PIC 16F84A Timer 0 Module
6PIC 16F84A Timer 0 Module
7Option Register
- T0CS Clock source select
- T0SE Source edge select
- PSA Prescaler assignment bit
- PS2PS0 Prescaler rate select
8PIC 16F87XA Timer 1 Module
9Timer 1 Registers
- 16-bit register
- TMR1L (0Eh)
- TMR1H (0Fh)
- Control Register
- T1CON (10h)
10Timer 1 control register
- T1CKPS1T1CKPS0 Input Clock Prescale Select,
11-18 - T1OSCEN Oscillator Enable Control
- T1SYNC External Clock Input Synchronization
Control - TMR1CS Clock Source Select
- TMR1ON Timer1 On
11Derbot odometer
- Timers 0 and 1 are used to count pulses generated
by the optical sensors mounted on the shaft
encoders. - The program drives the Derbot forward for 1m. It
then completes a 180? turn on the spot and runs
forward for 1m again. The program loops
continuously in this manner.
12Derbot odometer circuit
13Odometer Example Page 1
- Initialization
- movlw B'01000100' set port A for right
- movwf adcon1 analog/digital mix
- movlw B'11101000' T0 external input,
- movwf option_reg low to high transition,
- no prescale
- movlw B'00000011' T1 no prescale,
- movwf t1con oscillator disabled,
- external sync input
14Odometer Example Page 2
- opto_move
- clrf tmr0 clear timers
- clrf tmr1l
- clrf tmr1h
- clrf flags
- btfss portc,0 increment T1 if ip is zero,
- incf tmr1l as 1st rising edge isnt
- detected
-
- call leftmot_fwd start motors running
- call rtmot_fwd
Because the counter must first have a falling
edge before it starts to count.
15Odometer Example Page 3
- opto_loop
- movlw D'91' test for 1m
- subwf tmr0,0
- btfsc status,z
- bcf porta,mot_en_left disable motor if
- movlw D'91'
- subwf tmr1l,0
- btfsc status,z
- bcf porta,mot_en_rt disable motor if
-
- goto opto_loop
16Generating a clock tick a repetitive
interrupt stream
17Example clock tick generation
- Assuming an oscillator frequency of 4MHz, what is
the slowest clock tick rate that can be
obtained from Timer 0 and Timer 1? - T0 slowest interrupt rate with prescaler 256.
- The input frequency to T0 is 1 MHz/256, or 3.906
kHz. - The 8-bit timer divides this frequency by 256 to
produce the clock tick frequency, which will be
3.906 kHz/256, or 15.26 Hz.
18Example clock tick generation
- T1 slowest interrupt rate with prescaler 8.
- The input frequency to T1 is 1 MHz/8, or 125 kHz.
- The 16-bit timer divides this frequency by 216 to
produce the clock tick frequency, which will be
125 kHz/ 216, or 1.91 Hz.
19PIC 16F87XA Timer 2 Module
20Timer 2 Registers
- 8-bit register
- TMR2 (11h)
- Control Register
- T2CON (12h)
- PR2 (92h), period register
21Timer 2 control register
- TOUTPS3TOUTPS0 Output Postscale Select,
11-116 - TMR2ON Timer 2 On
- T2CKPS1T2CKPS0 Clock Prescale Select, 11, 14,
116
22The PR2 register, comparator and postscaler
23Example Timer 2 interrupt rate
- Assuming an oscillator frequency of 4MHz, what is
the slowest clock tick rate that can be
obtained from Timer 2? - Slowest interrupt rate with prescaler 16 and
postscaler 16 . - The input frequency is 1 MHz/16, or 62.5 kHz.
- If PR2 is preset to 255, the frequency is divided
by 256 to produce the reset frequency, which will
be 62.5 kHz/256, or 244.14 Hz. - With postscaler of 16, then the interrupt
frequency will be 15.26 Hz.
24The capture/compare/PWM (CCP) modules
- 2 CCP modules
- Each CCP module contains a 16-bit register which
can operate as a - 16-bit Capture register
- 16-bit Compare register
- Pulse width modulation Master/Slave Duty Cycle
register
25CCP Registers
- 16-bit register
- CCPR1L (15h)
- CCPR1H (16h)
- CCPR2L (1bh)
- CCPR2H (1ch)
- Control Register
- CCP1CON (17h)
- CCP2CON (1dh)
26CCP x control register
- CCPxXCCPxY PWM Least Significant bits
- CCPxM3CCPxM0 Mode Select bits
27CCPx Mode Select bits
28Capture mode
29Compare mode
30Pulse width modulation
The current rises from 10 to 90 of its final
value in time 2.2L/R
Time constant small compared to on time.
31Pulse width modulation
Time constant large compared to on time, wide
pulse
Time constant large compared to on time, narrow
pulse.
32PWM mode
- Note 1 The 8-bit timer is concatenated with
2-bit internal Q clock, or 2 bits of the
prescaler, to create 10-bit time base.
33Waveforms for the 16F873A PWM generator
34Calculations
- T (PR2 1) (Timer 2 input clock period)
- (PR2 1) Tosc 4 (Timer 2 prescale
value) - ton (pulse width register) (PWM timer input
clock period), - (pulse width register) Tosc (Timer 2
prescale value) - pulse width register CCPR1L CCP1CONlt54gt 1
35Example
- PR2 is loaded with 249D. The clock oscillator
frequency is 4 MHz. Neither pre- nor postscale.
Find the PWM period. - T (PR2 1) Tosc 4 (Timer 2 prescale
value) - 250 (250 ns 4 1)
- 250 µs
- i.e. PWM frequency 4.00 kHz.
36PWM applied in the Derbot for motor control
37Example waveforms
38Derbot Motor Example Page 1
- set up PWM
- movlw B'00000100' switch on Timer2,
- movwf t2con no pre or postscale
- movlw B'00001100' enable PWM
- movwf ccp1con
- movwf ccp2con
- movlw 0f9 249
- movwf pr2
- ...
39Derbot Motor Example Page 2
- leftmot_fwd run left motor forward
- bsf porta,mot_en_left
- movlw D'176'
- movwf CCPR2L
- return
- leftmot_rev run left motor backward
- bsf porta,mot_en_left
- movlw D'80'
- movwf CCPR2L
- return
40Generating PWM in software
- May use up all PWM resources or dont have them
in a low-cost microcontroller. - PWM outputs can be generated based on software
delay loops only. - PWM outputs can also be generated based on timer
interrupts.
41Generating PWM with timer interrupt
42cblock assembler directive
- cblock 20
- var1 reserve 1 byte for var1
- var2 reserve 1 byte for var2
-
- endc
43PWM used for digital-to-analog conversion (DAC)
44RC low-pass filter characteristics
45Derbot Example
fc 1/(2p100nF 20kO) 80 Hz
46Generating a sine wave
47Lower the PWM stream.Upper detail of analog
output
T 250 µs f 4 kHz
48Sine wave example Page 1
- clrf pointer
- sin_loop
- movf pointer,w
- call sin_table get most significant byte
- movwf ccpr1l move it to the PWM output
- incf pointer,f increment the pointer
- movf pointer,w
- call sin_table get the MS byte
- andlw B'11000000' we only use ms 2 bits
49Sine wave example Page 2
- movwf temp
- bcf status,c adjust for CCP1CON
- rrf temp,f
- rrf temp,w
- iorlw B'00001100' set some CCP1CON bits
- movwf ccp1con
- incf pointer,f
- movf pointer,w
-
- call delay1
- goto sin_loop
50Weaknesses of this method
- The output analog voltage is directly dependent
on the logic levels of the PWM stream. These in
turn are dependent on the accuracy of the power
supply voltage. - The low-pass filter cannot generate fast-changing
signals.. - Running the PWM faster decreases the resolution.
- There will always be some residual ripple on the
analog output.
51Frequency measurement
Both a counter and a timer are needed, the timer
to measure the reference period of time and the
counter to count the number of events within that
time.
52Derbot speed measurement program
53Speed measurement example Page 1
- Timer2_Int
- decfsz int_cntr
- goto int_end
- here if making a measurement
- movf tmr0,w save counter values
- movwf tmr0_temp
- movf tmr1l,w
- movwf tmr1_temp
- clrf tmr0 clear counters
- clrf tmr1l
54Speed measurement example Page 1
- btfss portc,0 inc T1 if 0, as first
- incf tmr1l rising edge wont be seen
- movlw D'250' reload interrupt counter
- movwf int_cntr
- int_end
- bcf pir1,tmr2if
- retfie
55Summary
- Timing is an essential element of embedded system
design both in its own right and to enable
other embedded activities, like serial
communication and pulse width modulation. - A range of timers is available, with clever
add-on facilities which extend their capability
to capture, compare, create repetitive interrupts
or generate PWM pulse streams. - In applications of any complexity, a
microcontroller is likely to have several timers
running simultaneously, for quite different and
possibly conflicting applications. The question
remains open at this stage how can these
different time-based activities be marshaled and
harmonized?