Anda di halaman 1dari 4

ARM-Cortex-M3 Timer

Bi hm nay ti s ni v Timer ca dng M3


1. Tng qut v Timer
Sau y ta s xt cu trc c bn ca mt b timer qua hnh v sau y:

Ba thnh phn c bn l:

Prescaler (PSC): h s chia


Auto Reload Register (ARR): Thanh ghi t ng np li
Counter (CNT): B m

Prescaler s gip chia tn s h thng cung cp cho b Timer. V d nh tn s h thng l


24Mhz, nu mun tn s cho b m l 1Mhz th gi tr ca Prescaler l 23.
Ta c th cu hnh Timer l b m ln, xung hoc m ln/xung.
By gi ti s ly mt v d c bn gii thch hot ng ca Timer.
Prescaler c gn gi tr 1, nn tn s h thng s c chia i a vo b Timer. Auto
Reload s c gn gi tr 3, Timer thit lp lm b m ln.
Nh th, sau mi xung nhp ca b Timer, thanh ghi m s tng ln mt gi tr t 0, v nu t
gi tr 3, n s kch hot tn hiu TRGO v thanh ghi m c reset v 0.
Sau y ti s i vo mt v d cho vic dng timer l to xung PWM thay i sng
LED, PWM l g th chc khng qu xa l vi cc bn hc in t, nn ti khng bn v vn
ny na, m i lun vo v d c th.
2. PWM Output
Cc chn IO ca dng Cortex-M3 c th kt ni ti mt knh ca Timer no , chc cc bn
thc mc v knh ca Timer, c th hiu nm na rng, mt Timer s c nhiu Knh, mi Knh
s c ni vi chn IO no , nh th ta c th xut cc tn hiu PWM vi cng tn s ra cc
chn ny, nhng y xung (duty) c th khc nhau gia cc chn.
Vic bit chn no, ni vi knh no ca Timer l rt quan trng ta c th khi to cho ng,
ta s xem datasheet ca chip bit iu ny.
V d ta xem datasheet v thy c dng sau:

Nh vy ta s bit c rng chn PA6 c th dng vi Timer 3, chanel 1 (TIM3_CH1).


V:

PA7 c th dng vi Timer 3 chanel 2 (TIM3_CH2).


Bi v d ny s to xung PWM vi rng xung khc nhau trn cc chn PA6 v PA7, t
thay i c sng ca LED trn 2 chn ny.
u tin ta phi cu hnh 2 chn ny vi Mode AF_PP (chc nng thay th Alternative Function):
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6| GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
Sau l thit lp Timer, trc ht l khai bo 2 bin cu trc :
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef
TIM_OCInitStructure;
Cung cp xung nhp cho Timer3:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
Ta s khi to PWM vi tn s 100Hz, xung cp cho b Timer ny l 100MHz, xung nhp ca h
thng c nh ngha trong bin SystemCoreClock, nn gi tr Prescaler s l:
Prescaler = (uint16_t) (SystemCoreClock /100000) - 1;
c chu k PWM l 100Hz th ta thit lp tham s:
TIM_TimeBaseStructure.TIM_Period =1000-1;
Ch : 100MHz:1000Hz=100Hz( chu k ca xung PWM);
Nh vy on code khi to Timer l:
Prescaler = (uint16_t) (SystemCoreClock /100000) - 1;
TIM_TimeBaseStructure.TIM_Period =1000-1;
TIM_TimeBaseStructure.TIM_Prescaler = Prescaler;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
Ta ch dng lnh khi to l Timer m ln:
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
Sau khi khi to TIM_TimeBaseStructure, by gi ta s khi to cc chanel 1 v 2 thay i
rng xung PWM.
Khi to chanel 1:
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

TIM_OCInitStructure.TIM_Pulse =500;
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
Ch tham s:
TIM_OCInitStructure.TIM_Pulse =500;
trn ta khai bo: TIM_TimeBaseStructure.TIM_Period =1000-1; nn gi tr Pulse ny c th nhn gi
tr t 0 n 999, tng ng vi rng xung t 0 n 100%. chanel 1 ta dng rng xung l 50%,
Khi to chanel 2:
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse =200;
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
rng xung l 20%.
Ta cn lnh Timer bt u hot ng:
TIM_Cmd(TIM3, ENABLE);
Cui cng ta c on chng trnh hon thin nh sau:
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//////////////////////////////////////
Prescaler = (uint16_t) (SystemCoreClock /100000) - 1;
TIM_TimeBaseStructure.TIM_Period =1000-1;
TIM_TimeBaseStructure.TIM_Prescaler = Prescaler;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
///////////////////////
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse =500;

TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse =200;
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
/* TIM3 enable counter */
TIM_Cmd(TIM3, ENABLE);

Anda mungkin juga menyukai