3. Trong chương trình ta thay đổi giá trị duty để làm thay đổi độ sáng led
1. Timer
TIM_CLK: clock cung cấp cho timer.
PSC (prescaler): là thanh ghi 16bits làm bộ chia cho timer, có thể chia từ 1 tới 65535
ARR (auto-reload register): là giá trị đếm của timer (16bits hoặc 32bits).
RCR (repetition counter register): giá trị đếm lặp lại 16bits.
+ Đếm với xung clock timer là bao nhiêu (Fc_timer – xác định qua TIM_Prescaler).
+ Đếm lên hay đếm xuống (TIM_CounterMode).
+ Đếm đến bao nhiêu (TIM_Period).
III. Ví dụ :
. Ví dụ cấu hình cho timer 3 trong stm32f1 tạo interrupt với 100ms
* Phân tích : ( lưu ý 1 giây = 1ms x 1000)
– Tần số cao nhất mà timer 3 trong stm32f1 đạt được là 72Mhz.
– Yêu cầu cần timer 3 tạo interrupt mỗi 100ms.
– Giả sử cần counter của timer đếm 100 lần để được 100ms và phát interrupt thì ta có :
– > Tần sô Fc_timer3 = (100ms x 100 clock) x 10 = 10.000 clock/ 1 giây (10Khz).
Kết quả :
+ TIM_Prescaler = (72000000/10.000 – 1); //Fc_timer là 10khz
+ TIM_Period = 100 lần – 1 = 99
– Giả sử cần counter timer đếm 1000 lần để được 100ms và phát interrupt thì tương tự :
->Tần số Fc_timer3 = (100ms x 1000 clock) x 10 = 100.000 clock/ 1 giây (100Khz)
Kết quả :
+ TIM_Prescaler = (72000000/100.000 – 1); //Fc_timer là 100khz
+ TIM_Period = 1000 lần – 1 = 999
2. PWM
Hai công thức từ phần hướng dẫn timer :
Bổ sung thêm công thức cho phần PWM :
* Chú ý : Khi set Timer Period bạn phải biết giá trị lớn nhất có thể của nó là bao nhiêu, ví dụ trong trường hợp timer 16 bit thì giá trị max là 65535 . Do đó nếu giá trị period lớn hơn giá trị max thì bạn có thể tăng Prescaler để giảm timer tick frequency khi đó Timer period sẽ giảm xuống.
* Phân tích : 3 bước cơ bản
– Tìm pwm_frequence : Độ rộng 1 chu kỳ pwm là 100uS nghĩa là 1 chu kỳ xung sẽ mất 100uS hay tần số của pwm là : 10kHz ( 10000xung/1giây)
– Tìm TIM_Prescaler : Như vậy tiếp theo ta cần tìm thông số Prescaler và TIM_Period để cấu hình cho timer, dựa vào công thức :
Timer_tick_frequence = Timer_default_frequence/(Prescaler+1)
Giả sử ta chọn Prescaler = 0 để cho tần số cho timer là cao nhất Timer_tick_frequence = 84000000/(0+1) = 84Mhz
– Tìm TIM_Period : Với pwm_frequence = 10kHz và Timer_tick_freq = 84Mhz ta tìm tiếp TIM_Period dựa vào công thức :
TIM_Period = (Timer_tick_frequence/PWM_frequence )-1 = (84000000/10000)-1 = 8399
3. Hàm
__HAL_TIM_SetAutoreload() --> Set lai ARR vaf Period
#define __HAL_TIM_SET_AUTORELOAD(__HANDLE__, __AUTORELOAD__) \
do{ \
(__HANDLE__)->Instance->ARR = (__AUTORELOAD__); \
(__HANDLE__)->Init.Period = (__AUTORELOAD__); \
} while(0)
__HAL_TIM_SET_COMPARE --> Set CCR Set the TIM Capture Compare Register value on runtime without calling another time ConfigChannel function.
#define __HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__) \
(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1 = (__COMPARE__)) :\
((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2 = (__COMPARE__)) :\
((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3 = (__COMPARE__)) :\
((__HANDLE__)->Instance->CCR4 = (__COMPARE__)))
2. Khai báo tần số và độ phân giải.
Sữa lôiz (72000000/(400*10000)) -1
- 1