Bài 06: PWM VỚI STM32F1

posted in: Vi điều khiển | 0

1. Giới thiệu về PWM

Pulse Width Modulation (PWM) là phương pháp điều chế độ rộng xung hay điều chỉnh giá trị cường độ điện áp ra tải. PWM thường được ứng dụng rộng rãi trong lĩnh vực điều khiển động cơ.

Một số khái niệm về PWM bao gồm:

  • Duty cycle : tỷ lệ phần trăm xung ở mức cao.
  • Period : là chu kì xung(bao gồm tổng thời gian mức cao + mức thấp). لعبة الروليت مجانا
  • Pulse width là giá trị của mức cao so với period. اربح المال من الالعاب
  • PTO là xung vuông có 50% thời gian cao, 50% thời gian thấp.
  • Biên độ xung: là giá trị điện áp của xung khi ở mức cao.

Công thức tính Duty cycle:

Duty cycle = pulse width x 100/period




2. PWM trong STM32F103C8T6

Vi điều khiển này có 4 Timer: TIM1, TIM2, TIM3, TIM4 để phát xung PWM. Mỗi kênh lại có 4 channel nhỏ, riêng Timer 1 có thêm 4 channel đảo. Với những ứng dụng điều chế PWM đơn giản, người ta thường sử dụng một trong 3 Timer còn lại. كازينو البحرين

3. Lập trình với thư viện ST

Trong bài này, mình sẽ dùng TIM2 – channle 4 để tạo xung PWM với Duty cycle là 75%

  • Cấp clock và cấu hình timer 2 channel 4
/*Cap clock*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	
/*Cau hinh chân*/
GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* cau hinh timer base */
TIM_TimeBaseStructure.TIM_Prescaler = 7199;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period = 9999;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  • Cấu hình chế độ PWM
 /* cau hinh channel4 o mode PWM */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 7500;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
	
  TIM_OC4Init(TIM2, &TIM_OCInitStructure);
  TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);
	
  TIM_ARRPreloadConfig(TIM2, ENABLE);
	
  /* cho phep TIM2 hoat dong */
  TIM_Cmd(TIM2, ENABLE);
  • Hàm điều chỉnh Duty cycle
TIM_SetComparex(TIMy,z); 

Hàm TIM_SetComparex(TIMy,z) được dùng để điều chỉnh độ rộng xung của kênh PWM đang cấu hình SetComparex tương ứng với channel x của TIMy với giá trị z. Như vậy để nếu để tạo được xung PWM 75% thì ta có công thức: Duty cycle = 7500/(9999 + 1)*100 = 75%

Lưu ý: Trong bài đã cấu hình pulse là 7500, nên không cần dùng hàm điều chỉnh này.

Link code mẫu

Trả lời

Email của bạn sẽ không được hiển thị công khai.