Driver Circuits

TIMER
1
TIM feature
• 16 bit up, down, up/down, and auto-reload
counter
• 16 bit programmable prescaler allowing
dividing the counter clock by any number
between 1 and 65535
• Up to 4 independent channel for:
– Input, Output, PWM, and One-pulse mode
output
• Synchronize circuit with other timers
2
Time feature
• Repetition counter to update timer
registers only after a given number of
cycles of the counter
• Interrupt/DMA generation
• Support incremental encoder and hall
sensor circuitry for positioning purpose
• Trigger input for external clock
3
Advanced control timer block diagram
4
Timer-base unit
• Counter register (TIMx_CNT)
for counting purpose
• Prescaler register (TIMx_PSC)
for clock division
• Auto-reload register (TIMx_ARR) [period]
setting the maximum/minimum count value
to preload register
• Repetition counter register (TIMx_RCR)
the number of repetition
5
Auto-reload register
• Writing or reading from the auto-reload
register will access to preload register
• The content of preload register are
transferred to the shadow register at each
update event (UEV) when ARPE register
=1
• When ARPE register =0, the update will
happen immediately
• The update of UEV is sent when the
6
counter reach overflow
Prescaler description
• The prescaler can divide the counter clock
frequency by any factor between 1 and
65536
• It can be updated on the fly, but the
change will happen at the next update
event
• The value of prescaler has to be added
with 1
7
Counter timing diagram with prescale
division changes from 1 to 2
8
Counter timing diagram with prescale
division changes from 1 to 4
9
Counter timing diagram (divided by 1)
10
Counter timing diagram (divided by 2)
11
Counter timing diagram (divided by 4)
12
Counter timing diagram (divided by N)
13
Counter modes
DIR bit in TIMx_CR1 register:
• Upcounting mode
• Downcounting mode
• Up/Down counting mode
14
Upcounting
• The counter counts from 0 to autoreloaded valued
• Then, it restart from 0 and generate a
counter overflow event
• If the repetition counter is used, the update
event (UEV) is generated and will repeat
up to the number of times programmed in
repetition counter register
15
Counter timing diagram when ARPE=0
16
Counter timing diagram when ARPE=1
17
Down counting
• Counter count from auto-reload value
down to 0
• After reaching 0, it will restart from autoreload value and generate a count
underflow event
• If the repetition counter is used, the update
event (UEV) is generated, and will repeat
for the number of times programmed in
repetition register
18
Down counter timing diagram (divided by 1)
19
Down counter timing diagram (divided by 1)
20
Down counter timing diagram (divided by 2)
21
Down counter timing diagram (divided by 4)
22
Down counter timing diagram (divided by 4)
23
Down counter timing diagram (divided by N)
24
Counter timing diagram with
auto-reload register update
25
Up/Down counting mode
• The counter counts from 0 to the autoreload value -1 then generate a counter
overflow event
• Then, it counts from auto reload value to
0, then generate a counter underflow
event
• Then, it restarts from 0
26
Counter timing diagram with clock divided by 1
27
Repetition counter
• It mainly uses in PWM
• It controls how the update event (UEV) or interrupt is
generated
• It will actually generated with TIM1_RCR (repetition
counter) is counted to 0
• TIM1_RCE will decrement when
– At each counter overflow in upcounting mode
– At each counter underflow in downcounting mode
– At each counter overflow and then underflow in updown counting mode
28
TIM1_RCR update
29
PWM mode
• It can generate a signal with a frequency
determined by the value of TIMx_ARR and
a duty cycle determined by TIMx_CCRx
register
• PWM mode can be selected
independently for each channel
• Timer is generated PWM in edge-aligned
mode or center aligned mode
• Polarity output (active high or active low)
30
PWM edge-aligned mode
• Mode 1: set OCxM bit to “110”. During the
up count, PWM will be 1 when TIMx_CNT
< TIMx_CCRx
• Mode 2: set OCxM bit to “111”. During the
up count, PWM will be 0 when TIMx_CNT
< TIMx_CCRx
31
Edge aligned PWM waveform
32
PWM center aligned mode
• Mainly used in Up-Down counting mode
• To enable this mode, CMS bits are set to
any value except “00”
33
Center align PWM waveform
34
Example of ARM code
int flag=0;
TIM_OCInitTypeDef TIM_OCInitStructure_c1;
TIM_OCInitTypeDef TIM_OCInitStructure_c2;
TIM_OCInitTypeDef TIM_OCInitStructure_c3;
#define PWM_Period 2000
int main(){
int pulse1 = 1000/2;
int pulse1_change_flag=0;
flag = 0;
RCC_setup();
// RCC Configuration
GPIO_setup(); // GPIO Configuration
TIMER_setup(); // TIMER Configuration
while(1) {
TIM_OCInitStructure_c1.TIM_Pulse = pulse1; // set duty cycle
TIM_OCInit(TIM4, &TIM_OCInitStructure_c1);
}
}
35
void RCC_setup(){
ErrorStatus HSEStartUpStatus; // Keep error status
RCC_DeInit();
// RCC system reset(for debug purpose)
RCC_HSEConfig(RCC_HSE_ON); // Enable HSE
HSEStartUpStatus = RCC_WaitForHSEStartUp(); // Wait till HSE is ready
if(HSEStartUpStatus == SUCCESS)
{
RCC_HCLKConfig(RCC_SYSCLK_Div1); // HCLK = SYSCLK
RCC_PCLK2Config(RCC_HCLK_Div1); // PCLK2 = HCLK
RCC_PCLK1Config(RCC_HCLK_Div2); // PCLK1 = HCLK/2
RCC_ADCCLKConfig(RCC_PCLK2_Div4); // ADCCLK = PCLK2/4
FLASH_SetLatency(FLASH_Latency_2); // Flash 2 wait state
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
RCC_PLLCmd(ENABLE); // Enable PLL
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); // Select PLL as system
clock source
while(RCC_GetSYSCLKSource() != 0x08); // Wait till PLL is used as system clock
source
}
36
void GPIO_setup(){
GPIO_InitTypeDef GPIO_InitStructure; // Enable GPIOA GPIOB clock
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB
|RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_9 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8; // tim4_1,
tim4_2, tim4_3, tim4_4
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);
/* Disable the Serial Wire Jtag Debug Port SWJ-DP */
37
}
void TIMER_setup(){
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE); // Enable TIM4 clock
// Time base configuration
TIM_TimeBaseStructure.TIM_Period = 1999;//1999;
TIM_TimeBaseStructure.TIM_Prescaler = 71;//71;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
/* PWM1 Mode configuration: Channel1 */
TIM_OCInitStructure_c1.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure_c1.TIM_Channel = TIM_Channel_1;
TIM_OCInitStructure_c1.TIM_Pulse = (int)(PWM_Period / 2);
TIM_OCInitStructure_c1.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInit(TIM4, &TIM_OCInitStructure_c1);
38
/* PWM1 Mode configuration: Channel2 */
TIM_OCInitStructure_c2.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure_c2.TIM_Channel = TIM_Channel_2;
TIM_OCInitStructure_c2.TIM_Pulse = (int)(PWM_Period / 2);
TIM_OCInitStructure_c2.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInit(TIM4, &TIM_OCInitStructure_c2);
/* PWM1 Mode configuration: Channel3 */
TIM_OCInitStructure_c3.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure_c3.TIM_Channel = TIM_Channel_3;
TIM_OCInitStructure_c3.TIM_Pulse = (int)(PWM_Period / 2);
TIM_OCInitStructure_c3.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInit(TIM4, &TIM_OCInitStructure_c2);
TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM4, ENABLE);
TIM_Cmd(TIM4, ENABLE);
}
39
Simulink: basic PWM
• This block can be used to generate PWM
signal.
40
Configuration
41
Example: Basic PWM
42
Setup
43
Output
44
Active Low example
45
Output
46
Simulink: Advanced PWM
• To control advanced PWM
47
Configuration
48
Example
49
Output
50
Delay
51
Configuration
52
Example
53
Simulink: Encoder read
54
Configuration
55
Example
56
Com port setup
57
Hardware
58
Timer IRQ
59
Configuration
60
Configuration
61
Example
62
Stepper Motor Example
• External and Internal structure of Bi-polar
Stepper Motor
63
Stepper motor
• A synchronous electric motor that can divide a full
rotation into a number of steps
• Motor position can be controlled precisely without any
feedback system
• Doesn’t require feedback sensor
• Operate in DC power
• Used in many devices such as harddisk drives, and
printers
• Can make motor spin by outputting the sequence like …
10,9,5,6,10,9,5,6….
• For 200 steps motor, each new output will cause the
motor to rotate 1.8 degree
Stepper motors
Stepper motor
Single Phase Rotation Control
• The currents in the coils will have the
same direction. It will result in low drive
force and not recommended.
67
Two Phase Rotation Control
• This technique provides more current and
hence more power.
68
Half Step Rotation Control
69
Waijun: Single phase
70
Simulink Model
71
Subsystem for motor control
72
Full System Model
73
Two-Phase Model
74
Half Phase Model
75
Subsystem for Up/Down Counter
76
Full System Block
77
Trigger Subsystem block
78
Rotation Speed Adjustment with DIP Switch
79
Position Control with Stepper Motor
• From the properties of stepper motor in
the experiment, Step Angle: 5.625 degree
/ 64 means motor rotate 1 step the axis
will rotate 0.0879 degree, so if we want to
rotate 90 degree.
• Desired Step = 90 / 0.0879 = 1024 Step
80
Position Control with Push Button
• Rotate 90 degree CW when SW1 is pushed
• Rotate 90 degree CCW when SW2 is pushed
81
Desired Step
• Change CW1 with our desired step
82
RC Servo
83
Servo Motor
84
Servo Motor Turning
Standard for Servo motor control 1.5 ms
over 20ms will move to neutral position
85
PWM Block
86
Servo Control
87
Results
88
Servo with Potentiometer
89
Linear Relation Graph
• When resistor is connected to the ground, it will rotate to
-90 degree, when it is connected to Vdd, it will rotate 90
degree
90
Results
91
Question?
• If the user wants to set the RC servo to be
at 0 degree (Pulse Width =1.5ms), what
should be the duty cycle if signal
frequency = 60 Hz.
92
Answer
• Signal = 60 Hz, period = 16.67 ms
• The duty cycle = 1.5 x 100 / 16.67 = 9%
93
Timer Example
94
Timer with Prescale
95
Time Module
96
PWM Duty Cycle
97
Duty Cycle Adjust to the Edge Align mode
98
Adjust PWM for the Center Align mode
99
Basic PWM Block
100
Adjusting the Duty Cycle
101
Adjusting the Brightness of LED
102
Advanced PWM Block
103
Simulink Model for Generating PWM Signal
104
PWM Signal at Channel 1
105
PWM Signal at Channel 2
106
PWM Signal at Channel 3
107
Setting Timer IRQ Block
108
Time IRQ Block
109
Function Call Subsystem
110
Sample Time Window
111
Ultrasonic Module
112
Operating Mode
113
PWM Capture Block
114
Comparing the Measured Signal
115
The Experiment Setup
116
Simulink Model
117
Results
118
Driving Motors and Relays
• High current devices like motors, relays,
solenoids, buzzers, and light bulbs can require
more than 500mA of current
• Even though voltage levels may be the same,
digital outputs from a GPIO (parallel) port typically
drive only 5-20mA of current
• They cannot drive high current devices directly
and trying to do so will likely blow out the output
circuit
Driver Circuits
• A higher current driver circuit must be added
after the digital output pin and before the device
• A driver circuit typically uses a discrete power
transistor
• For DC motors, consider using an H-bridge
circuit module. It contains four power transistors
than can also reverse the motor.
• Diodes are often used for additional protection
across the load on motors and relays. When you
turn off the current in an inductive load it
generates a reverse voltage spike that might
damage the transistor (back EMF). The diode
shorts it out.
H-Bridge - DC Motor Driver Circuit
H-Bridge Control Functions
Input
Function
Operation
10
Forward
DC Motor runs in the
forward direction
01
Reverse
DC Motor runs in the
reverse direction
00
Stop
Motor is not
connected – Coasts
11
Brake* or
Motor Terminals
Shorted or
Power Supply
Shorted!
Short Power Supply
(not allowed!)
*The Brake function requires a more complex decoder circuit to control the
power transistors. Check the H-Bridge data sheet to make sure it is supported
before using it. In some simple H-Bridge circuits, the fourth state must be
avoided (i.e., illegal state) and it will short out the power supply!
H-Bridge Example - Forward
HIGH
LOW
H-Bridge Example - Reverse
LOW
HIGH
Figure 3.10 Fairchild FAN8100N Low Voltage Dual H-Bridge DC Motor Driver IC.
Images courtesy of Fairchild Semiconductor.
Higher current H-Bridge modules typically use discrete power transistors
assembled on a board. This dual H-Bridge module switches up to 10 amps
at 24V DC. The eight power transistors can be see arranged on the right
side of the board. Photograph courtesy of RoboticsConnection.
Using Potentio Meter to control speed of DC motor
127
Simulink Model
128
Motor Direction Control
129
Simulink Model
130
Encoder Reading
• Structure of Rotary Encoder
131
Detecting Direction
• If the signal A is leading signal B, the
motor is moving clockwise
132
Signal Encoder Interface
133
Waijung Encoder Read
134
Reading Rotation Angle
135
Simulink Model
136
Converting Encoder Reading to Integer
137
Results
138
Waveform Results
139
Question?
• Calculate speed (period) of each PWM?
140
Answer:
• Period = 72 MHz / (2000*72) = 500 Hz
141
Questions?
142