分享到plurk 分享到twitter 分享到facebook

版本 81e0562fc0139d18e581329c825542a7dcdf579f

Pulse-width modulation(PWM)

Introduction

又稱pulse-duration modulation(PDM),是將類比信號轉為脈波的一種技術。

為何需要PWM?雖然類比電壓可直接用來控制,但類比電路控制信號容易隨時間漂移,功耗大。

.. image:: /pwm.png

如圖所示,PWM 電路主要功能是將輸入電壓的振幅轉換成脈衝寬度。一般轉換後脈波的週期固定,脈波的占空比(duty cycle)會依類比信號的大小而改變,可用來控制燈泡亮度、馬達轉速等等,脈波寬度越大燈泡亮度越亮、馬達轉速越快。

Implementation

PWM需要透過Timer來實現,STM32的Timer可分為以下幾種

  • 基本定時器(TIM6 和 TIM7)
  • 高級控制定時器(TIM1 和 TIM8)
  • 通用定時器(TIMx):具有測量輸入信號的脈衝長度、產生輸出波形和PWM的功能。
    • clock來源 : 內部clock(CK_INT)、外部clock模式1(TIx)、外部clock模式2(ETR)、內部觸發輸入(ITRx)。
    • CK_INT -> AHB Prescaler(/1、2、…、512) -> APB1 Prescaler(/1、2、4、8、16) or APB2 Prescaler(/1、2、4、8、16)。
    • Time Base Configuration :
    .. image:: /up mode.bmp

.. image:: /down mode.bmp


.. image:: /center aligned.jpg

- TIM_ClockDivision  - 採樣頻率基準,當連續採樣到N個有效電平時,才當作一次有效電平。
- TIM_Prescaler  -  將TIMxCLK除以(TIM_Prescaler+1)
- TIM_CounterMode  -  選擇計數模式
- TIM_Period  -  TIMx_ARR,counter 週期
  • 輸出脈波週期 = (TIM_Period+1) * (TIM_Prescaler+1) * (TIM_ClockDivision+1) / TIMxCLK
  • PWM configuration
    • TIM_OCMode - PWM模式
      • PWM 1 Mode : 在向上計數,TIMx_CNT<TIMx_CCRx時,輸出為1,否則輸出為0;在向下計數,TIMx_CNT>TIMx_CCRx時,輸出為0,否則輸出為1。
      • PWM 2 Mode : 在向上計數,TIMx_CNT<TIMx_CCRx時,輸出為0,否則輸出為1;在向下計數,TIMx_CNT>TIMx_CCRx時,輸出為1,否則輸出為0。
    • TIM_Pulse - TIMx_CCRx,脈衝寬度
    • TIM_OCPolarity - 設置輸出極性,例如:TIM_OCPolarity_High PWM輸出關閉時默認為低電位。

以LED為例:

.. image:: /timer.png

TIM_Prescaler = 499,TIM_ClockDivision=0,TIMxCLK=84MHz

輸出脈波週期 = (TIM_Period+1) * (TIM_Prescaler+1) * (TIM_ClockDivision+1) / TIMxCLK

       = (1999+1) * (499+1) * (0+1)/84000000 ≒ 0.012 s

0.012 s 遠小於人眼視覺暫留的時間(0.1~0.4s),因此上圖的PWM 2 duty cycle(75%)>PWM 1 duty cycle(25%),PWM 2 Mode看起來會比PWM 1 Mode亮。


Code_section

//====set pin enable========

GPIO_PinAFConfig(GPIOD, GPIO_PinSource12, GPIO_AF_TIM4); //將GPIO D12腳位與TIM4做連結

  • //設定LED(即Pin12 13 14 15) 用來做PWM
  • GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15;
  • GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //設定這些腳位PWM模式 為交流(高-低)
  • GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  • GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  • GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

  • TIM_ClockDivision //變數設定將clock做除頻

  • TIM_Period //設定週期數

  • TIM_Prescaler //

  • TIM_OutputState //設定Pin腳可以Output

  • TIM_Pulse //設定多少個脈衝以後做反應事件

  • TIM_OC1Init( TIM4, &TIM_OCInitStruct ); //設定Timer4的CH1初使化

  • TIM4->CCR1 //設定Timer幾個tik後發出脈衝

  • CCR與Period關係示意圖在不同模式下


Demo_Video

http://youtu.be/RHzLguvuOKY

http://youtu.be/guG6MdLIwfI

http://youtu.be/jJfebbbMDPw

Reference

http://zh.wikipedia.org/zh-tw/%E8%84%88%E8%A1%9D%E5%AF%AC%E5%BA%A6%E8%AA%BF%E8%AE%8A

http://ppt.cc/nIAF

http://www.google.com.tw/url?sa=t&rct=j&q=pwm&source=web&cd=10&cad=rja&ved=0CFMQFjAJ&url=http%3A%2F%2Fwww.vr.ncue.edu.tw%2Fesa%2Fa1001%2FPWM.pdf&ei=S3OoUO6pOafcmAWWiIGQDw&usg=AFQjCNE_7pw6paGQzH7kSwkwD2witqcC-A

http://hi.baidu.com/snic_k/item/0f045e3288e6683d2e20c42b

陈志旺(2012)。STM32 嵌入式微控制器快速上手。中國:电子工业出版社。